Quanteda 的文档术语矩阵
Document-Term Matrix with Quanteda
我有一个具有这种结构的数据框 df :
Rank Review
5 good film
8 very goood film
..
然后我尝试使用 quanteda 包创建一个 DocumentTermMatris :
temp.tf <- df$Review %>% tokens(ngrams = 1:1) %>% # generate tokens
+ dfm %>% # generate dfm
+ convert(to = "tm")
我得到这个矩阵:
> inspect(temp.tf)
<<DocumentTermMatrix (documents: 63023, terms: 23892)>>
Non-/sparse entries: 520634/1505224882
Sparsity : 100%
Maximal term length: 77
Weighting : term frequency (tf)
Sample :
结构如下:
Terms
Docs good very film my excellent heart David plus always so
text14670 1 0 0 0 1 0 0 0 2 0
text19951 3 0 0 0 0 0 0 1 1 1
text24305 7 0 2 1 0 0 0 2 0 0
text26985 6 0 0 0 0 0 0 4 0 1
text29518 4 0 1 0 1 0 0 3 0 1
text34547 5 2 0 0 0 0 2 3 1 3
text3781 3 0 1 4 0 0 0 3 0 0
text5272 4 0 0 4 0 5 0 3 1 2
text5367 3 0 1 3 0 0 1 4 0 1
text6001 3 0 9 1 0 6 0 1 0 1
所以我认为这很好,但我认为:text6001、text5367、text5272 ...参考文档名称...
我的问题是这个矩阵中的行是有序的?或矩阵中的随机数?
谢谢
编辑:
我创建了一个文档术语频率:
mydfm <- dfm(df$Review, remove = stopwords("french"), stem = TRUE)
然后,我创建了一个 tf-idf 矩阵:
tfidf <- tfidf(mydfm)[, 5:10]
然后我想将 tfidf 矩阵合并到 Rank 列中以获得类似这样的东西
features
Docs good very film my excellent heart David plus always so Rank
text14670 1 0 0 0 1 0 0 0 2 0 3
text19951 3 0 0 0 0 0 0 1 1 1 2
text24305 7 0 2 1 0 0 0 2 0 0 4
text26985 6 0 0 0 0 0 0 4 0 1 5
你能帮忙做这个合并吗?
谢谢
行(文档)按字母顺序排列,这就是 text14670
在 text19951
之前的原因。转换可能对文档重新排序,但您可以使用
进行测试
sum(rownames(temp.tf) == sort(rownames(temp.tf))
如果不为 0,则它们未按字母顺序排列。
特征排序,至少在 quanteda dfm 中,来自它们在文本中的顺序。您可以使用 dfm_sort()
.
来解决这两个问题
在您的代码中,tokens(ngrams = 1:1)
是不必要的,因为 dfm()
会这样做,而 ngrams = 1
是默认值。
此外,您需要将其转换为 tm 对象吗?可能您需要的大部分内容都可以在 quanteda.
中完成
我有一个具有这种结构的数据框 df :
Rank Review
5 good film
8 very goood film
..
然后我尝试使用 quanteda 包创建一个 DocumentTermMatris :
temp.tf <- df$Review %>% tokens(ngrams = 1:1) %>% # generate tokens
+ dfm %>% # generate dfm
+ convert(to = "tm")
我得到这个矩阵:
> inspect(temp.tf)
<<DocumentTermMatrix (documents: 63023, terms: 23892)>>
Non-/sparse entries: 520634/1505224882
Sparsity : 100%
Maximal term length: 77
Weighting : term frequency (tf)
Sample :
结构如下:
Terms
Docs good very film my excellent heart David plus always so
text14670 1 0 0 0 1 0 0 0 2 0
text19951 3 0 0 0 0 0 0 1 1 1
text24305 7 0 2 1 0 0 0 2 0 0
text26985 6 0 0 0 0 0 0 4 0 1
text29518 4 0 1 0 1 0 0 3 0 1
text34547 5 2 0 0 0 0 2 3 1 3
text3781 3 0 1 4 0 0 0 3 0 0
text5272 4 0 0 4 0 5 0 3 1 2
text5367 3 0 1 3 0 0 1 4 0 1
text6001 3 0 9 1 0 6 0 1 0 1
所以我认为这很好,但我认为:text6001、text5367、text5272 ...参考文档名称... 我的问题是这个矩阵中的行是有序的?或矩阵中的随机数?
谢谢
编辑:
我创建了一个文档术语频率:
mydfm <- dfm(df$Review, remove = stopwords("french"), stem = TRUE)
然后,我创建了一个 tf-idf 矩阵:
tfidf <- tfidf(mydfm)[, 5:10]
然后我想将 tfidf 矩阵合并到 Rank 列中以获得类似这样的东西
features
Docs good very film my excellent heart David plus always so Rank
text14670 1 0 0 0 1 0 0 0 2 0 3
text19951 3 0 0 0 0 0 0 1 1 1 2
text24305 7 0 2 1 0 0 0 2 0 0 4
text26985 6 0 0 0 0 0 0 4 0 1 5
你能帮忙做这个合并吗?
谢谢
行(文档)按字母顺序排列,这就是 text14670
在 text19951
之前的原因。转换可能对文档重新排序,但您可以使用
sum(rownames(temp.tf) == sort(rownames(temp.tf))
如果不为 0,则它们未按字母顺序排列。
特征排序,至少在 quanteda dfm 中,来自它们在文本中的顺序。您可以使用 dfm_sort()
.
在您的代码中,tokens(ngrams = 1:1)
是不必要的,因为 dfm()
会这样做,而 ngrams = 1
是默认值。
此外,您需要将其转换为 tm 对象吗?可能您需要的大部分内容都可以在 quanteda.
中完成