Python TFIDF计算文本相似度

本文主要参考https://stackoverflow.com/questions/12118720/python-tf-idf-cosine-to-find-document-similaritStackOverflow的回答
主要是使用sklearn的TfidfTransformer

cosine_similarity就是计算L2归一化的向量点乘。如果x,y是行向量,它们的cosine similarityk是:
在这里插入图片描述
linear_kernel 是多项式核的特例,如果x,和y是列向量,他们的线性核为:
在这里插入图片描述

fit &fit_tansform & transform

  • fit是一个适配的过程,用于train,得到一个统一的转换的规则的模型;
  • transform:将数据进行转换,比如测试数据按照训练数据同样的模型进行转换,得到特征向量;
  • fit_tansform:将上述两个合并起来,fit to data,then transform it. 如果训练阶段用的是fit_transform,在测试阶段只需要transform就行

也就是一般训练的时候用fit_transform(train_data)
在测试的时候用transform(test_data)

回答一

如果你想提取count features并应用TF-IDFnormalizaition以及行基础的欧式距离,用一个操作就行:
TFidfVectorizor

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty = fetch_20newsgroups()

>>> tfidf = TfidfVectorizer().fit_transform(twenty.data)
>>> tfidf
<11314x130088 sparse matrix of type '<type 'numpy.float64'>'
    with 1787553 stored elements in Compressed Sparse Row format>

现在要求一个文档(如第一句)同其他所有文档的距离,只需要计算第一个向量和其他所有向量的点乘,因为tfidf向量已经row-normalized
cos距离并不考虑向量的大小(也就是绝对值),Row-normalised(行标准化)向量大小为1,所以Linear Kernel足够计算相似值。
scipy sparse matrix查看第一个向量:

>>> tfidf[0:1]
<1x130088 sparse matrix of type '<type 'numpy.float64'>'
    with 89 stored elements in Compressed Sparse Row format>

scikit-learn已经提供了pairwise metrics,稀疏的不稀疏的矩阵表示。这里我们需要点乘操作,也叫linear kernel:

>>> from sklearn.metrics.pairwise import linear_kernel
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()
>>> cosine_similarities
array([ 1.        ,  0.04405952,  0.11016969, ...,  0.04433602,
    0.04457106,  0.03293218])

这里插播一下,linear_kernel的输入是(NT)和(MT)的向量,输出(N*M)的向量

因此,要找5个最接近的相关文档,只需要用argsort切片取就行了:

>>> related_docs_indices = cosine_similarities.argsort()[:-5:-1]
>>> related_docs_indices
array([    0,   958, 10576,  3277])
>>> cosine_similarities[related_docs_indices]
array([ 1.        ,  0.54967926,  0.32902194,  0.2825788 ])

第一个结果用于检查,这是query本身,相似度为1
在这个例子里,learn_kernel就相当于cos similarity,因为sklearn.feature_extraction.text.TfidfVectorizer本身得到的就是归一化后的向量,这样cosine_similarity就相当于linear_kernel

回答2

是个手动计算的方法
循环计算test_data与train_data的特征间的cosine 距离
首先用简单的lambda函数表示cosine距离的计算:

cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)

然后就只要for循环就行

for vector in trainVectorizerArray:
    print vector
    for testV in testVectorizerArray:
        print testV
        cosine = cx(vector, testV)
        print cosine

回答3

跟回答1一样,不过直接用cosine_similarity

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
print "cosine scores ==> ",cosine_similarity(tfidf_matrix_train[0:1], tfidf_matrix_train)  #here the first element of tfidf_matrix_train is matched with other elements
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python计算文本相似度的示例代码: ```python import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 定义文本处理函数 def process_text(text): # 分词 tokens = word_tokenize(text.lower()) # 去除停用词 stop_words = set(stopwords.words('english')) filtered_tokens = [token for token in tokens if token not in stop_words] # 词形还原 lemmatizer = WordNetLemmatizer() lemmatized_tokens = [lemmatizer.lemmatize(token) for token in filtered_tokens] # 返回处理后的文本 return ' '.join(lemmatized_tokens) # 定义计算相似度函数 def calculate_similarity(text1, text2): # 处理文本 processed_text1 = process_text(text1) processed_text2 = process_text(text2) # 构建TF-IDF向量 vectorizer = TfidfVectorizer() tfidf = vectorizer.fit_transform([processed_text1, processed_text2]) # 计算余弦相似度 similarity = cosine_similarity(tfidf)[0][1] return similarity # 示例 text1 = 'The quick brown fox jumps over the lazy dog.' text2 = 'A quick brown dog jumps on the log.' similarity = calculate_similarity(text1, text2) print('相似度:', similarity) ``` 上述代码使用了NLTK库进行文本处理,利用TF-IDF向量和余弦相似度计算文本相似度。需要注意的是,计算相似度前需要对文本进行预处理,如分词、去除停用词和词形还原等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值