【问题标题】:Calculate Jaccard similarity between each words in 2 vectors计算 2 个向量中每个单词之间的 Jaccard 相似度
【发布时间】:2017-04-09 18:48:57
【问题描述】:

我需要计算 2 个向量中每个单词之间的 Jaccard 相似度。一个字一个字。并提取最相似的词。

这是我的糟糕糟糕的慢代码:

txt1 <- c('The quick brown fox jumps over the lazy dog')
txt2 <- c('Te quick foks jump ovar lazey dogg')

words <- strsplit(as.character(txt1), " ")
words.p <- strsplit(as.character(txt2), " ")

r <- length(words[[1]])
c <- length(words.p[[1]])

m <- matrix(nrow=r, ncol=c)
for (i in 1:r){
  for (j in 1:c){
    m[i,j] = stringdist(tolower(words.p[[1]][j]), tolower(words[[1]][i]), method='jaccard', q=2)
  }
}

ind <- which(m == min(m))-nrow(m)
words[[1]][ind]

请帮我改进和美化这个大数据框的代码。

【问题讨论】:

  • “大”有多大,使用您的代码需要多长时间?
  • 试试这个sapply(words.p, function(x) mapply(stringdist, words, x, method='jaccard'))。这将直接为您提供一个您可以轻松检查的矩阵。

标签: r stringdist


【解决方案1】:

准备工作(在此处添加tolower):

txt1 <- c('The quick brown fox jumps over the lazy dog')
txt2 <- c('Te quick foks jump ovar lazey dogg')

words <- unlist(strsplit(tolower(as.character(txt1)), " "))
words.p <- unlist(strsplit(tolower(as.character(txt2)), " "))

获取每个单词的距离:

dists <- sapply(words, Map, f=stringdist, list(words.p), method="jaccard")

对于words 中的每个单词,找到与words.p 最接近的单词:

matches <- words.p[sapply(dists, which.min)]

cbind(words, matches)
              matches
 [1,] "the"   "te"
 [2,] "quick" "quick"
 [3,] "brown" "ovar"
 [4,] "fox"   "foks"
 [5,] "jumps" "jump"
 [6,] "over"  "ovar"
 [7,] "the"   "te"
 [8,] "lazy"  "lazey"
 [9,] "dog"   "dogg"

编辑:

要获得最佳匹配词对,首先需要选择words 中每个词到words.p 中所有词的最小距离:

mindists <- sapply(dists, min)

这将获得每个单词的最佳距离。然后你从words中选择距离最小的单词:

words[which.min(mindists)]

或者在一行中:

words[which.min(sapply(dists, min))]

【讨论】:

  • 谢谢!但我只想得到一个最好的词,在这种情况下,这是“快速”。怎么提取?
  • @Dennix 在答案中添加了一行关于如何做到这一点(在编辑之后)
  • @KarolisKoncevičius,感谢您的解决方案。我正在寻找类似但匹配的地址列表。所以我有一个包含大约 70K 不同地址的数据集和另一个包含大约 4 条 Lack 记录(40 万条)的大型数据集。我想将每个地址与查看地址单词的大型数据集进行匹配。我怎样才能做到这一点?我在链接上发布了一个问题,stackoverflow.com/questions/42486172/… 请帮忙!!
猜你喜欢
  • 2017-08-22
  • 2019-03-26
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2019-08-05
相关资源
最近更新 更多