以下は、NLTK(Natural Language Toolkit)を利用した自然言語(英語)の類似性を調べるコードです

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer
import numpy as np

def cosine_similarity(v1, v2):
    """コサイン類似度を計算する関数"""
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

# NLTKのデータダウンロード
nltk.download('punkt_tab')  
nltk.download('punkt')
nltk.download('stopwords')

# 比較する2つの文章を設定する
text1 = "I like to eat apples. They are delicious."
text2 = "I love to eat bananas. They are sweet."

# 前処理
def preprocess(text):
    # トークナイズ
    words = word_tokenize(text)
    # ストップワード除去
    stop_words = set(stopwords.words('english'))
    words = [word for word in words if word not in stop_words]
    # ステミング
    stemmer = PorterStemmer()
    words = [stemmer.stem(word) for word in words]
    return words

# 前処理の実行
words1 = preprocess(text1)
words2 = preprocess(text2)

# 単語の頻度をカウントするベクトル化
from collections import Counter
vector1 = Counter(words1)
vector2 = Counter(words2)

# ベクトルをnumpy配列に変換
vector1 = np.array(list(vector1.values()))
vector2 = np.array(list(vector2.values()))

# コサイン類似度を計算
similarity = cosine_similarity(vector1, vector2)
print("コサイン類似度:", similarity)

▼出力結果(コサイン類似度の値が1に近いほど類似性のある文章)

[nltk_data] Downloading package punkt_tab to /root/nltk_data...
[nltk_data]   Unzipping tokenizers/punkt_tab.zip.
コサイン類似度: 0.9999999999999998
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data]   Package punkt is already up-to-date!
[nltk_data] Downloading package stopwords to /root/nltk_data...
[nltk_data]   Package stopwords is already up-to-date!

上記コードは英文のみ対応してます。

日本語を使う場合は、事前に分かち書きなどをする必要があるようで、MeCabやJanomeなどの解析器の利用が必要とのこと。

今回はそこまでやる気力がなかったので以上です。

おすすめの記事