0

假设我有以下几句话:

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

几乎很清楚,这三个词指的是同一个人。具有以下代码:

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给出了更好的结果,但不能“抓住”颠倒的单词(在我的例子中,姓氏与姓氏)。有什么建议吗?

4

3 回答 3

1

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

于 2015-12-14T10:32:27.667 回答
0

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

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

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

于 2015-12-14T11:33:22.683 回答
-3

我的建议是一个两级方案,您可以在单词上匹配单词,在“句子”上匹配“句子”,可能只需尝试单词的所有组合。

是否允许删除空格由您决定 (johnlennon)。

于 2015-12-14T10:06:02.210 回答