当前位置:   article > 正文

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

tf计算文本相似度

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]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

所计算的: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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

所计算出来的IDF = 3

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/369171
推荐阅读
相关标签
  

闽ICP备14008679号