resources/images/dhlab-logo-nb.png

import dhlab as dh
from dhlab.api.dhlab_api import totals
import dhlab.nbtext as nb

1.5. Kollokasjoner#

Kollokasjoner er assosiasjoner.

I denne notebooken viser vi eksempler på undersøkelser man kan gjøre for å finne ut hvilke ord et ord opptrer sammen med innenfor et korpus.

1.5.1. Konstruer et korpus med Dewey#

Se eksempelfil om Korpusbygging for andre måter å definere korpus.

For å finne relevant dewey-klassifikasjon kan Webdewey være til god hjelp.

# korpus med inntil 50 bøker fra dewey 641 (mat og drikke) utgitt mellom 1960 og 2020

korpus = dh.Corpus(ddk="641*", doctype="digibok", limit=50)

For å se metadata fra korpuset som dataramme brukes metoden corpus. Man kan bruke head() for å begrense antall rader som vises.

korpus.corpus.head(2)
dhlabid urn title authors oaiid sesamid isbn10 city timestamp year publisher langs subjects ddc genres literaryform doctype ocr_creator ocr_timestamp
0 100423929 URN:NBN:no-nb_digibok_2008090500120 Poteten - tilbake på matbordet Vestjordet , Kjersti / Teslo , Kari Ensby / Ou... oai:nb.bibsys.no:990002494404702202 17b0306616529f18c580b2be3b06162d 19990101 1999 Hedmark bygdekvinnelag nob Poteter / kokebøker / poteter / matlaging 641.65 Faglitteratur digibok nb 20060101
1 100356654 URN:NBN:no-nb_digibok_2017111348571 Heimkunnskap : Arbeidsbok for 7. skuleåret Engeset , Jens Kåre / Løftingsmo , Arnt oai:nb.bibsys.no:999804494644702202 8d6ef383e3488bd44ba683cdb10fcf75 8209021222 Oslo 19760101 1976 Dreyer nno 641.5 Faglitteratur digibok nb 20060101

1.5.2. Lager kollokasjoner fra korpuset#

Et skrittvis eksempel.

  1. Bygg kollokasjonen

  2. Finn en referanse

  3. Sammenlign kollokasjon med referanse

1.5.2.1. Bygg kollokasjon#

Kommandoen er dh.Collocation. Legg gjerne inn en sjekk med konkordans.

collword = 'rødvin'
# Vi utfører en konkordans for å sjekke at korpuset virker.
# dh.Concordance(corpus=korpus, query="sei").show()
korpus.conc("sei").show()
  link concordance
32 URN:NBN:no-nb_digibok_2013061938125 ... Foruten lange ble det også brukt mye sei . Det var vanlig i Skåne , skriver Nils-Arvid Bringéus i « Matkultur...
11 URN:NBN:no-nb_digibok_2021082648534 ... Uer og sei er like gode som andre dyrere fiskeslag , så billigere fiskeslag konkurerer ofte med dyrere , men...
18 URN:NBN:no-nb_digibok_2021082648534 Sei og Hummermousse
29 URN:NBN:no-nb_digibok_2020030207067 elt sei
8 URN:NBN:no-nb_digibok_2014111948001 ... Men sei kan bli riktig spennende , som her sammen med spinat og ost - dette er noe som smaker...
45 URN:NBN:no-nb_digibok_2016030248063 BUFFET SEI
16 URN:NBN:no-nb_digibok_2008070400009 Sei og grønnsaker i ildfast form 16
39 URN:NBN:no-nb_digibok_2017111348571 Til 1 / 2 kg oppskoren torsk , sei , flyndre , hyse m.m.
40 URN:NBN:no-nb_digibok_2008070400009 Sei og grønnsaker i ildfast form 16 Salat mcd rester av kokt kjøtt 62
12 URN:NBN:no-nb_digibok_2020051248253 300 - 400 gram fisk ( sei , torsk , laks eller den fisken du får på fisketur ) 50...

Så kan vi hente ut selve kollokasjonen, dvs. ord som står innenfor en viss avstand fra målordet.

# Vi legger inn variablen collword som søkeord, med 5 ord før og etter. 
#  Antall ord før og etter kan endres etter konteksten man vil undersøke.
# Collword er lagt som variabel i cella over, slik at det er lett å gjenbruke notebooken for ulike søkeord

coll = korpus.coll(words=collword, after=5, before=5, samplesize=1000)
# For å vise topp `n` treff bruke .show().head(n)
coll.show().head(5)
counts
, 114
dl 109
og 99
. 82
2 67

Kollokasjonen ligger i en såkalt dataframe som kan undersøkes med .head() som ovenfor. Man får adgang til datarammen gjennom coll metoden.

coll.coll.sort_values(by="counts", ascending=False).head(10)
counts
, 114
dl 109
og 99
. 82
2 67
1 65
i 57
med 40
en 39
ss 37

1.5.2.2. Finn referanse#

Det er flere måter å sammenligne på. En er å bruke bokhylla selv om som referanse. For å hente ut ord fra bokhylla brukes kommandoen totals(<antall ord>). Korpuset selv kan også benyttes, for eksempel med kommandoen aggregate_urns(<korpusdefinisjon>).

1.5.2.2.1. Bokhylla aggregert#

totals inneholder råfrekvenser fra Nasjonalbibliotekets katalog.

tot = totals(50000)
tot.head()
freq
. 7655423257
, 5052171514
i 2531262027
og 2520268056
- 1314451583

1.5.2.2.2. Aggregert korpus#

