在 R 中使用 stringdist

Using stringdist in R

假设我有以下的话:

word1 = 'john lennon'
word2 = 'john lenon'
word3 = 'lennon john'

很明显这3个词指的是同一个人。具有以下代码:

library(stringdist)
>stringdist('john lennon','john lenon',method = 'jw')
[1] 0.06363636
>stringdist('john lennon','lennon john',method = 'qgram')
[1] 0
>stringdist('john lennon','lennon john',method = 'jw')
[1] 0.33
>stringdist('john lennon','john lenon',method = 'qgram')
[1] 1

很明显,在这个例子中 qgram 效果更好。但也仅此而已。我的问题是如何结合这两种方法?

jw 给出了更好的结果,但不能 'catch' 颠倒的词(在我的例子中,姓氏与姓氏)。有什么建议吗?

我的建议是一个两级方案,你可以在单词上匹配单词,在 "sentences" 上匹配 "sentences",可能只是尝试单词的所有组合。

是否允许白space删(johnlennon)由您决定。

您可以集成一个 "if" 语句,当且仅当 qgram 不等于 0 时,该语句将 运行 jw 方法。即 if(stringdist(('john lennon','john lenon',method = 'qgram')!=0){stringdist('john lennon','john lenon',method = 'jw')}

我有一个想法,在计算上似乎很昂贵,但至少它给出了相当不错的结果。

word1 = 'john lennon'
word2 = 'john lenon'
word3 = 'lennon john'

先去掉空格:

word1b = gsub(' ','',word1)
word2b = gsub(' ','',word2)
word3b = gsub(' ','',word3)

按字母顺序排列:

word1c = paste(sort(unlist(strsplit(word1b, ""))), collapse = "")
word2c = paste(sort(unlist(strsplit(word2b, ""))), collapse = "")
word3c = paste(sort(unlist(strsplit(word3b, ""))), collapse = "")

最后使用jw方法:

stringdist(word1c,word2c,method = 'jw')
[1] 0.03333333
stringdist(word1c,word3c,method = 'jw')
[1] 0
stringdist(word2c,word3c,method = 'jw')
[1] 0.03333333

满意的结果。 缺点:在小长度的单词中可能会产生不需要的结果。