resources/images/dhlab-logo-nb.png

1.6. Frekvenslister#

Frekvenslister fra tekster kan danne utgangspunkt for mye informasjon om teksten.

Her bruker vi klassen Counts for å hente frekvensklister (absoluttfrekvenser) fra boka.

urner identifikator for boka i Nasjonalbibliotekets samling. Under eksempelfila om korpusbygging() finnes mer informasjon om hvordan man bygger et korpus. Urn finner man i bokas metadata, og de er på denne formen: https://urn.nb.no/URN:NBN:no-nb_digibok_2012051608012. Det er de 13 sifrene på slutten vi bruker her.

from dhlab import Counts, totals, Corpus
import dhlab.graph_networkx_louvain as gnl
import pandas as pd
import dhlab.nbtext as nb

1.6.1. Frekvensliste for enkeltbøker#

1.6.1.1. Kort sakprosabok#

urn = "URN:NBN:no-nb_digibok_2021011848587"
bok = Counts([urn])
bok.frame.iloc[:, 0]
,                 184
.                 162
og                 94
i                  93
det                51
                 ... 
motiverer           1
Tottes              1
trevter             1
kulturhistorie      1
u-ibsensk           1
Name: 100431574, Length: 1597, dtype: Sparse[int64, 0]

Vi kan sammenlikne frekvenslista for boka med et større korpus, som vi her legger i variabelen tot

tot = totals()

Vi lager en dataramme, nb.frame() for forholdet mellom frekvensene for ordene i vann og for de 50000 mest frekvente ordene i hele nb.no

(bok.frame.iloc[:, 0] / tot.iloc[:, 0]).sort_values(ascending=False).head(20)
Hedda           0.00005
def             0.00003
Ivo            0.000026
Skjønberg      0.000023
Claes          0.000019
Gill           0.000017
oppførelse     0.000016
teatrene       0.000016
VAN            0.000015
væsen          0.000013
Alten          0.000013
Rosenkrantz    0.000011
Kaas           0.000011
poetiske        0.00001
ensemblet       0.00001
Høst            0.00001
Jæger           0.00001
kontra         0.000009
Peggy          0.000009
Vauxhall       0.000009
dtype: Sparse[float64, nan]
tot
freq
. 7655423257
, 5052171514
i 2531262027
og 2520268056
- 1314451583
... ...
tidspunkter 110667
dirigenter 110660
ondartet 110652
kulturtilbud 110652
trassig 110651

50000 rows × 1 columns

1.6.1.2. Knausgårds Min kamp / Første bok#

min_kamp_1 = Counts(["URN:NBN:no-nb_digibok_2014032405041"])
min_kamp_1.frame.head(20)
100197175
, 14332
. 9480
og 5383
det 4430
jeg 4175
i 3657
var 3238
3152
- 2500
som 2463
en 2175
hadde 2010
ikke 1947
av 1900
den 1895
til 1815
med 1787
sa 1705
meg 1581
å 1575
(min_kamp_1.frame.iloc[:, 0] / tot.iloc[:,0]).sort_values(ascending=False).head(20).to_frame("ratio")
ratio
Yngve 0.000572
Farmor 0.000376
pappas 0.000231
farmor 0.000203
Ylva 0.00019
skrudde 0.000154
Jada 0.00013
Fløgstad 0.000119
helte 0.000114
koppen 0.000108
kroppene 0.000108
gitaren 0.000105
jævla 0.000105
rekkverket 0.000104
cola 0.000103
røykte 0.000101
sigaretten 0.000101
kløv 0.000097
faen 0.000094
stuen 0.00009

1.6.2. Sammenlikning av frekvens for ulike bøker#

# Frekvenslisiter for 20 Anne-Cath. Vestly bøker
vestly = Counts(
    Corpus(
        author="Anne*Vestly*",
        limit=20
    )
)
vestly.frame.head()
100464830 100463710 100019176 100527655 100046667 100031417 100503110 100541414 100542501 100109455 100194239 100224766 100226062 100233761 100236298 100371302 100421899 100429146 100657518 100682537
, 1926 6806 2148 2774 1291 837 2544 2492 2917 2446 2595 2583 332 366 399 58 50 2782 2052 1838
. 1636 4738 1960 2332 1246 1002 2347 1681 1962 1772 2117 2157 370 329 379 100 73 1951 2395 1997
« 1014 897 1103 1534 542 7 1233 1093 1229 923 1282 1170 187 151 218 20 41 1252 5 493
» 1005 895 1088 1533 544 8 1229 1095 1227 922 1287 1173 188 151 219 8 43 1252 3 492
6 917 2 820 0 0 2 1 0 0 0 0 1 1 1 1 2 0 0 1 8
# Vi kan legge på et varmekart for lettere å få oversikt

