文章の類似度にminineedleを使って類似度測定を行う

初めに

文章の類似度に minineedleを教えていただいたので触ってみます。ライブラリの内容を見る感じ タンパク質配列間などを記載があるので、生物系で使われているもの?なのかもしれません

github.com

(雑に書いたコードは)以下で試したコードを置いていますので、ご参考までに

github.com

開発環境

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

pip install minineedle
pip install miniseq

minineedleで使用できるアルゴリズムについて

minineedleでは以下の二つのアルゴリズムを使うことができます。

  • Needleman-Wunsch wiki
  • Smith-Waterman wiki

それぞれのアルゴリズムについて簡単な説明は以下です

NeedlemanWunschアルゴリズム: グローバルアラインメントを行うアルゴリズムです。 2つの配列の全体を比較し、最適なアラインメントを見つけます。 動的計画法を用いて、配列間の類似性を最大化するアラインメントを計算します。 ギャップを挿入することで、配列の長さを調整しながらアラインメントを行います。 配列の先頭から末尾までを比較するため、配列全体の類似性を評価するのに適しています。 SmithWatermanアルゴリズム: ローカルアラインメントを行うアルゴリズムです。 2つの配列の部分配列間の類似性を見つけるのに適しています。 配列内の最も類似した領域を特定します。 ギャップを挿入することで、部分配列間の類似性を最大化するアラインメントを計算します。 配列全体ではなく、部分的に類似した領域を見つけるのに適しています。

文章を判定するのには、Needleman-Wunsch の方が適してそうです

複数の文章で実行

以下のいくつかの文章で実際に試してみます

from minineedle import needle, smith, core

def perform_alignment(seq1, seq2):
    alignment = needle.NeedlemanWunsch(seq1, seq2)
    alignment.align()
    score = alignment.get_score()
    identity = alignment.get_identity()
    
    print("Alignment of SEQUENCE 1 and SEQUENCE 2:")
    print(alignment)
    print("Score:", score)
    print("Identity:", identity)
    print()

# Test case 1: Short English sentences
seq1 = "The cat sat on the mat"
seq2 = "The dog sat on the rug"
perform_alignment(seq1, seq2)

# Test case 2: Longer English sentences
seq1 = "I love to eat pizza and pasta for dinner"
seq2 = "I enjoy eating sushi and ramen for lunch"
perform_alignment(seq1, seq2)

# Test case 3: Short Japanese sentences (Hiragana)
seq1 = "わたしはりんごがすきです"
seq2 = "わたしはバナナがすきです"
perform_alignment(seq1, seq2)

# Test case 4: Longer Japanese sentences (Hiragana and Kanji)
seq1 = "今日はいい天気です。散歩に行きましょう"
seq2 = "明日は雨が降るかもしれません。傘を持って行きましょう"
perform_alignment(seq1, seq2)

# Test case 5: Mixed English and Japanese sentences (Hiragana, Katakana, and Kanji)
seq1 = "I love to eat 寿司 and 天ぷら"
seq2 = "私は寿司とテンプラが大好きです"
perform_alignment(seq1, seq2)

# Test case 6: Japanese tongue twister (Hiragana and Katakana)
seq1 = "あめがあめあめあめがふるあめふるふるかあめてふるあめ"
seq2 = "アメガアメアメアメガフルアメフルフルカアメテフルアメ"
perform_alignment(seq1, seq2)

# Test case 7: Japanese proverb (Hiragana and Kanji)
seq1 = "猿も木から落ちる"
seq2 = "さるもきからおちる"
perform_alignment(seq1, seq2)

結果が以下のようになります

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        The cat sat on the mat
        The dog sat on the rug

Score: 10
Identity: 72.73

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        I love to- eat--- pizza and pasta for dinner
        I ---enjoy eating sushi and ramen for -lunch

Score: -2
Identity: 47.73

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        わたしはりんごがすきです
        わたしはバナナがすきです

Score: 6
Identity: 75.0

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        今日は-----いい天気です。--散歩に行きましょう
        明日は雨が降るかもしれません。傘を持って行きましょう

Score: -8
Identity: 34.62

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        I love to eat 寿司--- and 天ぷら
        ------------私は寿司とテンプラが大好きです

Score: -23
Identity: 7.41

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        あめがあめあめあめがふるあめふるふるかあめてふるあめ
        アメガアメアメアメガフルアメフルフルカアメテフルアメ

Score: -26
Identity: 0.0

Alignment of SEQUENCE 1 and SEQUENCE 2:
Alignment of SEQUENCE 1 and SEQUENCE 2:
        -猿も木から落ちる
        さるもきからおちる

Score: 1
Identity: 55.56