初めに
文章の類似度に minineedleを教えていただいたので触ってみます。ライブラリの内容を見る感じ タンパク質配列間などを記載があるので、生物系で使われているもの?なのかもしれません
(雑に書いたコードは)以下で試したコードを置いていますので、ご参考までに
開発環境
ライブラリのインストール
pip install minineedle pip install miniseq
minineedleで使用できるアルゴリズムについて
minineedleでは以下の二つのアルゴリズムを使うことができます。
それぞれのアルゴリズムについて簡単な説明は以下です
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