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

To find cosine similarity between two string(names)

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

例如- String1 ="K KAPOOR",String2="L KAPOOR" 这些字符串的余弦相似度得分为 1(最大值),而这两个字符串完全不同 names.Is 有办法修改它,以获得一些想要的结果。

我的代码是:

# -*- 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

String1 ="K KAPOOR", String2="L KAPOOR" The cosine similarity score of these strings is 1 (maximum) while the two strings are entirely different names. Is there a way to modify it, in order to get some desired results.

视情况而定。您遇到问题是因为这两个字符串的向量表示完全相同。

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

表示

如果你想让它们不同,那么你需要用不同的方式来表示它们。为此,您需要使用足够多的在语料库中多次出现的词来训练您的算法。

此外,这两个字符串很可能会在预处理中转换为类似 'KAPOOR' 的内容。

如另一个答案中所述,余弦相似度为 1,因为两个字符串具有 完全相同的表示形式

也就是说这段代码:

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

生产,嗯:

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

这意味着两个strings/documents(这里是数组中的行)具有相同的表示。

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

因此您可以执行以下操作之一:

  1. 使用:

    tfidf_vectorizer=TfidfVectorizer(analyzer="char")
    

获取字符 n-gram 而不是单词 n-gram。

  1. 更改令牌模式,使其保留单字母令牌:

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

    这只是您在 documentation 中看到的默认模式的简单修改。请注意,当我收到 'empty vocabulary' 错误时,我必须转义正则表达式中出现的 \b

希望对您有所帮助。