有没有办法将这样的数据框制作成术语文档矩阵?每个关键字由两个或多个单词组成。
示例数据
数据类型是数据框。
doc_id text
1 c('cat dog', 'cat rat')
2 c('cat dog')
3 c('cat rat')
期望的结果
我想得到这个结果。TermDocumentMatrix 函数已存在,不反映多字关键字。
Docs
Terms 1 2 3
cat dog 1 1 0
cat rat 1 0 1
使用tidyr
和tidytext
首先unnest
列表列,然后再用_
替换空格(您可以使用其他东西,但_
通常用于表示 n-gram(。这样,在生成 tdm 时,单词就不会分开:
library(dplyr)
library(tidyr)
library(tidytext)
library(stringr)
# bring toy data into useful form
df <- tibble::tribble(
~doc_id, ~text,
1, c('cat dog', 'cat rat'),
2, c('cat dog'),
3, c('cat rat')
)
tdm <- df %>%
unnest(text) %>%
mutate(text = str_replace(text, "\s+", "_")) %>% # replace whitespace
unnest_tokens(word, text) %>%
count(word, doc_id) %>%
cast_tdm(word, doc_id, n)
tdm
#> <<TermDocumentMatrix (terms: 2, documents: 3)>>
#> Non-/sparse entries: 4/2
#> Sparsity : 33%
#> Maximal term length: 7
#> Weighting : term frequency (tf)
要将其显示为常规矩阵:
tdm %>%
as.matrix()
#> Docs
#> Terms 1 2 3
#> cat_dog 1 1 0
#> cat_rat 1 0 1