赞
踩
TF-IDF算法全称 termfrequency–inverse document frequency,是一种用于资讯检索与资讯探勘的常用加权技术。它的算法复杂度并不高,但能很好的满足搜索高相关度文档的需求。由于它的高效性,TF-IDF 模型在搜索引擎等实际应用中被广泛使用。
以下是本人使用Python实现该算法的思路,如有不当之处望各位大牛指导一二。
关于TF-IDF算法的描述网上很多,我就不拾前人牙慧了,感兴趣的筒子们可参考这篇通俗易懂的文章:TF-IDF模型的概率解释。这篇文章中给出了很多数学公式,但数学的美妙在于其每个符号在现实中都是有着极其和谐的对应关系的。在下文中,我将用更通俗的方法阐述下个人的理解。
对于一篇文档来说,它与关键字 w[i] 的相关度取决于它包含的所有词中该关键词的频率。这其实挺直观的,一篇文档中包含关键词w[i]越多,那么它与关键字w[i]相关度也就越大。但是,如果仅仅取关键词的频数的话,那么比较长的文档包含该关键词的频数很可能远远大于比较短的文档的。因而为了协调文档长度的影响,相关度的衡量应取关键词w[i]占文档总词数的频率。
那有多个关键词的话该怎样衡量一篇文档出现的情况该怎样衡量文档的综合相关度呢?最简单的当然是把它们都加起来,但这样一来新的问题又出现了。假设某个关键词w[j]出现在很多篇文档里,另一关键词w[k]仅在一小部分文档(记为集合U[i])里出现,那按照常理来说是不是匹配了更多关键词的文档集U[k]与给出的搜索关键词w[k],w[j]相关度更大?鉴于这种情况,我们需要给每一篇文档包含的每一个关键词的相关度加一个权值。《TF-IDF模型的概率解释》这篇文章里给出了该权值的推导过程。依本人的肤浅理解,这个权值为关键词w在所有文档集中所蕴含的信息熵。
这样TF-IDF算法的模型就出来了:
TF-IDF (q, d) = sum { i = 1..k | TF (w[i], d) *IDF(w[i]) }
IDF为逆向文档频率:
IDF = log (n / docs (w, D))
TF表示词条在文档d中出现的频率:
TF (w,d)= count (w, d) / sum { i = 1..n| count (w, d[i]) }
这个模块就一个函数,代码如下:
- def str_replace(str_source,char,*words):
- str_temp=str_source
- for word in words:
- str_temp=str_temp.replace(word,char)
- return str_temp
str_replace(str_source,char,*words)函数接受两个或两个以上的参数,str_source是需要处理的字符串,char是要替换的目标字符,words是可变字符串的元组,对字符串str_source中的每一个出现在words里的字符均替换成统一字符char。
在主程序里可以这样使用str_replace(content_temp,"","\t","\n",""),即将content_temp里的每一个"\t","\n",""字符都删掉。
这个模块主要有两个函数StrToUni_try和StrToUni。
由于输入字符串的格式可能没法实现知道,因而需要进行unicode解码的尝试,在解码尝试成功后再进行转码。这一过程分两个步骤,StrToUni_try和StrToUni两个函数分别完成。StrToUni_try函数主要负责判断字符串是不是某一格式,这个函数返回字符串的正确编码格式。StrToUni函数负责使用StrToUni_try返回的编码格式将字符串转化成unicode格式。代码如下:- def StrToUni_try(str,type_1):
- try:
- str.decode(type_1)
- except UnicodeDecodeError:
- return False
- else:
- return True
- def StrToUni(str,*type_list):
- if not type_list:
- if StrToUni_try(str,'utf-8'):
- return str.decode('utf-8')
- else:
- print "输入的源文件的编码格式不是utf-8"
- else:
- for type_2 in type_list:
- if StrToUni_try(str,type_2):
- return str.decode(type_2)
- else:
- if type_2==type_list[-1]:
- print "输入的源文件的编码格式不在您提供的格式列表中"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。