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 200 bøker fra dewey 641.2 (drikkevarer) utgitt mellom 1960 og 2020

korpus = dh.Corpus(ddk="641.2%", limit=200)

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 100368108 URN:NBN:no-nb_digibok_2018032348018 Ølboka : en guide til øl i Skandinavia Kvig , Jørn Idar Almås / Glomsrød , Jannicke S... oai:nb.bibsys.no:991427303864702202 d96494039ffb6a8e313aa5f33d593823 20140101 2014 Front nob Øl / norge / bryggerier 641.23 / 641.23 / 641.230948 / 641.23 Faglitteratur digibok nb 20060101
1 100418445 URN:NBN:no-nb_digibok_2020091507605 Ølbrygging fra hånd til munn Horne , Thomas / Eick , Colin / Platou , Eivin... oai:nb.bibsys.no:991321020564702202 8ac4b08ce32959794f2a030bd207100d 20130101 2013 Kagge nob Ølbrygging / ølbrygging / øltyper / øl / mat /... 641.873 / 641.23 / 641.23 / 663.42 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
2 URN:NBN:no-nb_digibok_2018031548126 vin til melstekt sei
1 URN:NBN:no-nb_digibok_2018031548126 ... den enkelte råvare og tilberedningsmetoden det handler om . Sei har en litt tyngre smak , ser litt gråere ut...
3 URN:NBN:no-nb_digibok_2020120907530 Bedales of Borough Market 5 Bedale St , London SEI 9 AL
0 URN:NBN:no-nb_digibok_2020112407621 Sjå Løksli de ligg no so fint fram mæ li , no sei dei at Knut vil te Mæland å...
5 URN:NBN:no-nb_digibok_2018031548126 Det er ikke uten grunn at melstekt sei går under betegnelsen seibiff . For seiv om seien er en hvit...
4 URN:NBN:no-nb_digibok_2018042548149 ... men O HVIT FISK , nesten alt går . Sei , hyse , kolje , kveite , hva som helst...
7 URN:NBN:no-nb_digibok_2020112407621 ... Ved Bull Run gik de reint gæli . " " Men sei me no du Jørn , håfør ha med denna krigen...
6 URN:NBN:no-nb_digibok_2020112407621 ... Så skulle ølet " skakast ned " , det vil sei fyllast over på tunna . Då smaka dei gjerne på ølet...

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
. 371
, 364
og 247
en 224
med 158

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
. 371
, 364
og 247
en 224
med 158
er 123
som 110
i 100
til 98
av 83

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
, 101992.0
. 100198.0
og 57767.0
i 46178.0
er 36294.0
som 28769.0
en 26301.0
av 26272.0
det 23581.0
med 23076.0

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
. 371
, 364
og 247
en 224
med 158
... ...
347 1
36 1
4.2 1
40 1
vår 1

1727 rows × 1 columns

coll_df = coll.coll.copy()
coll_df.sort_values(by="counts", ascending=False)
counts
. 371
, 364
og 247
en 224
med 158
... ...
347 1
36 1
4.2 1
40 1
vår 1

1727 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.048208
. 0.047361
og 0.027305
i 0.021827
er 0.017155

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
! 8
" 3
$ 1
% 5
' 2

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().to_frame()
coll_assoc.head(20)
0
han 0.047733
r 0.066077
' 0.069777
a 0.097654
m 0.118410
> 0.121947
alle 0.126860
6 0.130331
e 0.155172
7 0.160745
9 0.170787
0.182008
år 0.183651
kunne 0.186461
" 0.192506
» 0.206628
kom 0.209637
© 0.226078
får 0.226907
11 0.230753

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
, 4.820849e-02
. 4.736052e-02
og 2.730469e-02
i 2.182692e-02
er 1.715506e-02
... ...
wmfmm 4.726693e-07
4.726693e-07
zombier 4.726693e-07
vinvanskelig 4.726693e-07
visesanger 4.726693e-07

127719 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
100 0.017447
% 0.021806
han 0.024867
' 0.025543
alle 0.029087
30 0.033393
40 0.034091
g 0.035513
store 0.036165
hvor 0.037447
OG 0.039604
får 0.039936
0.040303
deg 0.042399
0.043664
° 0.043933
kunne 0.044690
noen 0.046052
C 0.046701
år 0.049013

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/2c05a2e3b498cbba4b3517bdc2d85315053dfd1439a5b3c63af4012ce63660cc.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/40515f0060e84be57b57f5861df697d347e14264d001efdded5127d2e4130c64.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