我在学习Part 1&;Part 2上的教程。不幸的是,作者没有时间在最后一节中使用余弦相似度来实际找到两个文档之间的距离。我在stackoverflow的以下链接的帮助下遵循了本文中的示例,其中包括上述链接中提到的代码(只是为了让生活更轻松)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
import numpy as np
import numpy.linalg as LA
train_set = ["The sky is blue.", "The sun is bright."] # Documents
test_set = ["The sun in the sky is bright."] # Query
stopWords = stopwords.words('english')
vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer
trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray
print 'Transform Vectorizer to test set', testVectorizerArray
transformer.fit(trainVectorizerArray)
print
print transformer.transform(trainVectorizerArray).toarray()
transformer.fit(testVectorizerArray)
print
tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()
由于上面的代码,我有下面的矩阵
Fit Vectorizer to train set [[1 0 1 0]
[0 1 0 1]]
Transform Vectorizer to test set [[0 1 1 1]]
[[ 0.70710678 0. 0.70710678 0. ]
[ 0. 0.70710678 0. 0.70710678]]
[[ 0. 0.57735027 0.57735027 0.57735027]]
我不知道如何使用这个输出来计算余弦相似度,我知道如何对两个长度相似的向量实现余弦相似度,但这里我不知道如何识别这两个向量。
在@excray的注释的帮助下,我设法找到了答案,我们需要做的实际上是编写一个简单的for循环来迭代表示列车数据和测试数据的两个数组。
首先实现一个简单的lambda函数来保存余弦计算公式:
然后只需编写一个简单的for循环来迭代to向量,逻辑是针对每个“对于trainVectorizerArray中的每个向量,必须找到与testVectorizerArray中的向量的余弦相似度”
输出如下:
我知道这是一个老职位。但我试过http://scikit-learn.sourceforge.net/stable/包。这是我的代码来寻找余弦相似性。问题是如何计算这个包的余弦相似性,这是我的代码
这里假设查询是train_set的第一个元素,而doc1、doc2和doc3是我希望借助余弦相似度对其进行排序的文档。那我就可以用这个代码了。
而且问题中提供的教程也非常有用。这是所有的零件 part-I,part-II,part-III
输出如下:
这里,1表示查询与自身匹配,另外三个是查询与相应文档匹配的分数。
首先,如果要提取计数特征并应用TF-IDF规范化和按行欧氏规范化,可以使用
TfidfVectorizer
在一个操作中完成:现在要找到一个文档(例如,数据集中的第一个文档)和所有其他文档的余弦距离,只需计算第一个向量和所有其他文档的点积,因为tfidf向量已经行规范化了。
正如Chris Clark在评论和{a1}余弦相似性中所解释的那样,没有考虑向量的大小。标准化的行的大小为1,因此线性核足以计算相似度值。
scipy稀疏矩阵API有点奇怪(不像密集的N维numpy数组那么灵活)。要获得第一个向量,需要对矩阵行进行切片,以获得具有一行的子矩阵:
scikit-learn已经提供了成对度量(用机器学习的术语来说,也称为内核),它既适用于向量集合的密集表示,也适用于向量集合的稀疏表示。在这种情况下,我们需要一个点积,也称为线性核:
因此,为了找到前5个相关文档,我们可以使用
argsort
和一些负数组切片(大多数相关文档具有最高的余弦相似度值,因此在排序索引数组的末尾):第一个结果是健全性检查:我们发现查询文档是最相似的文档,其余弦相似性分数为1,包含以下文本:
第二个最相似的文档是引用原始消息的回复,因此有许多常用词:
相关问题 更多 >
编程相关推荐