0

次の言葉があるとしましょう。

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この例では、それがうまく機能することは明らかです。しかし、それはその場合だけです。私の質問は、これら2つの方法をどのように組み合わせることができますか?

jwより良い結果が得られますが、逆の単語を「キャッチ」できません(私の場合、名前と姓と姓)。何かアドバイス?

4

3 に答える 3

1

が0 でない jw場合にのみメソッドを実行する「if」ステートメントを統合できます。qgramif(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

私のアドバイスは、おそらく単語のすべての組み合わせを試すことによって、単語と単語、および「文」と「文」を一致させる2つのレベルのスキームです。

空白の削除を許可するかどうかは、あなた次第です (johnlennon)。

于 2015-12-14T10:06:02.210 に答える