【问题标题】:Summarizing R corpus with doc ID用文档 ID 总结 R 语料库
【发布时间】:2019-02-13 00:04:59
【问题描述】:

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

【问题讨论】:

  • 请在问题中添加一个小的预期输出。
  • 用预期结果更新了原始问题。

标签: r text-mining tm corpus


【解决方案1】:

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

要获得所需的输出,使用DocumentTermMatrix 比使用TermDocumentMatrix 稍微容易一些。无需切换列。我将向您展示如何获得结果的两个示例。一个带有来自 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 速度更快,并且使用的内存更少,因为不需要先创建密集矩阵。

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多