找到两个字符串(名称)之间的余弦相似度

时间:2015-09-09 11:50:59

标签: python machine-learning scikit-learn cosine-similarity

我正在使用python和scikit-learn来查找两个字符串(特别是名称)之间的余弦相似性。该程序能够找到两个字符串之间的相似性得分,但是,当字符串缩写时,它会显示一些不良输出。

例如 - String1 =“K KAPOOR”,String2 =“L KAPOOR” 这些字符串的余弦相似度得分是1(最大值),而两个字符串是完全不同的名称。有一种方法可以修改它,以获得一些理想的结果。

我的代码是:

# -*- coding: utf-8 -*-
"""
Created on Wed Sep  9 14:40:21 2015

@author: gauge
"""
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
documents=("K KAPOOR","L KAPOOR")

tfidf_vectorizer=TfidfVectorizer()
tfidf_matrix=tfidf_vectorizer.fit_transform(documents)
#print tfidf_matrix.shape

cs=cosine_similarity(tfidf_matrix[0:1],tfidf_matrix)
print cs

2 个答案:

答案 0 :(得分:4)

正如在另一个答案中所提到的,余弦相似度是1,因为两个字符串具有完全相同的表示

这意味着这段代码:

tfidf_vectorizer=TfidfVectorizer()
tfidf_matrix=tfidf_vectorizer.fit_transform(documents)

生产,好吧:

print(tfidf_matrix.toarray())
[[ 1.]
 [ 1.]]

这意味着两个字符串/文档(这里是数组中的行)具有相同的表示形式。

这是因为TfidfVectorizer使用单词标记对您的文档进行标记,并且只保留至少2个字符的单词。

所以你可以做以下其中一件事:

  1. 使用:

    tfidf_vectorizer=TfidfVectorizer(analyzer="char")
    
  2. 获得字符n-gram而不是字n-gram。

    1. 更改令牌模式,使其保留一个字母的标记:

      tfidf_vectorizer=TfidfVectorizer(token_pattern=u'(?u)\\b\w+\\b')
      

      这只是您在documentation中可以看到的默认模式的简单修改。请注意,我必须逃避正则表达式中的\b次出现,因为我得到了一个空的词汇表'错误。

    2. 希望这有帮助。

答案 1 :(得分:0)

  

String1 =“K KAPOOR”,String2 =“L KAPOOR”这些字符串的余弦相似度得分为1(最大值),而两个字符串的名称完全不同。有没有办法修改它,以获得一些理想的结果。

取决于。您正面临一个问题,因为这两个字符串的矢量表示完全相同。

字符串之间的余弦相似度 1 ,因为它们相同。不是因为它们是相同的字符串,而是用相同的向量表示。

如果您希望它们与众不同,那么您需要将它们区分开来。为此,您需要使用在语料库中多次出现的足够单词来训练您的算法。

这两个字符串很可能在预处理中转换为类似'KAPOOR'的东西。