以下は、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などの解析器の利用が必要とのこと。
今回はそこまでやる気力がなかったので以上です。