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



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

e。g- 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

正如在另一个答案中提到的,余弦相似度是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")
    

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

  • 更改令牌模式,使其保留一个字母的令牌:

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

    这只是对文档中默认模式的一个简单修改。请注意,我必须在正则表达式中转义b的出现,因为我得到了一个"空词汇表"错误。

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

    视情况而定。您将面临一个问题,因为这两个字符串的向量表示完全相同。

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

    如果你想让它们不同,那么你需要用不同的方式来表示它们。要做到这一点,你需要用语料库中出现多次的足够多的词来训练你的算法。

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

    最新更新