データ分析や自然言語処理(NLP)の世界では、文字列の比較やマッチングが頻繁に登場します。例えば、ユーザーの入力ミスを補正したり、住所や人名の重複を検出したりする場面です。

そんな時に大活躍するのが、今回ご紹介するPythonライブラリjellyfishです。jellyfishは、様々な文字列の類似度を測るアルゴリズムをシンプルに提供してくれる非常に便利なツールです。

1. そもそも文字列の「類似度」ってどう測るの?

「文字列の類似度」と一口に言っても、実は様々な考え方があります。

  • 編集距離(Edit Distance): 一方の文字列をもう一方の文字列に変換するのに必要な操作(文字の挿入、削除、置換など)の回数で測る方法。
  • 音声アルゴリズム(Phonetic Algorithms): 文字列の見た目ではなく、発音が似ているかどうかで測る方法。
  • 集合の類似度: 文字列を文字の集合として捉え、共通の文字がどれだけ含まれているかで測る方法。

jellyfishは、これらの主要なアルゴリズムを網羅しています。

2. jellyfishでできること:主要なアルゴリズム

jellyfishが提供する代表的なアルゴリズムをいくつか見ていきましょう。

Levenshtein Distance(レーベンシュタイン距離)

最も広く使われている編集距離の一つです。2つの文字列がどれだけ似ているかを数値で表します。この距離が小さいほど、文字列は似ていると言えます。

Python

import jellyfish

s1 = "apple"
s2 = "aple"
# 文字'p'が削除されたと見なされ、距離は1
print(jellyfish.levenshtein_distance(s1, s2))
# 出力: 1

s3 = "book"
s4 = "back"
# 文字'o'と'c'が置き換えられたと見なされ、距離は2
print(jellyfish.levenshtein_distance(s3, s4))
# 出力: 2

Damerau-Levenshtein Distance(ダメラウ・レーベンシュタイン距離)

レーベンシュタイン距離に加えて、隣接する文字の「転置(transposition)」も1回の操作として数えるアルゴリズムです。タイポ(タイプミス)の検出に非常に有効です。

Python

s1 = "acb"
s2 = "abc"
# 'c'と'b'の転置のみで済むため、距離は1
print(jellyfish.damerau_levenshtein_distance(s1, s2))
# 出力: 1

Jaro-Winkler Similarity(ジャロ・ウィンクラー類似度)

文字列の先頭部分の一致を特に重視して類似度を計算するアルゴリズムです。人名や住所の比較など、文字列の冒頭が重要な場合に適しています。類似度は0.0から1.0の間の値で、1.0に近いほど似ていると判断されます。

Python

s1 = "martha"
s2 = "marhta"
# 文字列の先頭部分が一致しているため、高い類似度となる
print(jellyfish.jaro_winkler_similarity(s1, s2))
# 出力例: 0.961

Soundex & Metaphone

これらのアルゴリズムは、文字列を発音に基づいたコードに変換します。これにより、スペルが異なっていても発音が似ている単語を同じものとして扱えます。

Python

s1 = "Robert"
s2 = "Rupert"
# 'o'と'u'、'b'と'p'は発音が似ているため、同じコードになる
print(jellyfish.soundex(s1))
# 出力: R163
print(jellyfish.soundex(s2))
# 出力: R163

3. インストール方法

jellyfishのインストールはとても簡単です。

Bash

pip install jellyfish

まとめ

jellyfishは、文字列の類似度を測るための強力なライブラリです。levenshtein_distancejaro_winkler_similarityなどのメソッドを使えば、数行のコードで高度な文字列比較が実現できます。

スペルチェック機能の実装やデータクレンジング作業などで、文字列の比較が必要になった際は、ぜひjellyfishを試してみてください!


この記事が気に入ったら『目黒で働く分析担当の作業メモ』ご支援をお願いします!

※OFUSEに飛びます


おすすめの記事