文本相似性分析

本文介绍了文本相似性分析中的TF-IDF方法,该方法通过结合词频(TF)和逆文档频率(IDF)来评估词汇在文档中的重要性。首先解释了defaultdict在分词过程中的作用,接着详细阐述了TF-IDF的概念,以及如何使用TF-IDF计算关键词的重要性。以一篇关于中国蜜蜂养殖的文章为例,展示了如何通过TF-IDF筛选出最具代表性的关键词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文档的相似性处理中的分词是文本信息处理的基础环节,是将一个单词序列切分成一个一个单词的过程。

里面涉及到的defaultdict属于内建函数dict的一个子类,调用工厂函数提供缺失的值,作用在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值.,int()的默认值是0。

TF-IDF是一种统计方法,它能够用于评估一个词语对于一个文集或一个语料库中的某一份文档的重要程度。

词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。

逆文档频率(Inverse Document Frequency,IDF)是指包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率(TF)高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

 

举例:参考: http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

假定现在有一篇文章《中国的蜜蜂养殖》,我们想要用计算机提取它的关键词。

第一步:先统计文章中出现次数最多的词,发现它们是 "的"、"是"、"在",而这三个词对我们想要的结果无意义,所以过滤掉它们不用。

第二步:我们发现次统计数中出现较多的词有"中国"、"蜜蜂"、"养殖"这三个词,但它们出现的次数一样多。既它们的词频(TF)是一样的。这时就要用到逆文档频率(IDF)来区分它们的重要性。

 

第三步:根据词频(TF)和逆文档频率(IDF)计算TF-IDF

如假定文章长度为1000个词,"中国"、"蜜蜂"、"养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。然后,发现包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:

从上表可见,"蜜蜂"的TF-IDF值最高,"养殖"其次,"中国"最低。所以,如果只选择一个词,"蜜蜂"就是这篇文章的关键词。

#文本相似性分析
from gensim import corpora,models,similarities
import jieba
from collections import defaultdict
#1读取文档
doc1="文心雕龙.txt"
doc2="金字塔原理.txt"
d1=open(doc1,"r",encoding='utf-8').read()
d2=open(doc2,"r",encoding='gbk').read()

#2进行分词
data1=jieba.cut(d1)
data2=jieba.cut(d2)
#3将文档中的词间隔空格,便于计算
data11=""
for item in data1:
    data11+=item+" "#当前数据+空格
    #print(data11)
data21=""
for item in data2:
    data21+=item+" "

documents=[data11,data21] #存储文档
texts=[[word for word in document.split()]
       for document in documents] #处理成链表格式,便于遍历

#4计算词频
#如果访问字典中不存在的键,会引发KeyError异常,defaultdict的作用是在于,
# 当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值,
frequency=defaultdict(int)#构建一个对象defaultdict接受一个工厂函数作为参数,int=0
for text in texts:#遍历文本
    for token in text:
        frequency[token]+=1#如果出现多次,自加1
#5对出现频率低的词过滤掉,如小于3的
texts=[[word for word in text if frequency[token]>3]
       for text in texts]
#6建立词典,并使用save函数将词典保存
dictionary=corpora.Dictionary(texts)
#字典有很多功能
# diction.token2id 存放的是单词-id key-value对
# diction.dfs 存放的是单词的出现频率
dictionary.save("wsimiliar.txt")#保存到文档中
#7加载要对比的文档
doc3="写作这回事(恐怖小说之王的人生回忆录)Txt-[美]斯蒂芬金.txt"
d3=open(doc3,"r",encoding='gbk').read()#编码
data3=jieba.cut(d3)
data31=""
for item in data3:
    data31+=item+" "
    #print(data31)
new_doc=data31
#8.将要对比的文档通过doc2ow转化为稀疏向量
new_vec=dictionary.doc2bow(new_doc.split())#有空格,切割一下
#9.进一步处理,得到新语料库
corpus=[dictionary.doc2bow(text) for text in texts]
tfidf=models.TfidfModel(corpus)#将文档由按照词频表示 转变为按照tf-idf格式表示
#10.通过token2id得到特征数
featureNum=len(dictionary.token2id.keys())
#11.计算稀疏矩阵的相似度,建立索引
index=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNum)
simlarity=index[tfidf[new_vec]]
print(simlarity)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值