2017-12-09 2 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에서 실행하면 동일한 점수를 인쇄합니다. 다른 단어가 하나뿐이기 때문에 결과는 두 경우 모두 동일합니다.

다른 단어 "okey vs okeu"에 다른 문자가 하나 있기 때문에 원하는 것은 example_1에 대해 더 높은 점수를 얻는 것입니다. 반면에 example_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, 코사인 및 jaro winkler, 나는이 3 가지 지표의 평균을 계산하고 있습니다. – nesi

관련 문제