resources/images/dhlab-logo-nb.png

1.9. Sammenlign metadata#

from dhlab.api.dhlab_api import get_document_frequencies
from dhlab import Corpus, Counts, totals
import dhlab.nbtext as nb

1.9.1. Undersøk korpus med metadata#

En viktig metode i undersøkelse av metadata og tekster er grafer og nettverk.

Metadata er alt som er om teksten, fra forfatter til forlag. Også innholdsord kan sees på som metadata.

1.9.1.1. Bygg korpus#

Korpuset defineres med metadata som dewey, emneord, navn , år, etc. Her kan Webdewey være til god hjelp.

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

bøker = Corpus(
   doctype="digibok",
   freetext="krig OR krigen OR soldater",
   from_year=1950,
   to_year=2010,
   ddk="9%",
   lang='nob',
   limit=300
)
bøker.frame.loc[:, ["title", "authors", "year"]]
title authors year
0 Ett minutt av krigen : tjue nordmenn forteller Stølen , Oddvar 1969
1 Kampene om Narvik Waage , Johan 1961
2 Krigens Svalbard Fjærli , Eystein 1979
3 Vi ville ikke ha dem : statens behandling av d... Borgersrud , Lars 2005
4 " Unngå å irritere fienden - " : krigen i Norg... Borgersrud , Lars 1981
... ... ... ...
161 Krig og fred : 1660-1780 Sogner , Sølvi 2005
162 Niende april : de frivillige militære styrker Wilhelmsen , Aage A. ( Aage Adolf ) 1998
163 USA og den kalde krigen : en antologi med bidr... Williams , William Appleman / Pharo , Helge / ... 1972
164 Lille-Moskva : den glemte krigen Fjørtoft , Kjell 1983
165 Barn under krigen Nøkleby , Berit / Hjeltnes , Guri / Gullvåg , ... 2000

166 rows × 3 columns

1.9.1.2. Undersøk forskjeller#

1.9.1.2.1. Undersøk forskjeller internt i korpuset#

Her samler vi sammen alle bøkene i korpus og summerer. Men først la oss se på en del av korpuset som en dokument term matrise

# tar de fem første og henter frekvensene for alle bøkene

bøker_dtm = Counts(bøker.head(5))
bøker_dtm 
100003439 100526095 100515898 100036887 100422015
. 3949.0 2705.0 3376.0 2189.0 10821.0
, 3026.0 1782.0 3308.0 2127.0 13499.0
^ 2561.0 4.0 17.0 1.0 1.0
i 1482.0 964.0 1378.0 1326.0 5577.0
og 952.0 1641.0 1230.0 1324.0 4010.0
... ... ... ... ... ...
sktr 0.0 0.0 0.0 0.0 316.0
krigsbarn 0.0 0.0 0.0 0.0 364.0
RA 0.0 0.0 0.0 0.0 420.0
legg 0.0 0.0 0.0 0.0 433.0
SD 0.0 0.0 0.0 0.0 483.0

42198 rows × 5 columns

1.9.1.2.2. Visualiser med varmekart#

Et varmekart gjør det enklere å få øye på likhet og variasjon i tallene.

nb.heatmap(bøker_dtm.frame.head(10), color="#045599")
  100003439 100526095 100515898 100036887 100422015
. 3949.000000 2705.000000 3376.000000 2189.000000 10821.000000
, 3026.000000 1782.000000 3308.000000 2127.000000 13499.000000
^ 2561.000000 4.000000 17.000000 1.000000 1.000000
i 1482.000000 964.000000 1378.000000 1326.000000 5577.000000
og 952.000000 1641.000000 1230.000000 1324.000000 4010.000000
til 951.000000 719.000000 835.000000 466.000000 3939.000000
927.000000 288.000000 34.000000 134.000000 132.000000
en 902.000000 617.000000 482.000000 647.000000 2293.000000
var 859.000000 140.000000 901.000000 436.000000 3879.000000
de 825.000000 606.000000 520.000000 438.000000 2060.000000

