2012-02-02 6 views
4

私は、別々に収集された同じ学生セットの名前の2つのリストを持っています。数多くの誤植があり、私はファジーマッチングを使用して2つのリストをリンクしています。私はagrepと同様の99 +%ですが、次の基本的な問題に取り組んでいます:どのように私は(例えば) "アドリアンブルース"と "ブルースエイドリアン" forenamesを一致させることができますか? Levenshteinの編集距離は、置換の数を数えているため、この特殊なケースではうまくいかない。Rの "Firstname Lastname"/"Lastname Firstname"の順序に依存しないファジーマッチング

これは非常に一般的な問題でなければなりませんが、私はそれに対処するための標準Rパッケージまたはルーチンを見つけることができません。私は何か明白な何かを見逃していると思います... ???

+0

@Ritchie Cottonが指摘しているように、3 +の名前、オプションのハイフネーションはどのように扱いますか? ''と ' - 'の両方に分けることができます。 'cat(sort(c( 'Smith'、 'John'))、collapse = '')は、 'John Smith''を返します。 – smci

+0

私はあなたにアルファベット順に名前タプルを並べ替えるだけで、 * "Firstname Lastname"/"Lastname Firstname" *で順序独立性を指定するタイトルを編集しました。より一般性が必要な場合は、再編集してください。 – smci

答えて

3

まあ、1つのかなり簡単な方法は言葉を交換し、再び一致させることです...

y=c("Bruce Almighty", "Lee, Bruce", "Leroy Brown") 
y2 <- sub("(.*) (.*)", "\\2 \\1", y) 

agrep("Bruce Lee", y) # No match 
agrep("Bruce Lee", y2) # Match! 
+0

sub - 私に少なくとももう1つの新しいコマンド。素晴らしい、トミーに感謝します。 –

+1

@JonathanBurley:非標準的な名前に注意してください。コードを 'c(" Lulu "、" Ho Chi Minh "、" Hugh Fearnley-Whittingstall "、NA)'に対してテストする必要があります。 –

+0

@JonathanBurley: 'grep、grepl、regexpr、gregexpr、regexec、sub、gsub'と' match/pmatch'(関連項目: 'charmatch'を参照)はすべて基本的に同じ基本コマンドです。 R言語が大好き!新しい世代のためのPHPのような感じ! – smci

0

私が通常使う技術はかなり堅牢で発注に対して比較的鈍感で、句読点など。それはに基づいています「nグラム」と呼ばれるオブジェクト。 n = 2の場合、「bigrams」。例:

"Adrian Bruce" --> ("Ad","dr","ri","ia","an","n "," B","Br","ru","uc","ce") 
"Bruce Adrian" --> ("Br","ru","uc","ce","e "," A","Ad","dr","ri","ia","an") 

各文字列には11のバイグラムがあります。そのうち9つは共通点です。したがって、類似度スコアは非常に高く、9/11または0.818であり、ここで1.000は完全一致である。

私はRにあまり慣れていませんが、パッケージが存在しない場合、この手法は非常に簡単にコーディングできます。文字列1のバイグラムをループし、文字列2に含まれる文字数を計算するコードを書くことができます。

関連する問題