转:https://blog.csdn.net/lo_single/article/details/76039748
tf-idf简介
在信息提取的应用场景之中,我们往往需要一些文本中的重要的词而不是文本中的所有词语来进行分析,即使原文本已经进行了去停用词的处理。
那么什么样的词算是文本中的关键词呢?一方面,这个词应该在文本中出现的次数比较多;另一方面,这个词应该不那么常见,若是这个词在很多文档中都有出现,这个词显然不能用来作为代表某个文档的重要词汇。一个合适的算法便是tf-idf算法。
tf-idf是term frequency–inverse document frequency的缩写。该算法用一种统计学的方法来衡量一个词语在文本中的重要程度,常被用于信息提取、文本挖掘等场景之中。该算法的核心便是计算一个文本中某个词语的tf值与idf值。
tf计算
tf是term frequency的缩写,指文本中的词频。衡量一个词语在文档中的出现频率有很多方法,最简单也足够有效的,便是直接计算这个词出现的次数,来作为这个词的tf值。
idf计算
idf是inverse document frequency的缩写,指“逆文档频率”,是一个用来衡量一个词常见程度的值。这个值的计算不应该基于单个文档,而应该考虑所有要进行分析的文档,来得出结果。
idf值的计算方法也有很多,这里仅提供一个常见的公式:
分母处加一,是为了防止某个词从未出现过而导致分母为0。
算法实现
上面的两个值显然都与一个词的重要程度正相关,所以将其直接相乘,以乘积比较不同词之间的重要程度差异。下面是使用
python的实现:
def idf(corpus):
idfs = {}
d = 0.0
# 统计词出现次数
for doc in corpus:
d += 1
counted = []
for word in doc:
if not word in counted:
counted.append(word)
if word in idfs:
idfs[word] += 1
else:
idfs[word] = 1
# 计算每个词逆文档值
for word in idfs:
idfs[word] = math.log(d/float(idfs[word]))
return idfs
if __name__ == '__main__':
# 获取需要的语料库,根据实际情况自行更改
# 这里获取的语料库是每个文档的分词结果列表的列表
corpus = getCorpus()
idfs = idf(corpus)
for doc in corpus:
tfidfs = {}
for word in doc:
if word in tfs:
tfidfs[word] += 1
else:
tfidfs[word] = 1
for word in tfidfs:
tfidfs[word] *= idfs[word]
总结
tf-idf算法非常简单,但其有一个极为致命的缺陷,就是没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。
在过去,往往通过结合一些外部信息如“知网”(WordNet)或者使用可以表达隐藏信息的概率模型来处理这一缺陷。
2013年,Google开源了其Word2Vec算法,通过计算上下文来将词语进行向量化表示,在正常的训练结果下语义相近的词语向量距离较近而语义较远的词语距离向量较远。结合这一深度学习的新算法,tf-idf的传统问题得到了很好的解决。
---------------------
作者:lo_single
来源:CSDN
原文:https://blog.csdn.net/lo_single/article/details/76039748
版权声明:本文为博主原创文章,转载请附上博文链接!