resources/images/dhlab-logo-nb.png

import dhlab as dh
from dhlab.api.dhlab_api import totals
import dhlab.nbtext as nb
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 3
      1 import dhlab as dh
      2 from dhlab.api.dhlab_api import totals
----> 3 import dhlab.nbtext as nb

ModuleNotFoundError: No module named 'dhlab.nbtext'

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 100571871 URN:NBN:no-nb_digibok_2010032412009 Den magnetiske banankokeboka Steen , Gina oai:nb.bibsys.no:999619010474702202 0fe48491edba7d8a2b9120d0635aacb3 8258811541 [Oslo] 19950101 1995 Aventura nob / eng 641.64 Faglitteratur digibok nb 20060101
1 100029242 URN:NBN:no-nb_digibok_2010120808024 Tradisjonsmat fra nord . 2 : 114 matoppskrifte... oai:nb.bibsys.no:999726415724702202 8e240b51ba69e701785a2bc3d55238a3 8299418917 [Tromsø] 19970101 1997 Victus nob kokebøker / mattradisjoner / nord-norge 641.594843 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
57 URN:NBN:no-nb_digibok_2009021700049 Sei selges som filet ,
10 URN:NBN:no-nb_digibok_2009021700049 torskefikt ( hyse , sei ) kajennepepper
59 URN:NBN:no-nb_digibok_2009082700011 ... . 11. Food consumption . Ann . Acad . Sei . ferm . AV . 169 : 1 - 40...
33 URN:NBN:no-nb_digibok_2017010648152 ... 1700 Stekt sei , brun saus , poteter , vaniljepudding , jordbærsaus Kl . 2200 2 skiver brød m rekesalat...
8 URN:NBN:no-nb_digibok_2009021700049 Sei . Om sommeren er det størst forekomster
38 URN:NBN:no-nb_digibok_2016012548102 ... Vask og pill rekene , og fjern den mørke tarmen , sei , mulle K a K a J 500...
13 URN:NBN:no-nb_digibok_2011102605018 ... Det var tørrfisk som ble brukt , men også saltet torsk og sei ble ofte brukt , spesielt torskenakker egnet...
46 URN:NBN:no-nb_digibok_2021062448687 ... 57 Gammeldags sildesalat 14 Melboller 32 Sjokoladepletter 59 Gammelsaltet sei 13 Melkering 29 Smultringer 44 Glassmestersild 14 Middagspølse 39 Små...
52 URN:NBN:no-nb_digibok_2023030748125 ... Jeg fisket alt fra flyndre og kveite til sei og torsk . Interessen for og kunnskapen om råvarene fra sjøen...
16 URN:NBN:no-nb_digibok_2016012548102 kolje , torsk , sei , uer

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
dl 130
, 123
og 103
1 100
. 95

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
dl 130
, 123
og 103
1 100
. 95
2 83
i 60
ss 47
med 45
/ 40

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
. 110996
, 81221
og 69996
i 55908
med 28137
til 23496
en 22829
er 21912
20538
av 20474

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
dl 130
, 123
og 103
1 100
. 95
... ...
jeg 1
japansk 1
ja 1
Rein 1
Plomme 1

748 rows × 1 columns

coll_df = coll.coll.copy()
coll_df.sort_values(by="counts", ascending=False)
counts
dl 130
, 123
og 103
1 100
. 95
... ...
jeg 1
japansk 1
ja 1
Rein 1
Plomme 1

748 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.0561
, 0.041051
og 0.035378
i 0.028257
med 0.014221

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
! 1
% 1
' 2
( 16
) 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 2350.803006
dl 2293.312623
timian 1852.168867
Tilsett 1501.565860
konjakk 1350.283560
plommer 1039.702480
olivenolje 1008.837956
kjele 936.131202
pepper 804.357939
Mariner 796.114548
krydder 795.305956
buljong 788.195891
hakket 779.007518
sirup 727.853524
løk 722.895085
finhakket 705.380701
rødvin 675.943326
tørr 645.746589
selleri 634.523589
eddik 631.984947

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.0561
, 0.041051
og 0.035378
i 0.028257
med 0.014221
... ...
nødhjelpsmat 0.000001
steine- 0.000001
EYLL 0.000001
brødsaus 0.000001
pepperrotfamilien 0.000001

111164 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
har 0.026891
opp 0.037225
minutter 0.038755
men 0.041737
for 0.041761
om 0.043783
var 0.045263
at 0.054856
blir 0.058007
før 0.071289
ble 0.072577
være 0.07625
s 0.080353
varme 0.080776
^ 0.083784
' 0.084514
under 0.086093
når 0.087431
Den 0.089708
noen 0.091113

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/f4b6eb3c79d479f0a79940a175096fd3be3c31187751e20b44c95229aac3bfba.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/323193d70cb1705ed2e0784e230d76de4a3ac2161129f1269e75a01c9b08be15.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