【问题标题】:Jaccard similarity in stringdist package to match words in character stringstringdist 包中的 Jaccard 相似度以匹配字符串中的单词
【发布时间】:2016-09-05 18:02:02
【问题描述】:

我想在 stringdist 函数中使用 Jaccard 相似度来确定词袋的相似度。据我所知,使用 Jaccard 仅匹配字符串中的字母。

c <- c('cat', 'dog', 'person')
d <- c('cat', 'dog', 'ufo')

stringdist(c, d, method='jaccard', q=2)
[1] 0 0 1

所以我们在这里看到它计算'cat'和'cat'、'dog'和'dog'以及'person'和'ufo'的相似度。

我还尝试将单词转换为 1 个长文本字符串。以下方法是我需要的,但它仍在计算 1 -(共享 2-gram 数/唯一 2-gram 总数):

f <- 'cat dog person'
g <- 'cat dog ufo'
stringdist(f, g, method='jaccard', q=2)
[1] 0.5625

如何通过单词计算相似度?

【问题讨论】:

  • 请更好地解释您想要的结果。第一个实例按顺序计算每个单词之间的差异。你有兴趣比较两个词袋(无序集)吗?

标签: r text stringdist


【解决方案1】:

您可以先对句子进行分词,然后对相应的单词列表进行哈希处理,将句子转换为整数列表,然后使用seq_dist() 计算距离。

library(hashr); library(stringdist)
f <- 'cat dog person'
g <- 'cat dog ufo'
seq_dist(hash(strsplit(f, "\\s+")), hash(strsplit(g, "\\s+")), method = "jaccard", q = 2)
[1] 0.6666667

【讨论】:

  • 这个措施也可以在 OP 的第一个例子中实现:wordSim &lt;- 1 - stringdist(c, d, method='jaccard', q=2); sum(wordSim) / length(wordSim)
  • 我认为对于 OP 给出的示例,是的。但通常它可能不正确。考虑这个例子c &lt;- c('cat', 'dog', 'person'); d &lt;- c('cat', 'dog', 'upon'); stringdist(c, d, method='jaccard', q=2); [1] 0.0000000 0.0000000 0.8571429
  • 这些是有趣的建议。谢谢你。我最初将 stringdist 包视为仅手动计算 Jaccard 相似度的更快替代方案:c &lt;- c('cat', 'dog', 'person') d &lt;- c('cat', 'dog', 'ufo') length(intersect(c, d)) / length(union(c,d))。看起来这个简单的方法是最好的。有趣的是,这有 1 表示最高相似度,而 stringdist 公式有 0 表示最高相似度。
  • @Psidom,我希望你能分享一些解决方案来解决我在使用 stringdistmatrix 时遇到的类似查询。我已经在stackoverflow.com/questions/42486172/… 上发布了与问题相同的问题,希望您能提供帮助!
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多