汇总带有文档ID

时间:2018-09-07 15:45:49

标签: r text-mining tm corpus

我创建了一个类似于本文中的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

1 个答案:

答案 0 :(得分:0)

如果我查看您的预期输出,则无需使用此行代码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的速度要快得多,并且占用的内存更少,因为不需要先创建密集矩阵。