# dh.Counts teller tokens i hver tekst i korpus
dokumenter_aggregert = korpus.count(words=None)
# Summerer slik at vi får totalt tokens for korpus
korpus_agg = dokumenter_aggregert.counts.sum(axis=1)

Gjør den om til dataramme, sorterer og ser på resultatet

  1. Dataramme med kommando frame()

  2. Sortering med frame_sort() definert øverst i den her notebooken.

korpus_agg = nb.frame_sort(nb.frame(korpus_agg))
korpus_agg.head(10)
0
. 99308
, 82920
og 65802
i 52622
med 26683
en 24396
til 23958
er 21703
av 21027
19945

1.5.2.3. Sammenlign#

Vi har nå tre frekvenslister som kan sammenlignes med hverandre. For å lette sammenlign normaliseres dem. Kommandoen for normalisering er normalize_corpus_dataframe(<frekvensliste>)

coll.coll.sort_values(by="counts", ascending=False)
counts
, 114
dl 109
og 99
. 82
2 67
... ...
Kutt 1
halwarm 1
Kraftig 1
hell 1
Lett 1

801 rows × 1 columns

coll_df = coll.coll.copy()
coll_df.sort_values(by="counts", ascending=False)
counts
, 114
dl 109
og 99
. 82
2 67
... ...
Kutt 1
halwarm 1
Kraftig 1
hell 1
Lett 1

801 rows × 1 columns

nb.normalize_corpus_dataframe(korpus_agg)
nb.normalize_corpus_dataframe(tot)
nb.normalize_corpus_dataframe(coll_df)
True

Inspiser dataene etter normalisering

1.5.2.3.1. Aggregert korpus#

Fyll inn verdier for .head() for å se mer.

korpus_agg.head()
0
. 0.053175
, 0.0444
og 0.035234
i 0.028177
med 0.014287

1.5.2.3.2. Bokhylla total#

tot.head()
freq
. 0.070908
, 0.046796
i 0.023446
og 0.023344
- 0.012175

1.5.2.3.3. Kollokasjonen#

coll.coll.head()
counts
! 3
" 3
% 9
' 5
( 18

Kollokasjonen coll har gjennomgående høyere verdier, noe som sannsynligvis skyldes at det er færre ord.

1.5.2.3.4. Utfør sammenligning#

For sammenligning måles forskjellen på coll med referansen. Forskjellen måles ved å dividere hvert ords frekvens ikollokasjonen på frekvensen ordet har i referansen.

\[\textrm{assosiasjons-styrke}(w) = \frac{\textrm{coll}(w)}{\textrm{referanse}(w)}\]

Divisjonen pr.ord gjøres av Python - resultat sorteres og legges i variabelen coll_assoc

coll_assoc = (coll_df.counts**1.0/tot.freq).sort_values(ascending=False).to_frame()
coll_assoc.head(20)
0
hvitvin 4392.133211
buljong 2863.445832
dl 1995.874219
eddik 1967.953125
Tilsett 1818.351907
finhakket 1220.278849
sitronsaft 1180.760540
rødvin 1052.418090
hakket 1010.737603
timian 769.001758
løken 757.419636
drinker 746.531766
hvitløk 738.892249
syrer 731.922228
terninger 674.171106
1,25 661.418678
selleri 658.619422
tomater 602.998751
sitron 600.152056
sennep 591.131058

1.5.2.3.5. 2.3.5. Sammenlign med korpus#

Her kan det være nyttig å bruke en eksponent for å dempe effekten av lavfrekvente ord.

korpus_agg
0
. 0.053175
, 0.0444
og 0.035234
i 0.028177
med 0.014287
... ...
svovlet 0.000001
tilrådes 0.000001
landbrukskonsernene 0.000001
fløytast 0.000001
slagteren 0.000001

105114 rows × 1 columns

coll_assoc_korp = (coll_df.counts**1.2/korpus_agg.iloc[:, 0]).sort_values().to_frame()
coll_assoc_korp.head(20)
0
du 0.027114
minutter 0.027221
fra 0.033615
dem 0.037363
om 0.050999
har 0.059707
° 0.07161
før 0.07787
ha 0.080935
C 0.082173
stor 0.085769
de 0.092365
Rør 0.094424
noen 0.094692
jeg 0.096839
små 0.097122
15 0.102312
alle 0.10269
bare 0.105088
kg 0.105154

1.5.3. Visualiser med en ordsky#

Visualiseringen trives best med tall mellom 0 og 1, så assosiasjonene divideres på summen av dem for å få til det. Ordskyene lages med kommonandoen cloud(<data>). Pass på å ikke ta med alt for mange; det kan gi feilsituasjoner.

# Her viser vi de 50 viktigste ordene som er assosiert med rødvin i korpuset vårt, målt mot alle bøker i nb.no 

nb.cloud(coll_assoc.head(50)/coll_assoc.sum())
../_images/77ed0b3894d4ade8ebea6cc1c20f219d6a251cba2ed3c70384d325ca8797ea54.png
# Her viser vi de 50 viktigste ordene som er assosiert med rødvin, målt mot hele "Drikkevare"-korpuset

nb.cloud(coll_assoc_korp.head(50)/coll_assoc_korp.sum())
../_images/9028980988e695df025a7673d74c11cf83402fb692d89eed3548fd04686659d0.png

1.5.4. Gjenbruk med andre ord og korpus#

  1. Bytt ut parametrene i cellen der korpus blir definert.

  2. Bytt ut ordet som er angitt som collword.

  3. Gå til Cell i menyen og velg Run All.

Det er også mulig å først velge File og Make a Copy, slik at man oppretter en ny notebook før man starter.

Tilbake til DHLAB ved Nasjonalbiblioteket