2025-04-18-文本相似度-菜鸟
2025-04-18-文本相似度-菜鸟
题目内容
实现一个基于 T F − I D F TF-IDF TF−IDF的文本相似度计算系统。具体要求如下:
- 读取输入的文本数据。
- 对文本数据进行预处理(例如分词、去停用词,大小写统一)。
- 使用 T F − I D F TF-IDF TF−IDF方法提取文本特征。
- 计算每对文本之间的余弦相似度。
输入描述
输入为一个维列表,包含若干英义文本数据。
输出描述
输出为一个二维列表,表示每对文本之间的余弦相似度,保留两位小数,用字符串形式表示。
具体格式见输出样例。
样例
输入:
["l love this product","I LOVE this product","I love this ipad pro"]输出:
['1.00','1.00','0.24']
['1.00','1.00','0.24']
['0.24','0.24','1.00']
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
text = eval(input())
text
['l love this product', 'I LOVE this product', 'I love this ipad pro']
vectorizer = TfidfVectorizer(stop_words="english", lowercase=True)
mat = vectorizer.fit_transform(text)
print(mat)
(0, 3) 0.7898069290660905(0, 1) 0.6133555370249717(1, 3) 0.7898069290660905(1, 1) 0.6133555370249717(2, 2) 0.652490884512534(2, 0) 0.652490884512534(2, 1) 0.3853716274664007
cosine_result = cosine_similarity(mat) # 余弦值计算
cosine_result
array([[1. , 1. , 0.23636982],[1. , 1. , 0.23636982],[0.23636982, 0.23636982, 1. ]])
# 输出结果
round_arr = np.round(cosine_result, 2)
for row in round_arr:str_row = [f"{x:.2f}" for x in row]print(str_row)
['1.00', '1.00', '0.24']
['1.00', '1.00', '0.24']
['0.24', '0.24', '1.00']
TF-IDF 文本特征提取
1. 定义
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的常用加权技术,用于评估一个词对于一个文档集或语料库中的某个文档的重要程度。它由两部分组成:
-
词频(TF,Term Frequency):衡量词在文档中出现的频率,计算公式为:
TF ( w ) = 词语 w 在文档中出现的次数 文档中所有词语的总数 \text{TF}(w) = \frac{\text{词语 } w \text{ 在文档中出现的次数}}{\text{文档中所有词语的总数}} TF(w)=文档中所有词语的总数词语 w 在文档中出现的次数 -
逆文档频率(IDF,Inverse Document Frequency):衡量词的普遍重要性,计算公式为:
IDF ( w ) = log ( 语料库中的文档总数 包含词语 w 的文档数 + 1 ) \text{IDF}(w) = \log \left( \frac{\text{语料库中的文档总数}}{\text{包含词语 } w \text{ 的文档数} + 1} \right) IDF(w)=log(包含词语 w 的文档数+1语料库中的文档总数)
TF-IDF 的值通过将 TF 和 IDF 相乘得到:
TF-IDF ( w ) = TF ( w ) × IDF ( w ) \text{TF-IDF}(w) = \text{TF}(w) \times \text{IDF}(w) TF-IDF(w)=TF(w)×IDF(w)
TF-IDF 值越高,说明该词语在当前文档中的重要性和区分度越高。
2. Python 实现
在 Python 中,可以使用 scikit-learn
库中的 TfidfVectorizer
类来实现 TF-IDF 特征提取。以下是一个简单的示例代码:
TfidfVectorizer 提供了多个参数,例如 stop_words(停用词集合)、max_df(文档频率的最大阈值)和 min_df(文档频率的最小阈值),用于定制化特征提取。
3. 应用场景
TF-IDF 广泛应用于自然语言处理和信息检索领域,常见的应用场景包括:
关键词提取:通过计算每个词的 TF-IDF 值,挑选出 TF-IDF 值高的词作为文档的关键词。
文本分类:将文本转换为 TF-IDF 特征向量,输入到机器学习模型(如 SVM、朴素贝叶斯等)进行分类。
信息检索:搜索引擎通过计算查询词和文档中词的 TF-IDF 值,返回与查询最相关的文档。
推荐系统:基于 TF-IDF 计算用户对不同文档的兴趣度,推荐个性化内容。
4. 优缺点
优点
- 计算简单,易于实现。
- 能有效衡量词汇在文档中的重要性,避免常见词的干扰。
- 适合处理大规模文本数据。
缺点
- 无法考虑词序和上下文信息。
- 对多义词或语境依赖较强的词效果较差。
- 假设词频和文档频率完全独立,可能不完全符合真实语境。
TF-IDF 是一种经典的文本特征提取方法,尽管随着深度学习的发展,其在某些场景中逐渐被更先进的模型(如 BERT、GPT 等)替代,但在简单高效的文本处理任务中,TF-IDF 仍然是一个重要的工具。
from sklearn.feature_extraction.text import TfidfVectorizer# 示例文档
documents = ["Python is a high-level programming language.","Python is widely used in data science.","Machine learning is a subset of artificial intelligence."
]# 创建 TfidfVectorizer 对象
vectorizer = TfidfVectorizer()# 计算 TF-IDF 矩阵
tfidf_matrix = vectorizer.fit_transform(documents)# 获取特征名称
feature_names = vectorizer.get_feature_names_out()# 打印 TF-IDF 矩阵
print("TF-IDF 矩阵:")
print(tfidf_matrix.toarray())# 打印特征名称
print("特征名称:")
print(feature_names)
TF-IDF 矩阵:
[[0. 0. 0.45050407 0. 0. 0.266074960.45050407 0. 0.45050407 0. 0. 0.450504070.34261996 0. 0. 0. 0. ][0. 0.41074684 0. 0.41074684 0. 0.24259370. 0. 0. 0. 0. 0.0.31238356 0.41074684 0. 0.41074684 0.41074684][0.39687454 0. 0. 0. 0.39687454 0.23440050. 0.39687454 0. 0.39687454 0.39687454 0.0. 0. 0.39687454 0. 0. ]]
特征名称:
['artificial' 'data' 'high' 'in' 'intelligence' 'is' 'language' 'learning''level' 'machine' 'of' 'programming' 'python' 'science' 'subset' 'used''widely']
余弦相似度
1. 定义
余弦相似度(Cosine Similarity)是一种衡量两个向量在多维空间中方向相似度的度量方法。它通过计算两个向量的夹角余弦值来衡量它们的相似性。余弦值越接近 1,表示两个向量的方向越接近;余弦值越接近 0 或 -1,表示两个向量的方向越不相似。
余弦相似度的计算公式为:
Cosine Similarity ( A , B ) = A ⋅ B ∥ A ∥ ∥ B ∥ \text{Cosine Similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} Cosine Similarity(A,B)=∥A∥∥B∥A⋅B
其中:
- A ⋅ B A \cdot B A⋅B 是向量 A A A 和 B B B 的点积。
- ∥ A ∥ \|A\| ∥A∥ 和 ∥ B ∥ \|B\| ∥B∥ 分别是向量 A A A 和 B B B 的欧几里得范数(即向量的长度)。
2. Python 实现
在 Python 中,可以使用 numpy
或 scipy
库来计算余弦相似度。以下是一个简单的示例代码:
使用 numpy
计算余弦相似度
import numpy as np# 定义两个向量
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])# 计算点积
dot_product = np.dot(A, B)# 计算向量的范数
norm_A = np.linalg.norm(A)
norm_B = np.linalg.norm(B)# 计算余弦相似度
cosine_similarity = dot_product / (norm_A * norm_B)
print("余弦相似度:", cosine_similarity)
余弦相似度: 0.9746318461970762