2017-12-09 10 views
0

文字列が他の文字列とどれだけ等しいかを調べるアルゴリズムを書いています。私はSklearnコサインの類似性を使用しています。文字列のSklearnコサイン類似度

私のコードは次のとおりです。

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_similarity 

example_1 = ("I am okey", "I am okeu") 
example_2 = ("I am okey", "I am crazy") 

tfidf_vectorizer = TfidfVectorizer() 
tfidf_matrix = tfidf_vectorizer.fit_transform(example_1) 
result_cos = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix) 
print(result_cos[0][1]) 

はプリント0.336096927276、example_1ためにこのコードを実行します。 example_2に対して実行すると、同じスコアが印刷されます。異なる単語が1つしかないので、結果は同じです。

私が欲しいのは、異なる単語 "okey vs okeu"には1つの異なる文字しかないため、example_1のスコアを上げることです。これとは対照的に、例2では、​​全く別の2つの単語 "okey vs crazy"があります。

いくつかのケースで異なる単語が完全に異なるわけではないことを私のコードがどのように考慮することができますか?

答えて

2

短い文字列の場合、Levenshtein distanceはおそらく単語に基づくコサイン類似度より良い結果をもたらすでしょう。以下のアルゴリズムはWikibooksに適合しています。これは距離メトリックなので、スコアが小さい方が良いです。

def levenshtein(s1, s2): 
    if len(s1) < len(s2): 
     s1, s2 = s2, s1 

    if len(s2) == 0: 
     return len(s1) 

    previous_row = range(len(s2) + 1) 
    for i, c1 in enumerate(s1): 
     current_row = [i + 1] 
     for j, c2 in enumerate(s2): 
      insertions = previous_row[j + 1] + 1 
      deletions = current_row[j] + 1 
      substitutions = previous_row[j] + (c1 != c2) 
      current_row.append(min(insertions, deletions, substitutions)) 
     previous_row = current_row 

    return previous_row[-1]/float(len(s1)) 

example_1 = ("I am okey", "I am okeu") 
example_2 = ("I am okey", "I am crazy") 

print(levenshtein(*example_1)) 
print(levenshtein(*example_2))         
+0

良い提案ですが、 'leven import levenshtein'より簡単です。 – FTP

+0

私の文字列は商品タイトルです。私は3つの異なる指標を組み合わせようとしています。 Levenshtein、cosine、jaro winkler、これらの3つの指標の平均を計算しています。 – nesi

関連する問題