使用文档 ID 总结 R 语料库

Summarizing R corpus with doc ID

我创建了一个类似于此 post:

中的 DocumentTermMatrix

Keep document ID with R corpus

我维护 doc_id 的地方,以便我可以将数据连接回更大的数据集。

我的问题是我不知道如何总结字数和字数并保持 doc_id。我希望能够仅使用 3 列 (doc_id, word, freq) 将此数据连接到现有数据集。

无需 doc_id,这很简单,我使用此代码获得最终结果。

df_source=DataframeSource(df)
df_corpus=VCorpus(df_source)
tdm=TermDocumentMatrix(df_corpus) 
tdm_m=as.matrix(tdm)

word_freqs=sort(rowSums(tdm_m), decreasing = TRUE)
tdm_sorted=data.frame(word = names(word_freqs), freq = word_freqs)

我已经尝试了几种不同的方法来解决这个问题,但就是无法让它发挥作用。这就是我现在所在的位置 (image)。我用过这段代码:

tdm_m=cbind("doc.id" =rownames(tdm_m),tdm_m)

将 doc_id 移动到矩阵中的列中,但无法对数字列求和并保持 doc_id 关联。

任何帮助,非常感谢,谢谢!

预期结果:

doc.id |词 |频率
1 |苹果 | 2
2 |苹果 | 1
3 |香蕉 | 4
3 |橙色 | 1
4 |梨 | 3

如果我查看你的预期输出,你不需要使用这行代码word_freqs=sort(rowSums(tdm_m), decreasing = TRUE)。因为这会创建单词的总和,例如 Apple = 3 而不是多个文档上的 2 和 1。

要获得您想要的输出,而不是使用 TermDocumentMatrix,使用 DocumentTermMatrix 会稍微容易一些。无需切换列。我将向您展示两个有关如何获得结果的示例。一个带有 reshape2 包中的 melt,一个带有 tidytext 包中的 tidy 函数。

# example 1
dtm <- DocumentTermMatrix(df_corpus)
dtm_df <- reshape2::melt(as.matrix(dtm))
# remove 0 values and order the data.frame
dtm_df <- dtm_df[dtm_df$value > 0, ]
dtm_df <- dtm_df[order(dtm_df$value, decreasing = TRUE), ]

或使用 tidytext::tidy 将数据整理成整齐的格式。无需删除 0 值,因为 tidytext 在将其转换为 data.frame

之前不会将其转换为矩阵
# example 2
dtm_tidy <- tidytext::tidy(dtm)
# order the data.frame or start using dplyr syntax if needed
dtm_tidy <- dtm_tidy[order(dtm_tidy$count, decreasing = TRUE), ] 

在我的测试中,tidytext 更快并且使用更少的内存,因为不需要首先创建密集矩阵。