TD-IDF查找新文档和数据集之间的余弦相似度

Moh*_*Oun 9 python machine-learning tf-idf scikit-learn

我有一个产品数据集的TF-IDF矩阵:

tfidf = TfidfVectorizer().fit_transform(words)
Run Code Online (Sandbox Code Playgroud)

这里的话是说明的列表。这将生成69258x22024矩阵。

现在,我想找到一个新产品与矩阵中的余弦相似度,因为我需要找到与其最相似的10个乘积。我使用与上面相同的方法对其进行矢量化。

但是,我不能将矩阵相乘,因为它们的大小不同(新的矩阵将是6个单词,所以是1x6的矩阵),因此我需要制作一个TFIDFVectorizer,其列数为原始列数。

我该怎么做?

Moh*_*Oun 13

我找到了一种工作方式。而不是使用fit_transform,您需要首先将新文档拟合到语料库TFIDF矩阵,如下所示:

queryTFIDF = TfidfVectorizer().fit(words)
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用转换函数将该向量“转换”为该矩阵形状:

queryTFIDF = queryTFIDF.transform([query])
Run Code Online (Sandbox Code Playgroud)

其中query是查询字符串。
然后,我们可以找到余弦相似度,并找到10个最相似/相关的文档:

cosine_similarities = cosine_similarity(queryTFIDF, datasetTFIDF).flatten()
related_product_indices = cosine_similarities.argsort()[:-11:-1]
Run Code Online (Sandbox Code Playgroud)


gle*_*oux 5

我认为words变量是模棱两可的。我建议您重命名wordscorpus

实际上corpus,在计算余弦相似度之后,您首先将所有文档放入变量中。

这是一个例子:

tf_idf.py:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

corpus = [
     'This is the first document.',
     'This is the second second document.',
     'And the third one.',
     'Is this the first document?',
]

vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
similarity_matrix = cosine_similarity(tfidf)
Run Code Online (Sandbox Code Playgroud)

ipython控制台中执行:

In [1]: run tf_idf.py

In [2]: words
Out[2]: ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

In [3]: tfidf.toarray()
Out[3]: 
array([[ 0.        ,  0.43877674,  0.54197657,  0.43877674,  0.        ,
         0.        ,  0.35872874,  0.        ,  0.43877674],
       [ 0.        ,  0.27230147,  0.        ,  0.27230147,  0.        ,
         0.85322574,  0.22262429,  0.        ,  0.27230147],
       [ 0.55280532,  0.        ,  0.        ,  0.        ,  0.55280532,
         0.        ,  0.28847675,  0.55280532,  0.        ],
       [ 0.        ,  0.43877674,  0.54197657,  0.43877674,  0.        ,
         0.        ,  0.35872874,  0.        ,  0.43877674]])

In [4]: similarity_matrix
Out[4]: 
array([[ 1.        ,  0.43830038,  0.1034849 ,  1.        ],
       [ 0.43830038,  1.        ,  0.06422193,  0.43830038],
       [ 0.1034849 ,  0.06422193,  1.        ,  0.1034849 ],
       [ 1.        ,  0.43830038,  0.1034849 ,  1.        ]])
Run Code Online (Sandbox Code Playgroud)

注意 :

  • tfidfscipy.sparse.csr.csr_matrix,请to_array转换为。numpy.ndarray(但价格昂贵,只需在此处查看内容即可)。
  • similarity_matrix是对称矩阵。

你可以做:

import numpy as np
print(np.triu(similarity_matrix, k=1))
Run Code Online (Sandbox Code Playgroud)

给予:

array([[ 0.        ,  0.43830038,  0.1034849 ,  1.        ],
       [ 0.        ,  0.        ,  0.06422193,  0.43830038],
       [ 0.        ,  0.        ,  0.        ,  0.1034849 ],
       [ 0.        ,  0.        ,  0.        ,  0.        ]]) 
Run Code Online (Sandbox Code Playgroud)

只看到有趣的相似之处。

见:

http://scikit-learn.org/stable/modules/generation/sklearn.metrics.pairwise.cosine_similarity.html
http://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction