赞
踩
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
TF−IDF=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
可以计算出“谷歌”这个词与第一篇文档最相似
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。