我正在使用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
答案 0 :(得分:4)
正如在另一个答案中所提到的,余弦相似度是1,因为两个字符串具有完全相同的表示。
这意味着这段代码:
tfidf_vectorizer=TfidfVectorizer()
tfidf_matrix=tfidf_vectorizer.fit_transform(documents)
生产,好吧:
print(tfidf_matrix.toarray())
[[ 1.]
[ 1.]]
这意味着两个字符串/文档(这里是数组中的行)具有相同的表示形式。
这是因为TfidfVectorizer
使用单词标记对您的文档进行标记,并且只保留至少2个字符的单词。
所以你可以做以下其中一件事:
使用:
tfidf_vectorizer=TfidfVectorizer(analyzer="char")
获得字符n-gram而不是字n-gram。
更改令牌模式,使其保留一个字母的标记:
tfidf_vectorizer=TfidfVectorizer(token_pattern=u'(?u)\\b\w+\\b')
这只是您在documentation中可以看到的默认模式的简单修改。请注意,我必须逃避正则表达式中的\b
次出现,因为我得到了一个空的词汇表'错误。
希望这有帮助。
答案 1 :(得分:0)
String1 =“K KAPOOR”,String2 =“L KAPOOR”这些字符串的余弦相似度得分为1(最大值),而两个字符串的名称完全不同。有没有办法修改它,以获得一些理想的结果。
取决于。您正面临一个问题,因为这两个字符串的矢量表示完全相同。
字符串之间的余弦相似度 1 ,因为它们相同。不是因为它们是相同的字符串,而是用相同的向量表示。
如果您希望它们与众不同,那么您需要将它们区分开来。为此,您需要使用在语料库中多次出现的足够单词来训练您的算法。
这两个字符串很可能在预处理中转换为类似'KAPOOR'的东西。