使用R聚类相似的单词

时间:2019-01-13 14:15:38

标签: r text cluster-analysis data-science

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

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

2 个答案:

答案 0 :(得分:1)

如@ 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中包含 two 字,那么在这种情况下which.min将返回(默认情况下)最小值的第一个实例,因此我们将获得cats

您会发现这可能会带来问题:假设cts应该是cuts,则上面的代码会产生错误的值。

答案 1 :(得分:1)

谢谢您的提问!

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

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

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

以下是功能:

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