"""基于特征提取的文本查重"""
'''
特征提取的方式:TF-IDF(词频-逆文档频率)和基于词袋的方法 (Bag of Words)
本例为基于TF-IDF方法进行文本特征提取
基于余弦相似度进行文本相似性比对
'''
'''
如果一个词在文档中出现了很多次,但是这个词在其它文档中出现的次数很少,则这个词对这篇文档很重要。在一定程度上这个词可以表达这篇文档的关键信息
TF-IDF则是基于此概念
'''
if __name__ == '__main__':
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 示例文本数据
documents = [
"Python is a popular programming language",
"Java is another widely used language",
"Programming languages are essential for software development",
"Python and Java are both used in web development"
]
# 创建TF-IDF向量化器
tfidf_vectorizer = TfidfVectorizer()
# 将文本数据转化为TF-IDF向量
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
# 计算文档之间的余弦相似性
'''
余弦相似度的值范围从 -1 到 1。
1 表示两个向量在方向上完全相同。
0 表示正交(无相似性)。
-1 表示两个向量方向完全相反
'''
similarity_matrix = cosine_similarity(tfidf_matrix)
# 打印相似性矩阵
print("Similarity Matrix:")
print(similarity_matrix)
'''
结果为:
[[1. 0.31434136 0.13746537 0.12486667]
[0.31434136 1. 0. 0.22014849]
[0.13746537 0. 1. 0.19254733]
[0.12486667 0.22014849 0.19254733 1. ]]
数组内每个子数组代表从第一个文本到第四个文本;
第一个子数组内从左到右分别为其与本身、后一个文本的余弦相似度
第二个子数组内从左到右分别为与前一个数组,与其本身,与后一个文本,与后两个文本的余弦相似度
第三个子数组按照以上规律类推
'''
# 查找最相似的文档
'''
similarity_matrix.argsort()排序结果为:
[[3 2 1 0]
[2 3 0 1]
[1 0 3 2]
[0 2 1 3]]
'''
'''
因为每个数据中正序排序排在倒数第一位的是当前文档自身的余弦相似度(为1),并不能说明哪个文档和它本身相似度最高,所以需要取倒数第二位
[:, -2],表示截取倒数第二个元素,在此例中每个数组的倒数第二个元素分别为1,0,3,1
'''
most_similar = similarity_matrix.argsort()[:, -2]
print(f"最相似的文档为:{most_similar}")
# 打印最相似的文档
# enumerate可以同时获取迭代的枚举值和索引
for i, doc_index in enumerate(most_similar):
print(
f"Document {i} is most similar to Document {doc_index} (Similarity Score: {similarity_matrix[i][doc_index]:.2f})")
'''
similarity_matrix[i]为拿到遍历后的第几个数组
similarity_matrix[i][doc_index]为拿到每个数组的第几个元素
:.2f为控制输出保留两位小数,四舍五入
'''
本文暂时没有评论,来添加一个吧(●'◡'●)