如何创建用于检查句子相似性的矩阵模板?

时间:2018-09-29 09:34:21

标签: python scikit-learn text-mining tf-idf tfidfvectorizer

我是文本挖掘和python的新手,我正在尝试做一个简单的任务。 我想从句子创建TF矩阵: ['这是第一句话','这是第二句话','这是第三句话']

然后循环(或以某种方式)将新句子与此矩阵进行比较。

在stackoverflow上,我发现一个很好的示例,它可以正常工作,但就我而言,它将每次为示例句子和新句子计算TF矩阵。在大型数据集上,它的工作速度会变慢。

from sklearn.feature_extraction.text import TfidfVectorizer

vect = TfidfVectorizer()
text = []
text = ['This is the first sentence','This is the second sentence', 'This is the third sentence']
text.append('new sentence')
tfidf = vect.fit_transform(text)

# Get an array of results
results = ( tfidf * tfidf.T ).A

我想知道如何以其他更准确的方式进行操作,谢谢。

1 个答案:

答案 0 :(得分:0)

我们首先适合原始句子

from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer()
text = ['This is the first test ','This is the sentence', 'this is a third sentence']
vect.fit(text)

tfidf = vect.transform(text).A
>>> tfidf
array([[0.55249005, 0.32630952, 0.        , 0.55249005, 0.42018292,
    0.        , 0.32630952],
   [0.        , 0.43370786, 0.55847784, 0.        , 0.55847784,
    0.        , 0.43370786],
   [0.        , 0.39148397, 0.50410689, 0.        , 0.        ,
    0.66283998, 0.39148397]])

然后用它来转换新的:

new = vect.transform(['this sentence 1','new sentence 2']).A
>>> new
array([[0.        , 0.        , 0.78980693, 0.        , 0.        ,
        0.        , 0.61335554],
       [0.        , 0.        , 1.        , 0.        , 0.        ,
        0.        , 0.        ]])

然后使用一些距离度量来计算句子之间的相似度:

import scipy
>>> scipy.spatial.distance.cdist(tfidf, new, 'euclidean')
array([[1.26479741, 1.41421356],
       [0.76536686, 0.93970438],
       [0.85056925, 0.99588464]])