我是新手,所以如果有人能指出我正确的方向/帮我一些教程会很有帮助。 给出一个句子和其他句子的列表(英语):
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)])
答案 0 :(得分:1)
首先,您可能希望按如下方式转换文档
X = tfidf.fit_transform([s] + list_s) # now X will have 3 rows
下一步是什么?:你必须找到每一行tf-idf矩阵之间的余弦相似性。有关如何执行此操作,请参阅此post。为了直觉,您可以使用s
距离计算list_s
和cosine
之间的距离。
from scipy.spatial.distance import cosine
cosine(X[0].toarray(), X[1].toarray()) # cosine between s and 1st sentence
我建议将整个语料库转换为tf-idf矩阵,因为模型也会生成词汇表,即你的向量将对应于这个词典。你不应该只改变2个句子。
您可以在创建tf-idf模型时添加stop_words='english'
来删除停用词(即tfidf = TfidfVectorizer(..., stop_words='english')
)。
对于词干分析,您可以考虑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