文本相似度计算,TF-IDF算法,原理及实现

TF-IDF算法

TF-IDF算法意义

TF-IDF通常用于衡量一个词相对于一篇文档的重要程度,既然是重要程度可以从两个角度考虑:
1.词频(Term Frequency,TF):该指标是考虑一个词在一篇文档中的出现次数,计算公式为
T F = w o r d j w o r d s j TF = \frac{word_j}{words_j} TF=wordsjwordj
假定我们要给查询的词用 w o r d word word表示,分母要计算的是 w o r d j word_j wordj在第j篇文章出现的次数,分母words代表的是第j篇文章的总词数。TF有过滤一些高频的无用词的作用,比如一些词为“的”,“了”等等,这些词出现频率很高但是没有实际含义。

2.逆文档频率(Inverse Document Frequency,IDF):该指标是衡量一个词在多个文档中出现的次数,计算公式为
I D F = l o g ( D D w o r d + 1 ) IDF = log(\frac{D}{D_{word}+1}) IDF=log(Dword+1D)
还是假定要查询的词用 w o r d word word表示,其中 D D D是文档的总个数, D w o r d D_{word} Dword的含义是包含词 w o r d word word的文档数。IDF衡量的词对文档区分度,比如说“甲基丁醛”这个词在绝大部分文档中出现的频率不高,但是在一些化学的文档中经常出现。我们可以通过词来确定文档的类别。

TF-IDF总的计算式为:
T F − I D F = T F ∗ I D F TF-IDF = TF*IDF TFIDF=TFIDF
所以TF-IDF的意义为:一些词仅在部分文档中出现频率高,所赋予的权重就会高

关于TF-IDF的一个实际例子和代码:

有三篇文档,分别是:
1.与科技相关的主题:

据了解,Chrome 100版本没有重大变化或革命性的新功能。然而,通过Chrome100浏览网站,有些网站可能会无法正常识别浏览器版本,导致用户无法正常使用网页。谷歌表示这一问题主要出现在利用Duda开发的网站,并已经开始进行修复。

2.与生活相关的主题:

为什么没有大年三十?天文专家介绍,这“都是月亮惹的祸”。月亮圆缺变化一周称为一个朔望月,月亮最圆的那天称为“望”,完全看不到月亮的那天叫做“朔”。从“朔月”到“望月”再回到“朔月”,这样一个周期平均为29.5天。然而古人在制定历法时,需要整数的天,因此一个月有时候是29天,有时候是30天。

3.与娱乐相关的主题:

近日,电影《无名》制片人于冬接受专访,透露《无名》在上海秘密拍摄了130多天,已顺利杀青,同时表示青年演员王一博“绝对是意想不到的演出”,“他的表现力和冲击力很强烈”,亦正亦邪,充满悬疑,直言他演得很好,同时表示梁朝伟也非常喜欢、赞赏他。据悉,电影《无名》由博纳影业集团打造,程耳担任编剧及导演,梁朝伟、王一博担任主演,该影片于12月19日正式杀青。

现在我们想要查询“谷歌”这个词和哪篇文本相关?
Step1.数据预处理,利用jieba对文档进行切词,分别保存到列表之中:

import jieba
#科技相关的文档
doc1 = ["据了解,Chrome 100版本没有重大变化或革命性的新功能。然而,通过Chrome 100浏览网站,有些网站可能会无法正常识别浏览器版本,导致用户无法正常使用网页。谷歌表示这一问题主要出现在利用Duda开发的网站,并已经开始进行修复。"]
#官方通报相关的文档
doc2 = ["为什么没有大年三十?天文专家介绍,这“都是月亮惹的祸”。月亮圆缺变化一周称为一个朔望月,月亮最圆的那天称为“望”,完全看不到月亮的那天叫做“朔”。从“朔月”到“望月”再回到“朔月”,这样一个周期平均为29.5天。然而古人在制定历法时,需要整数的天,因此一个月有时候是29天,有时候是30天。"]
#娱乐相关文档
doc3 = ["近日,电影《无名》制片人于冬接受专访,透露《无名》在上海秘密拍摄了130多天,已顺利杀青,同时表示青年演员王一博“绝对是意想不到的演出”,“他的表现力和冲击力很强烈”,亦正亦邪,充满悬疑,直言他演得很好,同时表示梁朝伟也非常喜欢、赞赏他。据悉,电影《无名》由博纳影业集团打造,程耳担任编剧及导演,梁朝伟、王一博担任主演,该影片于12月19日正式杀青。"]
seg_doc1 = list(jieba.cut_for_search(doc1[0]))
seg_doc2 = list(jieba.cut_for_search(doc2[0]))
seg_doc3 = list(jieba.cut_for_search(doc3[0]))

Step2. 找出“谷歌”在每篇文档中的出现的频率,计算TF:

def count_word_in_doc(word,doc):
    #计算词语在文档中的频率
    number = 0
    for it in doc:
        if word == it:
            number = number + 1
    return number

query1 = "谷歌"
q_doc1 = count_word_in_doc(query1,seg_doc1)
q_doc2 = count_word_in_doc(query1,seg_doc2)
q_doc3 = count_word_in_doc(query1,seg_doc3)

tf1 = q_doc1/len(seg_doc1)
tf2 = q_doc2/len(seg_doc2)
tf3 = q_doc3/len(seg_doc3)

所计算的:tf1 = 0.015384615384615385,tf2 = 0.0,tf3 = 0.0

Step3.计算IDF

def count_doc_in_word(word,doc_list):
    number = 0
    for it in doc_list:
        if word in it:
            number = number + 1
    return number

#计算IDF
doc_list = [seg_doc1,seg_doc2,seg_doc3]
doc_in_word = count_doc_in_word(query1 ,doc_list)
IDF = 3/doc_in_word

所计算出来的IDF = 3

Step4.计算最终结果
TF-IDF-1 = tf1* IDF = 0.045
TF-IDF-2 = tf2* IDF = 0
TF-IDF-3 = tf3* IDF = 0

可以计算出“谷歌”这个词与第一篇文档最相似

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值