【问题标题】:Clustering similar words using R使用 R 聚类相似的词
【发布时间】:2019-06-07 17:54:11
【问题描述】:

我正在使用 R 我有两个数据框。一个包含 200000 个单词,例如“cat”、“cats”、“cts”、“dogs”和“dog”,另一个包含 200000 个单词,例如“cat”和“dog”。

我想对第一个数据帧进行聚类,并将所有相似的单词替换为适合第二个数据帧的单词。例如,“cats”和“cts”变成“cat”。

【问题讨论】:

  • 这样做的第一步是定义相似性的含义。看起来您正在考虑类似的拼写。为此,您应该查看 Levenshtein 距离。然而,这将意味着“好”和“神”是相似的。 “阅读”和“红色”。您需要仔细考虑您的真正意思。
  • 是的,我的意思是拼写错误或使用复数形式。我想将它们与所有实际动物名称的数据框进行分类,并将猫替换为例如猫,以便创建具有单词“猫”的频率的直方图。
  • 完全同意@G5W。这项任务并不容易,需要大量手动输入(以规则、匹配表等形式)。您可能想查看 stringdist 包,更重要的是查看可用的指标。​​
  • 你怎么知道 cts 是猫而不是割伤或婴儿床?
  • 您应该提供一个最小的可重现示例。

标签: r text cluster-analysis data-science


【解决方案1】:

感谢您的提问!

我目前不在家,在 iPhone 上输入建议的解决方案,但我会在我在家时将其应用到您的示例中。

转换相似值的方法是使用agrep 函数。你不需要任何包,它已经在 R 中了。

如果您需要具体示例,请发表评论:)

这里是功能:

agrep(pattern, x, max.distance = 0.1, costs = NULL, ignore.case = FALSE, 
      value = FALSE, fixed = TRUE, useBytes = FALSE)

【讨论】:

  • 非常感谢!我想比较这两个数据框并创建一个新数据框(一个新列),以便我可以计算例如单词 cat 的频率。
【解决方案2】:

正如@G5W 所述,该任务需要用户输入。这是一个如何做到这一点的例子

# we have here pre-defined choices: any match must out of 'animals'
animals <- c('cat','dog','mouse')
# here is the text we want to match
text <- c('cats', 'cuts', 'dogs', 'dawg', 'frog', 'lion')
# now we use the string distance metric
# via the package stringdist & using metric 'jw'
# c.f. ?stringdist::stringdist
vapply(seq_along(text), 
       function (k) animals[which.min(stringdist::stringdist(text[k], animals, 'jw'))], 
       character(1))
# [1] "cat" "cat" "dog" "dog" "dog" "dog"

请注意,例如 liondog 匹配,因为这是最接近的匹配项。

为了进一步说明评论部分提出的观点,请考虑以下内容

stringdist::stringdist('cts', c('cats','cuts'), 'jw')
# [1] 0.08333333 0.08333333

单词ctscatscuts 等距。假设 两个 单词包含在匹配表animals 中,那么在这种情况下which.min 将返回(默认情况下)最小值的第一个实例,因此我们将获得cats

您会发现这会导致问题:假设 cts 应该是 cuts,以上将产生错误值。

【讨论】:

  • 非常感谢您的帮助。例如,我希望狮子这个词不要包含在结果中,因为它不属于第一个数据帧。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 2020-11-28
  • 2015-04-05
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2022-12-12
相关资源
最近更新 更多