Advent of Code is now back for a limited time only! Complete as many challenges as you can to earn those badges you may have missed in December. Learn more about how to participate here!

ディスカッション

答えを見つけ、質問し、Alteryx の専門知識を共有してください。

文字列の類似度を計算する「類似マッチマクロ」を作ってみました

AkimasaKajitani
17 - Castor
17 - Castor

結合カテゴリにあるファジーマッチツール、みなさんご存知かと思いますが、あいまい一致ができるツールです。

しかしながら使ってみると、Unicode文字を通さないということで日本語は使えません・・・。

 

ただ、データクレンジングを行う上で、単語のゆらぎは何かしら吸収したいものです。

 

ということで、Pythonのdifflibという標準のライブラリにSequenceMatcherという便利な関数があるので、これを使ってあいまい一致ができるマクロを作成してみました。

 

Similarity Match

https://community.alteryx.com/t5/Public-Community-Gallery/Similarity-Match/ta-p/935721

※Galleryからダウンロードできます

 

アルゴリズムとしては、「ゲシュタルトパターンマッチング」という方法を使っており、なんとなく人間の目からみたときに「正しい感じ」にマッチする傾向があるそうです。

 

ちょっと使ってみましょう。

 

例えば、次のようなインプットがあるとします。

AkimasaKajitani_1-1653920077271.png

 

このマクロはS(ソース)入力とT(ターゲット)入力がありますが、Sは1レコード目のみ、Tはすべてのレコードを入力すると、以下のような結果になります。

 

RecordIDは自動的にレコードにつけるようになっています。

MatchRatioは類似度です。1が完全一致です。

AkimasaKajitani_2-1653920146386.png

これが例としていいのかどうかはわかりませんが、0.9以上を一致とみなすのは「あり」かな、と思います。

 

他の例としては、

AkimasaKajitani_3-1653920263754.png

を同様に入力してみると、以下のようになります。

 

AkimasaKajitani_0-1653919707379.png

さすがに、Windows 10と Win10は同じとみなすのは苦しいでしょうか・・・。ただ、こちらも0.9以上であれば一致とみなして良いかもしれません。

いずれにしても、Windowsでまとめるなら0.5以上でまとめてもいいかもしれないですね・・・。

 

設定画面は以下のとおりです。

 

AkimasaKajitani_4-1653920405991.png

 

フィールド指定と、指定した閾値以上のものしか出力しないオプション(threshold of similarity)もつけています。

「output only records with the highest similarity ratio」は、一番類似度の高いレコードのみ出力するオプションです。同じ入力をSとT入力に入れると、自分自身しか返さないので気をつけてください。

 

 

ちなみに、Alteryx標準のファジーマッチツールは、レーベンシュタイン距離かジャロ距離に基づいて一致させているようです。レーベンシュタイン距離だとちょっと使いにくかったので今回利用したアルゴリズムのものを採用しています。

 

日本語の場合は、これにさらに半角・全角問題と、ひらがな・カタカナ問題があるのでそこは揃えてからやったほうがいいかもしれません。

 

なお、作ったものの活かせる場面に遭遇していないため、どういうアウトプットをすればいいのかというところで、えいや、でやっている部分があるので、アドバイス等いただければ幸いです(すでに一致度1は除くオプションは必要な気がしています・・・)。

4件の返信4
Qiu
21 - Polaris
21 - Polaris

@AkimasaKajitani 

流石です。👍

最近手入力が少なくなってきていますが、そういった手入力のデータの正確性チェックで使えるかと思います。

中国語文字で試したのですが、ちゃんと動いていますね。素晴らしいです。

Macro.PNG

AkimasaKajitani
17 - Castor
17 - Castor

@Qiu さん

 

テストありがとうございます。

類似度を1に近い値(0.95とか?0.9とか?)にすると些細な違いのものを拾ってくれそうです。

 

基本的にハッシュ化できれば言語は問わないとのことなので、言語関係なく使えるようです(ファジーマッチも他の言語に対応してほしいところですが、機能的にかなりUSに特化してるので、、、、)

Shingo
Alteryx
Alteryx

@AkimasaKajitani さん、

ありがとうございます、これまでニーズに応えきれなかった日本語住所の名寄せにそのまま利用できそうです。

キャプチャ.PNG


Shingo Sakai

Sales Engineer
Alteryx, Inc.


AkimasaKajitani
17 - Castor
17 - Castor

@Shingo さま

 

はい、ぜひご活用いただければ、、、何か出力的にこういう形式が良い、などアドバイスあればお願いします・・・。

トップのソリューション投稿者