TF-IDF与余弦相似度

在文本处理中,经常用到TF-IDF,其英文是Term Frequency - Inverse Document Frequency,词频-逆文档频率。
作用是提取文档的关键词,思路是文档的出现最多的词,乘以逆文档作为权重的结果。
然后按照数值进行排序,就能得到文档的关键词从高到低的顺序。
基于每篇的词频向量,计算余弦相似度,就等得到文件之间的相似度。
从而完成相似文章推荐,相似文章添加评论。

TF-IDF基本步骤:
1、统计词频,标准化处理(考虑文章字数长短不一)。
2、计算逆文档频率,需要参考语料库,词频越常见,逆文档频率越接近于0.
3、计算TF-IDF,排序。得到文档的关键词向量组合。

有了上述关键词向量组合,除了计算文章相似度,还可以用于信息检索。
在用户输入检索信息时,对每篇文档计算搜索值词的TF-IDF值(对每个检索词TF-IDF值相加),得到整个文档的TF-IDF,然后排序,取最大值TF-IDF即为最匹配搜索词的文档。

特点:TF-IDF计算词频,速度快,对于大多数情况效果都很好。缺点是没有考虑词出现的位置,没有词的权重,各个词的权重与位置信息无关。比如,可能一段的开头句中,词的重要性高,这是另外需要考虑的问题。

余弦相似度:
1、通过TF-IDF得到文档的词频向量。
2、通过余弦公司求相似度。
这里写图片描述

参考文章
1、http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
2、http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
3、http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html(关于蒙特卡洛的入门介绍)

### 如何用TF-IDF计算余弦相似度 #### 公式解释 TF-IDF 是一种用于评估词语在文档集中重要性的方法。其公式如下: \[ \text{TF}(t,d) = \frac{\text{词 } t \text{ 出现在文档 } d \text{ 中的次数}}{\text{文档 } d \text{ 总的词数}} \] \[ \text{IDF}(t,D) = \log \left(\frac{\text{总文档数} + 1}{\text{包含词 } t \text{ 的文档数} + 1}\right) + 1 \] \[ \text{TF-IDF}(t,d,D) = \text{TF}(t,d) \times \text{IDF}(t,D) \] 余弦相似度衡量两个向量之间的夹角余弦值,表示它们的方向接近程度。对于两篇文档 \(d_1\) 和 \(d_2\) 转化后的 TF-IDF 向量 \(v_1\) 和 \(v_2\),余弦相似度定义为: \[ \cos(\theta) = \frac{v_1 \cdot v_2}{||v_1|| \times ||v_2||} \] 其中: - \(v_1 \cdot v_2\) 表示向量点积, - \(||v_1||\) 和 \(||v_2||\) 分别是向量的模。 --- #### 示例代码实现 以下是基于 `scikit-learn` 实现 TF-IDF余弦相似度计算的完整代码[^1]: ```python from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 示例文档集合 documents = [ "今天天气很好", "我们去公园散步", "天气预报说今天有雨", "出去玩需要带伞" ] # 创建 TF-IDF 向量化器拟合数据 vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform(documents) # 输出每个文档的 TF-IDF 向量 print("TF-IDF 矩阵:") print(tfidf_matrix.toarray()) # 计算余弦相似度矩阵 cosine_sim = cosine_similarity(tfidf_matrix) # 输出余弦相似度矩阵 print("余弦相似度矩阵:") print(cosine_sim) ``` 如果希望手动实现 NLTK 版本,则可以参考以下代码片段[^2]: ```python import nltk from nltk.corpus import stopwords from collections import Counter def compute_tf(word_list): """ 计算词频 (Term Frequency) """ tf_dict = Counter(word_list) total_words = len(word_list) return {word: freq / float(total_words) for word, freq in tf_dict.items()} def compute_idf(corpus): """ 计算逆文档频率 (Inverse Document Frequency) """ N = len(corpus) idf_dict = {} corpus_word_set = set([word for doc in corpus for word in doc]) for word in corpus_word_set: df = sum(1 for doc in corpus if word in doc) idf_dict[word] = max(nltk.math.log(N / (df + 1)), 0) return idf_dict def compute_tfidf(tf, idf): """ 将 TFIDF 结合起来计算 TF-IDF """ return {word: tf[word] * idf.get(word, 0) for word in tf.keys()} ``` 以上代码提供了基础框架,可以根据具体需求扩展功能。 --- #### 解释结果 运行上述代码后会获得两个主要输出: 1. **TF-IDF 矩阵**:每行代表一个文档,列对应于词汇表中的不同单词,数值表示该单词在此文档中的权重。 2. **余弦相似度矩阵**:这是一个方阵,第 \(i,j\) 位置上的值表示第 \(i\) 篇文档第 \(j\) 篇文档的相似度得分。对角线上的值恒等于 1,因为任何文档其自身的相似度最高。 通过观察这些矩阵,可以直观理解各文档间的语义关系以及关键词的重要性分布[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值