1.9.1.3. Undersøk forskjeller med frekvenser fra bokhylla#

Vi teller opp tokens i korpuset med Counts. Dette kan ta litt tid.

count_corpus = Counts(bøker)

Referansekorpus Kommandoen under lager et referansekorpus av de 150 000 vanligste tokenene i vår samling.

totals = totals(150000)
# Summer tokens fra korpus
bøker_total = count_corpus.frame.sum(1).to_frame("count")
# Frekvensliste for korpus
bøker_total
count
, 1447361.0
. 1239985.0
^ 19453.0
og 456573.0
til 271849.0
... ...
Lovell 21.0
Oldereid 29.0
ZJIZJIN 45.0
BELJAEV 47.0
TITOV 92.0

606954 rows × 1 columns

For å lette arbeidet med å tolke forskjeller normaliserer vi frekvensene til tall mellom 0 og 1.

nb.normalize_corpus_dataframe(totals)
nb.normalize_corpus_dataframe(bøker_total)
True
forskjell = bøker_total.loc[:, "count"] / totals.freq
bøker_typiske_ord = forskjell.sort_values(ascending=False).to_frame("ratio")
bøker_typiske_ord.head(50)
ratio
løsl 4833.190733
ovf. 4008.252579
f.nr 3966.797430
Møllergata 755.385017
Østf 677.497177
Sachsenhausen 450.341807
Grini 393.216739
Falstad 341.167553
Hedm 311.771917
Telem 301.856473
f.m. 282.470624
Vestf 278.685051
Nordi 267.663267
Dachau 219.043036
Vollan 205.069268
Finnm 184.727016
gardsarbeider 174.649182
Ara 172.453373
freden 158.993578
Løfsnes 149.278587
ank. 127.089557
lagerarbeider 105.323230
Arr 104.760437
Milorg 104.653514
Soviet 103.704604
Busk 97.430041
An 96.689206
Hjemmefrontens 95.583670
SAK 81.029599
Falkenhorst 79.328393
Hjemmefronten 78.466168
Furubotn 75.899378
punds 75.745245
hausen 74.982654
Administrasjonsrådet 72.241541
Auschwitz 68.584370
Smst 67.231753
Wiking 66.845769
Wehrmacht 65.885264
Sipo 61.891449
Kristi- 60.810208
Terboven 57.830097
Tordenskiold 57.486035
42. 57.090582
43. 56.681139
tveit 56.098469
angivere 55.031767
kompanier 53.972696
NS-medlemmer 50.756165
dekknavn 50.696521

1.9.2. Visualiser som ordsky#

nb.cloud((bøker_typiske_ord/bøker_typiske_ord.sum()).head(50))
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[15], line 1
----> 1 nb.cloud((bøker_typiske_ord/bøker_typiske_ord.sum()).head(50))

File ~/prosjekter/DHLAB/dhlab/legacy/nbtext.py:1529, in cloud(df, column, top, width, height, background, file, stretch, font_path)
   1527     column = df.columns[0]
   1528 data = json.loads(df[column].to_json())
-> 1529 a_cloud = make_cloud(
   1530     data,
   1531     top=top,
   1532     background=background,
   1533     font_path=font_path,
   1534     stretch=lambda x: 2 ** (stretch * x),
   1535     width=width,
   1536     height=height,
   1537 )
   1538 draw_cloud(a_cloud, fil=file)

File ~/prosjekter/DHLAB/dhlab/legacy/nbtext.py:1493, in make_cloud(json_text, top, background, stretch, width, height, font_path)
   1491 pairs0 = Counter(json_text).most_common(top)
   1492 pairs = {x[0]: stretch(x[1]) for x in pairs0}
-> 1493 wc = WordCloud(
   1494     font_path=font_path,
   1495     background_color=background,
   1496     width=width,
   1497     # color_func=my_colorfunc,
   1498     ranks_only=True,
   1499     height=height,
   1500 ).generate_from_frequencies(pairs)
   1501 return wc

NameError: name 'WordCloud' is not defined