
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
korpusblir definert.Bytt ut ordet som er angitt som
collword.Gå til
Celli 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