使用scikit-learn计算成对余弦相似度

时间:2016-06-16 02:56:28

标签: python machine-learning nlp scikit-learn

我是新手,所以如果有人能指出我正确的方向/帮我一些教程会很有帮助。 给出一个句子和其他句子的列表(英语):

s = "This concept of distance is not restricted to two dimensions."
list_s = ["It is not difficult to imagine the figure above translated into three dimensions.", "We can persuade ourselves that the measure of distance extends to an arbitrary number of dimensions;"]

我想计算列表和句子s中每个句子之间的成对余弦相似度,然后找出最大值。

到目前为止我得到了什么:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(norm='l2', min_df=0, use_idf=True, smooth_idf=False, sublinear_tf=True, tokenizer=tokenize)
bow_matrix = tfidf.fit_transform([s, ' '.join(list_s)])

1。下一步是什么?

2。在计算成对余弦相似度时,我们应该转换整个语料库还是只改变2个句子?

3。如何应用删除停用词和源代码?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您可能希望按如下方式转换文档

X = tfidf.fit_transform([s] + list_s) # now X will have 3 rows
  1. 下一步是什么?:你必须找到每一行tf-idf矩阵之间的余弦相似性。有关如何执行此操作,请参阅此post。为了直觉,您可以使用s距离计算list_scosine之间的距离。

    from scipy.spatial.distance import cosine
    cosine(X[0].toarray(), X[1].toarray()) # cosine between s and 1st sentence
    
  2. 我建议将整个语料库转换为tf-idf矩阵,因为模型也会生成词汇表,即你的向量将对应于这个词典。你不应该只改变2个句子。

  3. 您可以在创建tf-idf模型时添加stop_words='english'来删除停用词(即tfidf = TfidfVectorizer(..., stop_words='english'))。

  4. 对于词干分析,您可以考虑nltk来创建词干分析器。这是一种简单的方法来阻止你的文本。 (请注意,您可能还希望在阻止之前删除标点符号)

    from nltk.stem.porter import PorterStemmer
    stemmer = PorterStemmer()
    
    def stem(text):
        text_stem = [stemmer.stem(token) for token in text.split(' ')]
        text_stem_join = ' '.join(text_stem)
        return text_stem_join
    
    list_s_stem = list(map(stem, list_s)) # map stem function to list of documents
    

    现在,您可以在list_s_stem中使用此TfidfVectorizer代替list_s