使用 TF-IDF 和余弦相似度测量文本相似度
确定两个文本文档之间的相似度是文本挖掘和信息中的一项关键任务检索。一种流行的方法是利用 TF-IDF(术语频率-逆文档频率) 和 余弦相似度。
TF-IDF 分配权重根据文档中每个单词在该文档中的出现频率及其在整个文档语料库中的稀有性来对文档中的每个单词进行分类。具有相似单词模式的文档将共享更高的 TF-IDF 向量。
余弦相似度 测量两个向量之间的角度,提供 0(无相似性)和 1(完全相似)之间的值。在我们的例子中,两个文档的 TF-IDF 向量形成了这些向量,余弦相似度量化了它们的角度。
Python 实现
在 Python 中,使用scikit-learn 和 Gensim 包,计算成对相似度很简单:
<code class="python">from sklearn.feature_extraction.text import TfidfVectorizer documents = [open(f).read() for f in text_files] tfidf = TfidfVectorizer().fit_transform(documents) pairwise_similarity = tfidf * tfidf.T</code>
或者,如果文档已经是字符串,请使用:
<code class="python">corpus = ["I'd like an apple", "An apple a day keeps the doctor away", "..."] vect = TfidfVectorizer(min_df=1, stop_words="english") tfidf = vect.fit_transform(corpus) pairwise_similarity = tfidf * tfidf.T</code>
解释结果
pairwise_similarity 是一个稀疏矩阵,表示每个文档对之间的相似度。要查找与特定文档最相似的文档,请屏蔽文档与其自身的相似性(将其设置为 NaN),并使用 np.nanargmax() 查找其行中的最大值:
<code class="python">import numpy as np arr = pairwise_similarity.toarray() np.fill_diagonal(arr, np.nan) input_doc = "The scikit-learn docs are Orange and Blue" input_idx = corpus.index(input_doc) result_idx = np.nanargmax(arr[input_idx]) similar_doc = corpus[result_idx]</code>
其他注意事项
对于大型语料库和词汇表,使用稀疏矩阵比转换为 NumPy 数组更高效。
通过调整 TfidfVectorizer 中的参数,例如最小文档的 min_df频率,可以自定义 TF-IDF 计算以满足特定要求。
其他资源
以上是如何使用 TF-IDF 和余弦相似度测量文本相似度?的详细内容。更多信息请关注PHP中文网其他相关文章!