查找两个字符串(名称)之间的余弦相似度
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 个字符 的单词.
因此您可以执行以下操作之一:
使用:
tfidf_vectorizer=TfidfVectorizer(analyzer="char")
获取字符 n-gram 而不是单词 n-gram。
更改令牌模式,使其保留单字母令牌:
tfidf_vectorizer=TfidfVectorizer(token_pattern=u'(?u)\b\w+\b')
这只是您在 documentation 中看到的默认模式的简单修改。请注意,当我收到 'empty vocabulary' 错误时,我必须转义正则表达式中出现的 \b
。
希望对您有所帮助。
我正在使用 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 个字符 的单词.
因此您可以执行以下操作之一:
使用:
tfidf_vectorizer=TfidfVectorizer(analyzer="char")
获取字符 n-gram 而不是单词 n-gram。
更改令牌模式,使其保留单字母令牌:
tfidf_vectorizer=TfidfVectorizer(token_pattern=u'(?u)\b\w+\b')
这只是您在 documentation 中看到的默认模式的简单修改。请注意,当我收到 'empty vocabulary' 错误时,我必须转义正则表达式中出现的
\b
。
希望对您有所帮助。