根据多个数据框中的单词频率创建建议单词列表

Creating a list of suggested words based on frequency of words in multiple dataframes

所以我在 R 中有 3 个数据帧,每个数据帧都有单词和单词在文档中出现的频率(其中 df 表示)。我正在 R Shiny 中创建一个应用程序,用户可以在其中搜索单词,它 returns 是包含该单词的 pdf。所以我想添加功能,为用户提供基于其他数据框推荐的单词。

一个例子:

假设用户输入了单词 "examination"。单词 "examination" 存在于两个数据框中,因此它会从这些数据框中推荐单词,并且重复此过程,因此您可以根据我们拥有的数据框找到可能的最佳单词。我希望有一个包可以做到这一点,或者可以实现 PCA 或 LDA/QDA。

有什么想法吗?

这是要尝试的 3 个数据帧,但只有前 20 个条目

df1 <- structure(list(word = c("data", "summit", "research", "program", 
"analysis", "study", "evaluation", "minority", "federal", "department", 
"statistical", "experience", "business", "design", "education", 
"response", "sampling", "learning", "project", "review"), n = c(213L, 
131L, 101L, 98L, 90L, 84L, 82L, 82L, 76L, 72L, 65L, 63L, 60L, 
58L, 58L, 58L, 55L, 50L, 50L, 46L)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

df2 <- structure(list(word = c("regression", "sampling", "research", "forecast", 
"analysis", "development", "disparity", "firms", "impact", "office", 
"statistical", "experience", "sample", "support", "consulting", 
"provide", "contract", "technology", "result", "system"), n = c(113L, 
89L, 76L, 24L, 20L, 20L, 19L, 16L, 26L, 10L, 9L, 4L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

df3 <- structure(list(word = c("knowledge", "veteran", "association", "compliance", 
"random", "safety", "treatment", "analyst", "legal", "welfare", 
"selection", "solicitation", "tasks", "personnel", "student", 
"estimating", "investigation", "multivariate", "result", "system"), n = c(302L, 
300L, 279L, 224L, 199L, 180L, 156L, 112L, 101L, 100L, 100L, 67L, 56L, 
55L, 55L, 54L, 23L, 23L, 22L, 11L)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))


理想情况下,我希望 R 到 return 个词很可能与您已经输入的词在同一文档中。

Ideally I would like R to return words with a high probability of being in the same document as the one you have already entered.

如果您只是寻找单词的共现或相似性,您可能想看看 Word2Vec or Wikipedia2Vec- 您可以使用基于向量的方法对文本做一些有趣的事情。

但是:考虑到您在上面关于不使用字数统计的评论

what I am asking is if a user enters a word I would like to provide words that could also be helpful. This means returning words with high likelihood from the pdfs that the word they searched are in

我想你想要的可能会有所不同。我将您的问题解释为 用户有一个词 "orange",他想知道哪些文档包含相关概念,例如 "tree" 或 "juice" 或 "California" .

如果您正在寻找文档之间的相似性,那么您正在描述主题模型的用例。 Latent Dirichlet Allocation,最基本的主题模型,也简称为LDA,但不一样

LDA直觉

您可以将 LDA 视为非结构化文本数据的 PCA。

它从文档中提取 "latent" 主题" - 我不会在这里详细介绍,但本质上它会检查哪些词在不同的文档中不断出现,然后将它们分组到 "topics" .

示例:关于橙子的文档也更有可能包含 "tree" 或 "juice" 等词,而关于汽车的文档可能包含 "gasoline" 和 "motor" - 如果您使用足够大的文本集合,您将能够使用某种相似性度量(我会采用软余弦相似性)来区分关于橙汁文档中的拾取的文档,并且您将能够分辨出关于橙子的运输成本大约是两者兼而有之。重要的是,它还会将单词分配给主题,因此 "orange" 在 "oranges and related stuff" 主题中的负载较高,而在汽车主题中的负载较低 - 因为汽车和文章可能较少讨论颜色关于橙色物流可能很少见。

实施(非常粗略的指南)

假设我对您的项目所做的假设(主要是这就是您想要的并且您拥有原始文档,而且拆分成三个数据框并不重要),这是一种解决方法:

  1. 带上你的文件和 运行 LDA
  2. 编写一些代码,将一个词作为输入,然后 returns 加载该词的一些(比如 2-5)个主题,并说出该主题中的前 10 个词。或者,使用距离度量(即 Hellinger 来比较文档)。
  3. 完成。您还可以让用户获取整个文档并让算法找到相似的文档(见下文)。

野外应用

您可以查看 JSTOR Text Analyzer,它完全符合我对您的用例的解释。你上传了一个和它 returns 相似的文件。 (它使用 LDA)

套餐: 例如lda or topicmodels,还有其他有此功能的。

(旁注:首字母缩略词 LDA 是我偶然发现此 post 的原因...)