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