Snowflakeの「JAROWINKLER_SIMILARITY」関数を試してみた

2022.06.01

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

Snowflakeには定期的に新しい関数が追加されていますが、今回は「JAROWINKLER_SIMILARITY」という面白い関数を見つけたので試してみようと思います。

なお、この関数は下記のドキュメントに記載のとおりバージョン「6.8」で導入されたようです。

前提

今回検証した環境はSnowflakeの下記バージョンの環境となります。

SELECT CURRENT_VERSION();
+-------------------+                                                           
| CURRENT_VERSION() |
|-------------------|
| 6.17.0            |
+-------------------+

ジャロ・ウィンクラー類似度(距離)とは?

今回試してみる関数のドキュメントはこちらです。

解説に記載のある通り、この関数は2つの文字列の類似度を0〜100(100が完全一致)返してくれる関数です。また、大文字と小文字については区別がされません。

この処理の細かい定義については数学的な話になるようですが、ざっくりとは「2つの文字列の先頭部分が一致していると、より類似度が高い」と判断されるロジックのようです。

また、用途としては文章内での単語の類似度から「タイピングミス」や「表記揺れ」を検出するために活用されるようです。

では早速、実際に試してみたいと思います。

試してみた

まずは、自分自身の名前のootaka同士を試してみます。

SELECT JAROWINKLER_SIMILARITY('ootaka','ootaka');
+-------------------------------------------+                                   
| JAROWINKLER_SIMILARITY('OOTAKA','OOTAKA') |
|-------------------------------------------|
|                                       100 |
+-------------------------------------------+

これは同じ文字なので100になりますね。全く違う文字列でも試してみます。

SELECT JAROWINKLER_SIMILARITY('ootaka','z');
+--------------------------------------+                                        
| JAROWINKLER_SIMILARITY('OOTAKA','Z') |
|--------------------------------------|
|                                    0 |
+--------------------------------------+

これは全く違う文字列なので0で納得です。

では次に、同じ部にいらっしゃる、たまにチャットの通知先などで間違えられることのあるootakiさんで試してみます。

SELECT JAROWINKLER_SIMILARITY('ootaka','ootaki');
+-------------------------------------------+                                   
| JAROWINKLER_SIMILARITY('OOTAKA','OOTAKI') |
|-------------------------------------------|
|                                        93 |
+-------------------------------------------+

納得の93ですね。私もたまに間違えそうになります。

今度は日本語でも試してみます。

SELECT JAROWINKLER_SIMILARITY('おおたかだいすけ','おおたかの森');
+-----------------------------------------------------------+                   
| JAROWINKLER_SIMILARITY('おおたかだいすけ','おおたかの森') |
|-----------------------------------------------------------|
|                                                        83 |
+-----------------------------------------------------------+

SELECT JAROWINKLER_SIMILARITY('おおたかだいすけ','おおさかだいすき');
+---------------------------------------------------------------+               
| JAROWINKLER_SIMILARITY('おおたかだいすけ','おおさかだいすき') |
|---------------------------------------------------------------|
|                                                            86 |
+---------------------------------------------------------------+

感覚的に「まあまあ似てるんじゃない?」と思われる文字は、高い値を出しますね。(面白いですね)

まとめ

以上、Snowflakeの「JAROWINKLER_SIMILARITY」関数を試してみました。

個人的に面白い関数だと思うので、なにか機会があったときに利用できたらと思います。

どなたかのお役に立てば幸いです。それでは!