nb.heatmap(vestly.frame.head(20))
  100464830 100463710 100019176 100527655 100046667 100031417 100503110 100541414 100542501 100109455 100194239 100224766 100226062 100233761 100236298 100371302 100421899 100429146 100657518 100682537
, 1926 6806 2148 2774 1291 837 2544 2492 2917 2446 2595 2583 332 366 399 58 50 2782 2052 1838
. 1636 4738 1960 2332 1246 1002 2347 1681 1962 1772 2117 2157 370 329 379 100 73 1951 2395 1997
« 1014 897 1103 1534 542 7 1233 1093 1229 923 1282 1170 187 151 218 20 41 1252 5 493
» 1005 895 1088 1533 544 8 1229 1095 1227 922 1287 1173 188 151 219 8 43 1252 3 492
6 917 2 820 0 0 2 1 0 0 0 0 1 1 1 1 2 0 0 1 8
og 806 4929 816 1494 899 511 2042 1750 1741 1884 1372 1574 188 244 134 26 38 1618 1 1389
a 774 6 384 5 5 0 2 5 6 1 3 4 4 1 1 11 0 1 189 18
8 494 2 259 1 2 2 2 1 1 1 0 1 1 1 1 0 0 1 2 7
Ole 456 31 0 5 315 0 1 0 1 10 0 2 36 84 71 0 0 0 1 0
er 384 598 363 443 196 335 423 391 540 317 385 557 45 59 81 0 11 444 0 187
i 381 1767 529 466 320 223 531 445 588 520 381 542 79 65 74 84 8 494 918 694
jeg 381 2626 161 438 190 306 377 281 535 300 338 450 33 0 93 0 6 512 0 163
^ 361 36 687 1 1 4 2 0 0 0 15 2 0 2 0 68 0 0 12 245
var 353 2691 537 684 293 80 856 580 635 757 616 585 79 78 86 4 16 617 0 598
en 347 1377 461 341 245 134 402 337 444 438 339 418 45 0 56 6 10 376 1 401
det 342 2580 485 961 499 348 1019 747 983 845 819 944 134 141 127 6 6 866 0 667
333 1052 356 722 367 156 760 578 557 614 687 507 96 76 114 3 9 776 0 410
til 323 1449 389 470 240 187 521 365 548 449 381 559 71 79 69 8 8 410 0 358
sa 297 694 319 1019 263 21 845 722 776 624 833 716 107 62 132 8 24 797 0 247
ikke 293 1163 464 542 194 216 461 330 470 356 456 391 55 0 71 1 10 479 0 308

1.6.3. Frekvens for spesifikke termer#

def heatmap_loc(dr, ordliste, sorter=0):
    df = dr.loc[ordliste]
    return nb.heatmap(df.sort_values(by=df.columns[sorter], ascending=False))
# Her lager vi en funksjon heatmap_loc som vi bruker for å plukke ut enkelte ord fra korpuset som vi vil sammenlikne.


heatmap_loc(vestly.frame, "Mormor Morten Marte Ole Aleksander Guro Lillebror Knerten".split())
  100464830 100463710 100019176 100527655 100046667 100031417 100503110 100541414 100542501 100109455 100194239 100224766 100226062 100233761 100236298 100371302 100421899 100429146 100657518 100682537
Ole 456 31 0 5 315 0 1 0 1 10 0 2 36 84 71 0 0 0 1 0
Aleksander 243 22 0 5 310 0 0 0 0 10 0 1 88 85 92 0 0 0 0 0
Morten 0 6 0 1 0 0 0 45 55 2 0 72 0 0 0 0 1 0 100 10
Mormor 0 51 0 2 0 0 0 4 8 31 0 37 0 0 0 0 0 2 0 0
Marte 0 1 0 1 0 0 0 2 6 1 0 8 0 0 0 0 3 0 0 63
Guro 0 17 0 7 0 0 0 48 1 18 0 8 0 0 0 0 0 500 0 0
Lillebror 0 15 0 667 0 0 0 23 0 1 711 0 0 0 0 0 0 0 0 0
Knerten 0 20 0 435 0 0 0 17 0 6 427 0 0 0 0 0 0 1 0 0
# Er forfatteren konsekvent når det kommer til ordformer?

heatmap_loc(vestly.frame, "sola solen".split())
  100464830 100463710 100019176 100527655 100046667 100031417 100503110 100541414 100542501 100109455 100194239 100224766 100226062 100233761 100236298 100371302 100421899 100429146 100657518 100682537
sola 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0
solen 0 3 0 1 0 5 3 0 0 4 0 1 0 0 0 0 0 1 0 2