我创建了一个类似于本文中的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
答案 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的速度要快得多,并且占用的内存更少,因为不需要先创建密集矩阵。