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.
Bygg kollokasjonen
Finn en referanse
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
Dataramme med kommando
frame()
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 |
på | 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.
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())

# 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())

1.5.4. Gjenbruk med andre ord og korpus#
Bytt ut parametrene i cellen der
korpus
blir definert.Bytt ut ordet som er angitt som
collword
.Gå til
Cell
i menyen og velgRun 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