TF-IDF
TF-IDF(Term Frequency - Inverse Document Frequency)分为两个部分词频(Term Frequency)和逆文档频率(Inverse Document Frequency)。
词频(Term Frequency)
词频= 某 个 词 在 文 章 中 出 现 的 频 数 文 章 总 词 数 \frac{某个词在文章中出现的频数}{文章总词数} 文章总词数某个词在文章中出现的频数,表示某个词语在某篇文章中出现的频数。某词语出现频数越高,则重要性越高。除以文章总词数是减少文章长短不同而导致的影响。
逆文档频率(Inverse Document Frequency)
逆文档频率= log 语 料 库 文 档 总 数 含 有 该 词 的 文 档 数 + 1 \log_{}{\frac{语料库文档总数}{含有该词的文档数+1}} log含有该词的文档数+1语料库文档总数,如果含有该词的文档数越多,则说明这个词很常见、不重要,IDF值越小。
注意:语料库文档总数≥含有该词的文档数,因此IDF值必然大于0(分母+1是为了避免分母为0,即所有文档都不含该词)
TF-IDF=词频(TF)*逆文档频率(IDF)
TF-IDF值与一个词在文档中的出现次数成正比,与该词在整个语料库中出现次数成反比。
当一个词的TF-IDF值越高,则说明这个词在这篇文章中多次出现,在其他文章中很少见,那么这个词就很可能是关键词。
优缺点
-
优点:简单快速,而且容易理解
-
缺点:用词频来衡量文章中的一个词的重要性不够全面;没有考虑语序,“武松打虎”,"虎打武松"是一样的特征表示
代码实现-jieba
from jieba.analyse import *
with open('sample.txt', encoding='utf-8') as f:
data = f.read()
# 使用TF-idf方式提取关键词和权重,并且依次显示出来。如果你不做特殊指定的话,默认显示数量为20个关键词。
for keyword, weight in extract_tags(data, topK=20, withWeight=True):
print('%s %s' % (keyword, weight))
基于特定语料库的TF-IDF关键词提取实现 原 - 云+社区 - 腾讯云 (tencent.com)
补充阅读:TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志 (ruanyifeng.com)
Text Rank
- 提取词汇,形成节点
- 依据词汇的关联,建立链接
- 依照连接节点的多少,给每个节点赋予一个初始的权重数值
- 开始迭代。根据某个词所连接所有词汇的权重,重新计算该词汇的权重,然后把重新计算的权重传递下去,直到这种变化达到均衡态,权重数值不再发生改变
- 根据最后的权重值,取其中排列靠前的词汇,作为关键词提取结果
代码-jieba
from jieba.analyse import *
with open('sample.txt', encoding='utf-8') as f:
data = f.read()
for keyword, weight in textrank(data, withWeight=True):
print('%s %s' % (keyword, weight))