3

次のように、指定された入力文字列を使用して、データフレームの1列でソフトマッチを行う必要があります

col <- c("John Collingson","J Collingson","Dummy Name1","Dummy Name2")

inputText <- "J Collingson"
#Vice-Versa
inputText <- "John Collingson"

提供された列名「col」から「John Collingson」と「J Collingson」の両方を取得したい

親切に助けて

4

2 に答える 2

4

agrepほんの少しのデータしかない場合は、間違いなく迅速かつ簡単な基本 R ソリューションです。これが大規模なデータ フレームのおもちゃの例にすぎない場合は、より耐久性のあるツールに興味があるかもしれません。この 1 か月で、@PaulHiemstra が指摘したレーベンシュタイン距離 (これらの別の質問でも) について学んだことで、RecordLinkageパッケージにたどり着きました。ビネットは、特に複数のフィールドにわたる「ソフト」またはファジーな一致の例をもっと欲しがっていますが、質問に対する基本的な答えは次のようになります。

library(RecordLinkage)
col <- data.frame(names1 = c("John Collingson","J Collingson","Dummy Name1","Dummy Name2"))
inputText <- data.frame(names2 = c("J Collingson"))
g1 <- compare.linkage(inputText, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6) 
# id          names2 Weight
# 1  1    J Collingson       
# 2  2    J Collingson  1.000
# 3                          
# 4  1    J Collingson       
# 5  1 John Collingson  0.815

inputText2 <- data.frame(names2 = c("Jon Collinson"))
g1 <- compare.linkage(inputText2, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6)
# id          names2    Weight
# 1  1   Jon Collinson          
# 2  1 John Collingson 0.9644444
# 3                             
# 4  1   Jon Collinson          
# 5  2    J Collingson 0.7924825

compare.linkage() または compare.dedup() から始めてください。大きなデータ セットの場合は RLBigDataLinkage() または RLBigDataDedup() です。お役に立てれば。

于 2013-06-10T13:52:38.330 に答える
1

それagrepがあなたが探している機能のようです。それはありApproximate String Matching (Fuzzy Matching)ます。これは、何らかの距離尺度、つまり一般化されたレーベンシュタイン編集距離に従って、入力パターンに最も近い一致を返します。詳細については、を参照?agrepしてください。

agrep("J Collingson", col, value = TRUE)
[1] "John Collingson" "J Collingson"  
于 2013-06-10T05:19:48.263 に答える