Pythonでの文字列の距離や類似性


 

目次

1.TextDistanceのライブラリ
2.文字列の距離や類似性のアルゴリズム
2.1 編集ベース(Edit based)
2.2 トークンベース(Token based)
2.3 順序ベース(Sequence based)
2.4 圧縮ベース(Compression based)
2.5 音声ベース(Phonetic based)
2.6 シンプルアルゴリズム(Simple algorithm)

 

前回は距離と類似度について解説しました。今回の記事は文字列の距離や類似性を解説したいと思います。文字列類似性アルゴリズムは、ドメインに分類できます。

記事:距離と類似度の解説

1.TextDistanceのライブラリ

Pythonは文字列の距離を計算するTextDistanceのライブラリがあります。TextDistanceは多くのアルゴリズムによって2つ以上のシーケンス間の距離を比較するためのPythonライブラリです。

特徴:

・30以上のアルゴリズム

・純粋なPythonの実装

・簡単な使い方

・比較する3つ以上のシーケンス

・一部のアルゴリズムでは、1つのクラスに複数の実装があります。

・最高速度のためのオプションのnumpyの使用法。

 

ライブラリのインストール

!pip install textdistance

詳細:https://pypi.org/project/textdistance/

 

2.文字列の距離や類似性のアルゴリズム

 

2.1 編集ベース(Edit based)

編集ベースアルゴリズムは、ある文字列を別の文字列に変換するために必要な操作の数を計算しようとします。 操作の数が多いほど、2つの文字列間の類似性は低くなります。 この場合、文字列のすべてのインデックス文字に同等の重要性が与えられることに注意してください。

 

編集ベースアルゴリズムの一覧

AlgorithmClassFunctions
HammingHamminghamming
MLIPNSMlipnsmlipns
LevenshteinLevenshteinlevenshtein
Damerau-LevenshteinDamerauLevenshteindamerau_levenshtein
Jaro-WinklerJaroWinklerjaro_winkler, jaro
Strcmp95StrCmp95strcmp95
Needleman-WunschNeedlemanWunschneedleman_wunsch
GotohGotohgotoh
Smith-WatermanSmithWatermansmith_waterman

 

編集ベースアルゴリズムの例

print(textdistance.hamming.distance(‘test’, ‘text’))

print(textdistance.hamming.similarity(‘test’, ‘text’))

1

3

 

2.2 トークンベース(Token based)

トークンベースのアルゴリズムでは、期待される入力は完全な文字列ではなく、トークンのセットです。 アイデアは、両方のセットで同様のトークンを見つけることです。 共通トークンの数が多いほど、セット間の類似性が高くなります。 文字列は、区切り文字を使用して分割することでセットに変換できます。 このようにして、文を単語のトークンまたはn-gram文字に変換できます。 ここで、異なる長さのトークンは同じ重要性を持っていることになります。

 

トークンベースアルゴリズムの一覧

AlgorithmClassFunctions
Jaccard indexJaccardjaccard
Sørensen–Dice coefficientSorensensorensen, sorensen_dice, dice
Tversky indexTverskytversky
Overlap coefficientOverlapoverlap
Tanimoto distanceTanimototanimoto
Cosine similarityCosinecosine
Monge-ElkanMongeElkanmonge_elkan
Bag distanceBagbag

 

トークンベースアルゴリズムの例

tokens_1 = “hello world”.split()

tokens_2 = “world hello”.split()

print(textdistance.jaccard(tokens_1 , tokens_2))

 

tokens_1 = “hello new world”.split()

tokens_2 = “hello world”.split()

print(textdistance.jaccard(tokens_1 , tokens_2))

1.0

0.6666666666666666

 

2.3 順序ベース(Sequence based)

順序ベースアルゴリズムでは、類似性は2つの文字列間の共通のサブ文字列の要因です。 アルゴリズムは、両方の文字列に存在する最長のシーケンスを見つけようとします。これらのシーケンスが見つかるほど、類似度スコアが高くなります。 ここでは、同じ長さの文字の組み合わせも同じように重要であることに注意してください。

 

順序ベースアルゴリズムの一覧

AlgorithmClassFunctions
longest common subsequence similarityLCSSeqlcsseq
longest common substring similarityLCSStrlcsstr
Ratcliff-Obershelp similarityRatcliffObershelpratcliff_obershelp

 

順序ベースアルゴリズムの例

string1, string2 = ‘test’, ‘text’

print(textdistance.ratcliff_obershelp(string1, string2))

 

string1, string2 = “helloworld”, “worldhello”

print(textdistance.ratcliff_obershelp(string1, string2))

0.75

0.5

 

2.4 圧縮ベース(Compression based)

圧縮ベースアルゴリズムは、特性ではなく、ビットの配列として2つの文字列を比較します。

 

圧縮ベースアルゴリズムの一覧

AlgorithmClassFunction
Arithmetic codingArithNCDarith_ncd
RLERLENCDrle_ncd
BWT RLEBWTRLENCDbwtrle_ncd

 

AlgorithmClassFunction
Square RootSqrtNCDsqrt_ncd
EntropyEntropyNCDentropy_ncd
BZ2BZ2NCDbz2_ncd
LZMALZMANCDlzma_ncd
ZLibZLIBNCDzlib_ncd

 

圧縮ベースアルゴリズムの例

string1, string2 = ‘test’, ‘text’

print(textdistance.arith_ncd(string1, string2))

 

string1, string2 = ‘test’, ‘text’

print(textdistance.rle_ncd(string1, string2))

1.3333333333333333

1.0

 

2.5 音声ベース(Phonetic based)

音声アルゴリズムは、単一の単語の特定の音声表現を作成します。 通常、このような表現は、固定長、文字のみで構成される可変長文字列、または文字と数字の両方の組み合わせのいずれかです。

 

音声ベースアルゴリズムの一覧

AlgorithmClassFunctions
MRAMRAmra
EditexEditexeditex

 

音声ベースアルゴリズムの例

string1, string2 = ‘test’, ‘text’

print(textdistance.mra(string1, string2))

 

string1, string2 = ‘test’, ‘text’

print(textdistance.editex(string1, string2))

2

1

 

2.6 一般的なアルゴリズム(Simple algorithm)

一般的なアルゴリズムは、文字列の接頭辞、接尾辞、長さなどで類似性の計算です。

 

一般的なアルゴリズムの一覧

AlgorithmClassFunctions
Prefix similarityPrefixprefix
Postfix similarityPostfixpostfix
Length distanceLengthlength
Identity similarityIdentityidentity
Matrix similarityMatrixmatrix

 

一般的なアルゴリズムの例

string1, string2 = ‘test’, ‘text’

 

print(textdistance.prefix(string1, string2))

print(textdistance.postfix(string1, string2))

print(textdistance.length(string1, string2))

print(textdistance.identity(string1, string2))

print(textdistance.matrix(string1, string2))

te

t

0

0

0

 

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属