关键词的抽取在很多场景下都会使用。对于文本抽取关键词,通过几个关键词可以简要的概括文本的含义。比如论文都会有摘要,下面都会有大约5关键词来描述摘要的内容。抽取关键词的核心问题是如何量化词的重要性。解决了这个问题,只要对文档中的词进行重要行排序,选择前面K个关键词,就达到了抽取关键词的目的。算法之间的差异性基本都在量化词重要性上面。
TF-IDF
词频逆文档数(term frequency – inverse document frequency)是通过计算词频和逆文档数的乘积作为词的重要程度。假定样本集包含N个文档D_i,i=1,2,…,N,每个文档包含词序列为D_i=[w_1^i, w_2^i, …,w_{t_i}^i],词典集合记为V。总词数||W|| = \sum_{i=1} ^N t_i,就是每篇文档的词个数相加。于是词频表示为:
TF(V_i) = \frac {n(V_i)}{||W||}
其中n(V_i)表示所有文档中词的个数。逆文档数在很多文章中都有介绍,表示包含词V_i的文档数n(DV_i)与总文档数之比的倒数再取对数
IDF(V_i) = \log \frac{N}{n(DV_i)}
刚开始看到这个逆文档数这个词,不是很好理解,有点绕。看到计算公式以后,其实就是词的自信息或者信息量。在信息论中随机事件X的自信息表示为I(X)=-\log P(X),将上面的逆文档计算公式改写一下:
IDF(V_i) = – \log \frac{n(DV_i)}{N} = -\log P(V_i)
于是可以看到P(V_i)表示包含词的文档概率,比如10篇文章中有5篇都出现了词V_i,于是这个词的文档概率为0.5。我们知道随机事件发生的概率越小,其包含的信息量越大,如果一个词在每篇文章都出现,那么这个词很可能是常用词,涵盖的信息很少,自然就是不重要的词。从信息论的角度来看TF-IDF公式,就意味着一个词出现的频率越高,并且这个词包含的信息量越大,就是越重要的词。着也符合我们的常识。
使用TF-IDF来抽取关键词很自然需要一定的语料,通过在语料中计算好每个关键词的权重,保存起来,新输入的文本只要分词以后,直接可以查出词的权重列表,从而实现抽取关键词。此方法的好处就是在线计算速度非常快,如果收集了足够多的特定领域的语料,那么抽取关键词的效果是很不错的。
实验验证
笔者选择了若干抖音热榜的标题和描述数据,采用结巴分词,没有加入额外的分词字典。在语料上计算词频和逆文档数,得到权重字典。对新数据分词,查字典即可得出关键词序列。下面是几条结果
1.乳房下垂?试试这款无钢圈通勤内衣,无束缚不勒肉,超聚拢
=>[‘试试’, ‘内衣’, ‘聚拢’, ‘束缚’, ‘下垂’, ‘钢圈’, ‘乳房’]
2.中国联通7月18日免费发1万张888绝版卡,月租永久19元
=>[‘月租’, ‘绝版’, ‘免费发’]
3.北京全能新型大棚 免费设计 完工结账 可用20年 送棚膜送配件
=>[‘免费’, ‘设计’, ‘北京’, ‘全能’, ‘大棚’, ‘可用’, ‘完工’, ‘结账’]
4.林嘉歌为了娶她,用尽所有方法,靠萌娃助攻,时瑶答应去见他
=>[‘方法’, ‘答应’, ‘用尽’]
5.海量热门小说免费试读,在宜搜可以看到大结局!
=>[‘免费’, ‘小说’, ‘看到’, ‘海量’, ‘大结局’, ‘热门’]
6.家庭保险要趁早,保险规划教你避坑,先咨询清楚后投保,省钱省心
=>[‘咨询’, ‘保险’, ‘省钱’, ‘省心’, ‘规划’, ‘家庭’, ‘投保’]
由于笔者分词时筛选了词性,只允许’ns’, ‘n’, ‘vn’, ‘v’, ‘nr’这几类词性,参考jieba模块关键词抽取筛选的词性,如果是标签抽取丢掉动词可能会更好。另外一个比较大的问题就是对于专有名词很难抽取出来,笔者选择的语料是抖音热榜的数据,大多数的专有名词出现词的词频不会太高,至于新词可能结巴分词也不一定能够分出来。
总结
本文中笔者给出了从自信息的角度理解TF-IDF公式,词的重要程度取决于词频和词的信息量,两者值都比较大,词就更重要。另外选择抖音热榜数据作为语料,实验效果还算可以。理论上说选择垂直领域的预料,抽取的关键词效果会更好,目前笔者手上没有这方面的数据,等有数据了再做尝试。
Pingback: KeyBERT关键词抽取 – Black个人网站