2 Document term matrix
Source:vignettes/articles/2-Document-term-matrix.Rmd
2-Document-term-matrix.RmdAnalysis expects input data to be in numerical form. Here we provide two examples of how to convert text data from tabular form to matrix format: one using simple bag-of-words approach and two ways using ngrams, namely bigram and trigram.
Bag-of-Words representation
Pre processing aspol corpus and calculating document
term count (dtc) using bag-of-words representation (single word
as a basic unit). Single term per document per row.
bow <- aspol |>
preprocess_corpus(kunta) |>
count(kunta, LEMMA, name = "dtc")
bow
#> # A tibble: 48,269 × 3
#> kunta LEMMA dtc
#> <chr> <chr> <int>
#> 1 Enontekiö A#talo 3
#> 2 Enontekiö Vapaa#aika 1
#> 3 Enontekiö aiheuttaa 3
#> 4 Enontekiö aika 7
#> 5 Enontekiö aika#väli 1
#> 6 Enontekiö ajatella 1
#> 7 Enontekiö alhainen 1
#> 8 Enontekiö alku 1
#> 9 Enontekiö alku#peräinen 1
#> 10 Enontekiö alku#puoli 1
#> 11 Enontekiö alue 17
#> 12 Enontekiö antaa 3
#> 13 Enontekiö arava#laina 1
#> 14 Enontekiö arava#rajoitus 1
#> 15 Enontekiö arvioida 1
#> 16 Enontekiö asettaa 2
#> 17 Enontekiö asia 3
#> 18 Enontekiö asiakas 3
#> 19 Enontekiö asian#mukainen 1
#> 20 Enontekiö asua 5
#> # ℹ 48,249 more rowsConverting original corpus to document term matrix.
dtm <- bow |>
cast_dfm(document = kunta, term = LEMMA, value = dtc) # quanteda format
# cast_dtm(document = kunta, term = LEMMA, value = dtc) # tm format
dtm
#> Document-feature matrix of: 68 documents, 3,038 features (76.63% sparse) and 0 docvars.
#> features
#> docs A#talo Vapaa#aika aiheuttaa aika aika#väli ajatella alhainen alku alku#peräinen alku#puoli alue antaa arava#laina arava#rajoitus arvioida asettaa asia asiakas asian#mukainen asua
#> Enontekiö 3 1 3 7 1 1 1 1 1 1 17 3 1 1 1 2 3 3 1 5
#> Espoo 0 0 1 18 3 0 4 1 1 0 108 2 0 0 9 10 3 1 0 11
#> Eura 0 0 1 5 0 0 1 0 0 0 10 1 0 0 3 1 1 6 0 7
#> Hartola 0 1 2 5 0 0 0 0 0 0 4 0 0 0 3 0 0 0 0 6
#> Hattula 0 0 0 6 0 0 0 1 0 0 17 1 0 0 0 1 1 0 0 3
#> Helsinki 0 0 3 46 4 0 5 12 0 1 139 7 0 0 26 13 8 6 1 57
#> Huittinen 2 0 0 13 1 5 2 0 0 0 16 3 0 0 4 3 13 4 0 8
#> Hyvinkää 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 9
#> Hämeenlinna 0 3 3 1 0 0 0 1 0 0 18 3 0 0 2 0 29 3 0 10
#> Iitti 0 0 0 0 0 0 0 1 0 0 18 5 0 0 0 1 0 0 0 0
#> Imatra 0 0 0 2 0 0 0 0 0 0 6 0 0 0 2 0 1 0 0 11
#> Inkoo 0 0 1 11 1 0 1 2 0 0 26 4 0 0 0 5 2 0 0 3
#> Joensuu 0 0 1 33 2 1 4 4 1 0 129 2 0 1 9 13 5 4 0 25
#> Juva 0 0 2 13 5 0 2 3 0 0 19 2 1 0 1 2 2 3 0 10
#> Järvenpää 0 0 0 2 0 0 0 0 0 0 7 1 0 0 0 3 2 0 0 11
#> Kaarina 0 1 2 15 6 0 0 1 0 0 55 4 0 0 4 4 3 0 0 8
#> Kalajoki 0 0 0 1 0 0 0 0 0 0 5 0 0 0 2 0 0 0 0 0
#> Kauniainen 0 0 2 14 0 1 0 1 0 1 104 4 0 0 12 6 1 3 0 17
#> Kemiönsaari 0 3 3 12 1 1 1 3 2 0 136 14 0 0 3 3 1 2 0 8
#> Kerava 0 0 2 0 0 0 0 0 0 0 13 3 0 0 2 5 0 0 0 0
#> [ reached max_ndoc ... 48 more documents, reached max_nfeat ... 3,018 more features ]It is possible to convert from one format to another with
quanteda::convert() function. For example some functions
require data to be in tm format.
dtm |>
quanteda::convert(to = "tm")
#> <<DocumentTermMatrix (documents: 68, terms: 3038)>>
#> Non-/sparse entries: 48269/158315
#> Sparsity : 77%
#> Maximal term length: 27
#> Weighting : term frequency (tf)Ngrams
Bigram and trigram
ngram <- aspol |>
preprocess_corpus(kunta) |>
mutate(LEMMA2 = lead(LEMMA, default = "", n = 1),
LEMMA3 = lead(LEMMA, default = "", n = 2),
bigram = paste0(LEMMA, " ", LEMMA2),
trigram = paste0(LEMMA, " ", LEMMA2, " ", LEMMA3),
.by = kunta) # c(kunta, sent) limits the words to same sentence
count(ngram, bigram, sort = TRUE)
#> # A tibble: 105,111 × 2
#> bigram n
#> <chr> <int>
#> 1 asunto#poliittinen ohjelma 573
#> 2 huone huone 290
#> 3 kaupunki omistaa 193
#> 4 maa#poliittinen ohjelma 166
#> 5 henkilö henkilö 161
#> 6 kaupunki asunto#poliittinen 161
#> 7 ottaa huomio 151
#> 8 erityis#ryhmä asuminen 143
#> 9 kaupunki kaupunki 129
#> 10 tehostaa palvelu#asuminen 127
#> 11 kunta omistaa 123
#> 12 määrä kasvaa 116
#> 13 valtio tukea 112
#> 14 asuminen liittyä 109
#> 15 alue alue 107
#> 16 keskusta alue 83
#> 17 asunto#kunta määrä 81
#> 18 tukea asuminen 80
#> 19 luoda edellytys 79
#> 20 kestävä kehitys 78
#> # ℹ 105,091 more rows
count(ngram, trigram, sort = TRUE)
#> # A tibble: 160,720 × 2
#> trigram n
#> <chr> <int>
#> 1 huone huone huone 237
#> 2 kaupunki asunto#poliittinen ohjelma 134
#> 3 henkilö henkilö henkilö 100
#> 4 kaupunki kaupunki asunto#ohjelma 64
#> 5 asuminen rahoitus kehittämis#keskus 47
#> 6 Rivi ketju#talo asuin#kerros#talo 44
#> 7 erillinen pien#talo Rivi 44
#> 8 pien#talo Rivi ketju#talo 44
#> 9 asunto#poliittinen ohjelma luonnos 42
#> 10 asunto#poliittinen ohjelma päivä 40
#> 11 huone huone tuntematon 40
#> 12 ohjelma päivä hyvä 40
#> 13 kaupunki#seutu maa#poliittinen ohjelma 39
#> 14 maan#käyttö asuminen liikenne 39
#> 15 huone tuntematon huone 34
#> 16 kunta asunto#poliittinen ohjelma 34
#> 17 tuntematon huone huone 34
#> 18 kiinnittää erityinen huomio 28
#> 19 valtio tukea asunto#tuotanto 28
#> 20 yksikkö kaupunki asunto#poliittinen 25
#> # ℹ 160,700 more rows
ngram |>
count(kunta, bigram, name = "n") |>
cast_dfm(document = kunta, term = bigram, value = n)
#> Document-feature matrix of: 68 documents, 105,111 features (97.90% sparse) and 0 docvars.
#> features
#> docs A#talo kaksio A#talo kiinteistö A#talo yhteinen Vapaa#aika asuminen aiheuttaa asiakas aiheuttaa paine aiheuttaa suora aika houkutella aika huhtikuu aika kuntalainen aika raportointi aika tontti aika valmistua aika yhtiö aika#väli suunnittelu ajatella kokonais#taloudellinen alhainen kiinteistö alku tuoda alku#peräinen kunto alku#puoli vuokra#asunto
#> Enontekiö 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> Espoo 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
#> Eura 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hartola 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hattula 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Helsinki 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0
#> Huittinen 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hyvinkää 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hämeenlinna 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Iitti 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Imatra 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Inkoo 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Joensuu 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Juva 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0
#> Järvenpää 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kaarina 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
#> Kalajoki 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kauniainen 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kemiönsaari 0 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
#> Kerava 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> [ reached max_ndoc ... 48 more documents, reached max_nfeat ... 105,091 more features ]
ngram |>
count(kunta, trigram, name = "n") |>
cast_dfm(document = kunta, term = trigram, value = n)
#> Document-feature matrix of: 68 documents, 160,720 features (98.45% sparse) and 0 docvars.
#> features
#> docs A#talo kaksio kaksio A#talo kiinteistö perus#korjata A#talo yhteinen sauna Vapaa#aika asuminen lisääntyä aiheuttaa asiakas tulla aiheuttaa paine vuokra#asuminen aiheuttaa suora sähkö#lämmitys aika houkutella paikallinen aika huhtikuu alku aika kuntalainen matkailija aika raportointi konserni#johto aika tontti pari#talo aika valmistua pien#talo aika yhtiö tulla aika#väli suunnittelu tuottavuus ajatella kokonais#taloudellinen vaihto#ehto alhainen kiinteistö huono#kuntoinen alku tuoda paikka#kunta alku#peräinen kunto perus#korjata alku#puoli vuokra#asunto kysyntä
#> Enontekiö 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> Espoo 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Eura 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hartola 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hattula 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Helsinki 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Huittinen 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hyvinkää 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Hämeenlinna 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Iitti 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Imatra 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Inkoo 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Joensuu 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Juva 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Järvenpää 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kaarina 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kalajoki 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kauniainen 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kemiönsaari 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> Kerava 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#> [ reached max_ndoc ... 48 more documents, reached max_nfeat ... 160,700 more features ]