在 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
满意的结果。
缺点:在小长度的单词中可能会产生不需要的结果。
假设我有以下的话:
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
满意的结果。 缺点:在小长度的单词中可能会产生不需要的结果。