基于R的相似词聚类

基于R的相似词聚类,r,text,cluster-analysis,data-science,R,Text,Cluster Analysis,Data Science,我正在使用R,我有两个数据帧。一个包含200000个单词,如“猫”、“猫”、“cts”、“狗”和“狗”,另一个包含“猫”和“狗”等单词 我想对第一个数据帧进行集群,并用适合第二个数据帧的单词替换所有相似的单词。例如,“猫”和“cts”变成“猫” 如@G5W所述,任务需要用户输入。下面是一个如何做到这一点的例子 # we have here pre-defined choices: any match must out of 'animals' animals <- c('cat','dog

我正在使用R,我有两个数据帧。一个包含200000个单词,如“猫”、“猫”、“cts”、“狗”和“狗”,另一个包含“猫”和“狗”等单词


我想对第一个数据帧进行集群,并用适合第二个数据帧的单词替换所有相似的单词。例如,“猫”和“cts”变成“猫”

如@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"
单词
cts
cats
cuts
的距离相等。假设这两个单词包含在匹配表
animals
中,那么在本例中,
哪个.min
将返回(默认情况下)最小值的第一个实例,因此我们将获得
cats


您可以看到这是如何产生问题的:假设
cts
被假定为
cuts
,上述将产生一个错误的值。

如@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"
单词
cts
cats
cuts
的距离相等。假设这两个单词包含在匹配表
animals
中,那么在本例中,
哪个.min
将返回(默认情况下)最小值的第一个实例,因此我们将获得
cats


您可以看到这是如何产生问题的:假设
cts
被假定为
cuts
,以上将产生一个错误的值。

谢谢您的提问

我现在不在家,正在我的iPhone上键入建议的解决方案,但我在家时会将其应用到您的示例中

转换类似值的方法是使用
agrep
功能。您不需要任何软件包,它已经在R中了

如果您需要具体示例,请留下评论:)

以下是功能:

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

谢谢你的提问

我现在不在家,正在我的iPhone上键入建议的解决方案,但我在家时会将其应用到您的示例中

转换类似值的方法是使用
agrep
功能。您不需要任何软件包,它已经在R中了

如果您需要具体示例,请留下评论:)

以下是功能:

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

这样做的第一步是定义你所说的相似性。看起来你正在考虑类似的拼写。为此,你应该看看Levenshtein距离。然而,这意味着“善”和“神”是相似的。“读”和“红”。你需要仔细思考你真正的意思。是的,我指的是拼写错误或使用复数。我想用所有实际的动物名称对它们进行分类,并将猫替换为猫,以创建一个带有单词“cat”频率的直方图。完全同意@G5W。这项任务并不容易,需要大量手动输入(以规则、匹配表等形式)。您可能想查看软件包
stringdist
,更重要的是查看可用的度量标准。您如何知道cts是CAT而不是cuts或cots?您应该提供一个最小的可复制示例。这样做的第一步是定义您所指的相似性。看起来你正在考虑类似的拼写。为此,你应该看看Levenshtein距离。然而,这意味着“善”和“神”是相似的。“读”和“红”。你需要仔细思考你真正的意思。是的,我指的是拼写错误或使用复数。我想用所有实际的动物名称对它们进行分类,并将猫替换为猫,以创建一个带有单词“cat”频率的直方图。完全同意@G5W。这项任务并不容易,需要大量手动输入(以规则、匹配表等形式)。您可能想查看软件包
stringdist
,更重要的是查看可用的指标。您如何知道cts是CAT而不是cuts或cots?您应该提供一个最小的可复制示例。非常感谢您的帮助。例如,我希望结果中不要包含lion这个词,因为它不属于第一个数据帧。非常感谢您的帮助。例如,我不想在结果中包含lion这个词,因为它不属于第一个数据帧。非常感谢!我想比较两个数据帧并创建一个新的数据帧(一个新列),这样我就可以计算单词cat的频率。非常感谢!我想比较两个数据帧并创建一个新的数据帧(一个新列),这样我就可以计算单词cat的频率。