結合カテゴリにあるファジーマッチツール、みなさんご存知かと思いますが、あいまい一致ができるツールです。
しかしながら使ってみると、Unicode文字を通さないということで日本語は使えません・・・。
ただ、データクレンジングを行う上で、単語のゆらぎは何かしら吸収したいものです。
ということで、Pythonのdifflibという標準のライブラリにSequenceMatcherという便利な関数があるので、これを使ってあいまい一致ができるマクロを作成してみました。
Similarity Match
https://community.alteryx.com/t5/Public-Community-Gallery/Similarity-Match/ta-p/935721
※Galleryからダウンロードできます
アルゴリズムとしては、「ゲシュタルトパターンマッチング」という方法を使っており、なんとなく人間の目からみたときに「正しい感じ」にマッチする傾向があるそうです。
ちょっと使ってみましょう。
例えば、次のようなインプットがあるとします。
このマクロはS(ソース)入力とT(ターゲット)入力がありますが、Sは1レコード目のみ、Tはすべてのレコードを入力すると、以下のような結果になります。
RecordIDは自動的にレコードにつけるようになっています。
MatchRatioは類似度です。1が完全一致です。
これが例としていいのかどうかはわかりませんが、0.9以上を一致とみなすのは「あり」かな、と思います。
他の例としては、
を同様に入力してみると、以下のようになります。
さすがに、Windows 10と Win10は同じとみなすのは苦しいでしょうか・・・。ただ、こちらも0.9以上であれば一致とみなして良いかもしれません。
いずれにしても、Windowsでまとめるなら0.5以上でまとめてもいいかもしれないですね・・・。
設定画面は以下のとおりです。
フィールド指定と、指定した閾値以上のものしか出力しないオプション(threshold of similarity)もつけています。
「output only records with the highest similarity ratio」は、一番類似度の高いレコードのみ出力するオプションです。同じ入力をSとT入力に入れると、自分自身しか返さないので気をつけてください。
ちなみに、Alteryx標準のファジーマッチツールは、レーベンシュタイン距離かジャロ距離に基づいて一致させているようです。レーベンシュタイン距離だとちょっと使いにくかったので今回利用したアルゴリズムのものを採用しています。
日本語の場合は、これにさらに半角・全角問題と、ひらがな・カタカナ問題があるのでそこは揃えてからやったほうがいいかもしれません。
なお、作ったものの活かせる場面に遭遇していないため、どういうアウトプットをすればいいのかというところで、えいや、でやっている部分があるので、アドバイス等いただければ幸いです(すでに一致度1は除くオプションは必要な気がしています・・・)。
流石です。👍
最近手入力が少なくなってきていますが、そういった手入力のデータの正確性チェックで使えるかと思います。
中国語文字で試したのですが、ちゃんと動いていますね。素晴らしいです。
@Qiu さん
テストありがとうございます。
類似度を1に近い値(0.95とか?0.9とか?)にすると些細な違いのものを拾ってくれそうです。
基本的にハッシュ化できれば言語は問わないとのことなので、言語関係なく使えるようです(ファジーマッチも他の言語に対応してほしいところですが、機能的にかなりUSに特化してるので、、、、)
@AkimasaKajitani さん、
ありがとうございます、これまでニーズに応えきれなかった日本語住所の名寄せにそのまま利用できそうです。