繁体   English   中英

使用sklearn如何计算文档和查询之间的tf-idf余弦相似度?

[英]Using sklearn how do I calculate the tf-idf cosine similarity between documents and a query?

我的目标是输入3个查询并找出哪个查询与一组5个文档最相似。

到目前为止,我已经计算了执行以下操作的文档的tf-idf

from sklearn.feature_extraction.text import TfidfVectorizer

def get_term_frequency_inverse_data_frequency(documents):
    allDocs = []
    for document in documents:
        allDocs.append(nlp.clean_tf_idf_text(document))
    vectorizer = TfidfVectorizer()
    matrix = vectorizer.fit_transform(allDocs)
    return matrix

def get_tf_idf_query_similarity(documents, query):
    tfidf = get_term_frequency_inverse_data_frequency(documents)

我现在遇到的问题是我有文件的tf-idf我在查询上执行哪些操作,所以我可以找到文件的余弦相似度?

这是我的建议:

  • 我们不必两次适合模型。 我们可以重用相同的矢量化器
  • 文本清理功能可以使用preprocessing属性直接插入TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

vectorizer = TfidfVectorizer(preprocessor=nlp.clean_tf_idf_text)
docs_tfidf = vectorizer.fit_transform(allDocs)

def get_tf_idf_query_similarity(vectorizer, docs_tfidf, query):
    """
    vectorizer: TfIdfVectorizer model
    docs_tfidf: tfidf vectors for all docs
    query: query doc

    return: cosine similarity between query and all docs
    """
    query_tfidf = vectorizer.transform([query])
    cosineSimilarities = cosine_similarity(query_tfidf, docs_tfidf).flatten()
    return cosineSimilarities

余弦相似度是表示文档的向量之间的角度的余弦。

K(X, Y) = <X, Y> / (||X||*||Y||)

你的tf-idf矩阵将是一个维度= no的稀疏矩阵。 文件*没有。 不同的词。

要打印整个矩阵,您可以使用todense()

print(tfidf.todense())

每行表示对应于一个文档的向量表示。 同样明智的是,每列对应于语料库中唯一单词的tf-idf得分。

在矢量和任何其他矢量之间,可以从tf-idf矩阵计算成对相似度:

from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(reference_vector, tfidf_matrix) 

输出将是length = no的数组。 指示您的参考向量与对应于每个文档的向量之间的相似性得分的文档。 当然,参考矢量与其自身之间的相似性将为1.总体而言,它将是介于0和1之间的值。

要找到第一个和第二个文档之间的相似性,

print(cosine_similarity(tfidf_matrix[0], tfidf_matrix[1]))

array([[0.36651513]])

你可以像Nihal在他的回复中写的那样做,或者你可以使用sklearn最近的邻居algo。 你必须选择适当的指标(余弦)

from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=5, metric='cosine')

其他答案非常有用,但并不完全是我所寻找的,因为它们没有帮助我转换我的查询,所以我可以将它与文档进行比较。

要转换查询,我首先将其适合文档矩阵:

queryTFIDF = TfidfVectorizer().fit(allDocs)

然后我将其转换为矩阵形状:

queryTFIDF = queryTFIDF.transform([query])

然后使用sklearn.metrics.pairwise.cosine_similarity函数计算所有文档和我的查询之间的余弦相似度

cosineSimilarities = cosine_similarity(queryTFIDF, docTFIDF).flatten()

虽然我意识到使用Nihal的解决方案,但我可以将我的查询作为其中一个文档输入,然后计算它与其他文档之间的相似性,但这对我来说最有效。

完整代码最终看起来像:

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

def get_tf_idf_query_similarity(documents, query):
    allDocs = []
    for document in documents:
        allDocs.append(nlp.clean_tf_idf_text(document))
    docTFIDF = TfidfVectorizer().fit_transform(allDocs)
    queryTFIDF = TfidfVectorizer().fit(allDocs)
    queryTFIDF = queryTFIDF.transform([query])

    cosineSimilarities = cosine_similarity(queryTFIDF, docTFIDF).flatten()
    return cosineSimilarities

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM