关键词提取之TextRank

1、背景

关键词提取我们前面介绍了TF-IDF和他的改进版TF_IWF,关于关键词提取简介和应用可以参考以上前篇文章。

在前面我们讲过网页排序算法PageRank的原理,将PageRank用到文本的关键词提取就是TextRank了。

2、原理

相比于PageRank,如下图所示在TextRank中,无非是将单词作为节点,每个单词的外链来源于该单词前后固定大小窗口的所有单词。

类似于RageRank的思想,TextRank也可以这么解释:

  • 如果一个词出现在很多词后面,说明这个词比较重要。
  • 一个TextRank值很高的词链接到另一个词,那么另一个词的TextRank值也会相应的较高。

TextRank.png

比如对于“算法”一词,前后各两个词链接到它,并使用这四个词来解释中心词,相当于给中间词各投投票,投票的权重等于窗口内的投票词的权重除以投出所有票数的平均,中心词两边的词越多,所得到的票数越多,可见高频词得到的投票机会越大,但是并不意味着权重越高,因为其受限于投票词的权重。

通过改写 PageRank 公式得到 TextRank 的公式为:
\[
WS(V_{i})=(1-d)+d\times\sum_{V_{j}\in{In{(V_{i})}}}\frac{w_{i,j}}{\sum_{V_{k}\in{Out(V_{j})}}w_{j,k}}WS({V_{j})}
\]
其中,\(In{(V_{i})}\) 是指向节点 \(V_{i}\) 的的所有单词集合,\(\frac{w_{i,j}}{\sum_{V_{k}\in{Out(V_{j})}}w_{j,k}}\) 的分子表示词 \(V_{j}\) 链接到 \(V_{i}\) 的权重,分母表示节点 \(V_{j}\) 指向的所有链接的权重和。

3、编程实现

在调研TextRank的时候,发现已经有很多优秀的开源实现,Python语言里有结巴分词、TextRank4zh、Java工具Hanlp等,我们就不必自己造轮子,简单介绍一下。

import jieba.analyse

str = "特征加权算法之TextRank介绍"
result = jieba.analyse.extract_tags(str,withWeight=True)
print(result)

""" Output:
[('TextRank', 2.39095350058), 
  ('算法', 1.738238299826), 
  ('加权', 1.6091211459539998), 
  ('特征', 1.141123992216), 
  ('介绍', 1.106907987096)]
"""
from textrank4zh import TextRank4Keyword

tr4w = TextRank4Keyword()
str = "特征加权算法之TextRank介绍"
tr4w.analyze(text=str, lower=True, window=2, pagerank_config={'alpha':0.85})
for item in  tr4w.get_keywords(6, word_min_len=2):
  print(item.word, item.weight, type(item.word))
  
""" Output
加权 0.2459454192354203 <class 'str'>
textrank 0.2459454192354203 <class 'str'>
算法 0.23905458076457978 <class 'str'>
特征 0.1345272903822899 <class 'str'>
介绍 0.1345272903822899 <class 'str'>
"""

对比发现TextRank提供的参数选择比结巴分词更加丰富,更贴切我们上述的公式原理分析。

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.summary.TextRankKeyword;

import java.util.List;

/**
 * 关键词提取
 * @author hankcs
 */
public class DemoKeyword
{
    public static void main(String[] args)
    {
        String content = "特征加权算法之TextRank介绍";
        List<String> keywordList = HanLP.extractKeyword(content, 5);
        System.out.println(keywordList);
    }
}

/**
 * [特征, 介绍, 加权, TextRank, 算法]
 */

Hanlp输出没有封装分数,通过debug后发现分数都一致,这点应该和语句词频和指向相关,增加语句长度效果立显,读者可以尝试。

4、总结

TextRank提取关键词的效果其实并不会优于TF-IDF,因为都倾向于将频繁词作为关键词。此外,TextRank涉及到构建图及迭代计算,所以计算速度应该较TF-IDF慢。

posted @ 2020-01-15 15:12  peacocks  阅读(1704)  评论(0编辑  收藏  举报