【问题标题】:To find cosine similarity between two string(names)查找两个字符串(名称)之间的余弦相似度
【发布时间】:2015-12-05 09:06:55
【问题描述】:

我正在使用 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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    也就是说这段代码:

    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-gram 而不是单词 n-gram。

    1. 更改标记模式,使其保留单字母标记:

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

      这只是对您在documentation 中看到的默认模式的简单修改。请注意,我必须在正则表达式中转义出现的\b,因为我遇到了“空词汇”错误。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 2018-09-27
      • 2021-02-23
      • 2016-03-06
      • 2020-10-28
      • 2021-10-12
      相关资源
      最近更新 更多