关键词提取算法TextRank
2017-03-27 13:06
337 查看
很久以前,我用过TFIDF做过行业关键词提取。TFIDF仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息。现在本文将介绍一种考虑了相邻词的语义关系、基于图排序的关键词提取算法TextRank。
\[
PR(V_i) = (1-d) + d * \sum_{j \in In(V_i)} \frac{1}{|Out(V_j)|}PR(V_j)
\]
其中,\(PR(V_i)\)表示结点\(V_i\)的rank值,\(In(V_i)\)表示结点\(V_i\)的前驱结点集合,\(Out(V_j)\)表示结点\(V_j\)的后继结点集合,\(d\)为damping factor用于做平滑。
网页之间的链接关系可以用图表示,那么怎么把一个句子(可以看作词的序列)构建成图呢?TextRank将某一个词与其前面的N个词、以及后面的N个词均具有图相邻关系(类似于N-gram语法模型)。具体实现:设置一个长度为N的滑动窗口,所有在这个窗口之内的词都视作词结点的相邻结点;则TextRank构建的词图为无向图。下图给出了由一个文档构建的词图(去掉了停用词并按词性做了筛选):
考虑到不同词对可能有不同的共现(co-occurrence),TextRank将共现作为无向图边的权值。那么,TextRank的迭代计算公式如下:
\[
WS(V_i) = (1-d) + d * \sum_{j \in In(V_i)} \frac{w_{ji}}{\sum_{V_k \in Out(V_j)} w_{jk}} WS(V_j)
\]
其中,每个文档提取的关键词数为2,并按词性做过滤;span表示TextRank算法中的滑动窗口的大小。评估结果如下:
如果将标注关键词添加到自定义词典中
直观感受下关键词提取结果(添加了自定义词典):
从上述两组实验结果,可以发现:
TextRank与TFIDF均严重依赖于分词结果——如果某词在分词时被切分成了两个词,那么在做关键词提取时无法将两个词黏合在一起(TextRank有部分黏合效果,但需要这两个词均为关键词)。因此是否添加标注关键词进自定义词典,将会造成准确率、召回率大相径庭。
TextRank的效果并不优于TFIDF。
TextRank虽然考虑到了词之间的关系,但是仍然倾向于将频繁词作为关键词。
此外,由于TextRank涉及到构建词图及迭代计算,所以提取速度较慢。
1. 介绍
TextRank由Mihalcea与Tarau于EMNLP'04 [1]提出来,其思想非常简单:通过词之间的相邻关系构建网络,然后用PageRank迭代计算每个节点的rank值,排序rank值即可得到关键词。PageRank本来是用来解决网页排名的问题,网页之间的链接关系即为图的边,迭代计算公式如下:\[
PR(V_i) = (1-d) + d * \sum_{j \in In(V_i)} \frac{1}{|Out(V_j)|}PR(V_j)
\]
其中,\(PR(V_i)\)表示结点\(V_i\)的rank值,\(In(V_i)\)表示结点\(V_i\)的前驱结点集合,\(Out(V_j)\)表示结点\(V_j\)的后继结点集合,\(d\)为damping factor用于做平滑。
网页之间的链接关系可以用图表示,那么怎么把一个句子(可以看作词的序列)构建成图呢?TextRank将某一个词与其前面的N个词、以及后面的N个词均具有图相邻关系(类似于N-gram语法模型)。具体实现:设置一个长度为N的滑动窗口,所有在这个窗口之内的词都视作词结点的相邻结点;则TextRank构建的词图为无向图。下图给出了由一个文档构建的词图(去掉了停用词并按词性做了筛选):
考虑到不同词对可能有不同的共现(co-occurrence),TextRank将共现作为无向图边的权值。那么,TextRank的迭代计算公式如下:
\[
WS(V_i) = (1-d) + d * \sum_{j \in In(V_i)} \frac{w_{ji}}{\sum_{V_k \in Out(V_j)} w_{jk}} WS(V_j)
\]
2. 评估
本小节中,将评估TextRank在关键词提取上的准确、召回与F1-Measure,并与TFIDF做对比。测试数据集是由刘知远老师提供的网易新闻标注数据集。Jieba完整地实现了关键词提取TFIDF与TextRank算法,基于Jieba-0.36的评估实验代码如下:import jieba.analyse import json import codecs with codecs.open(file_path, 'r', 'utf-8') as fr: jieba.analyse.set_stop_words('chinese_stop_word.txt') tp = fn = fp = 0 for line in fr.readlines(): d = json.loads(line) content = d['content'] tags = set(d['tags']) # for tag in tags: # jieba.add_word(tag) words = jieba.analyse.extract_tags(content, topK=2, allowPOS=['ns', 'n', 'vn', 'v', 'nr', 'x']) # trank = jieba.analyse.TextRank() # trank.span = 5 # words = trank.textrank(content, topK=2, allowPOS=['ns', 'n', 'vn', 'v', 'nr', 'x']) cnt = 0 for word in words: if word in tags: tp += 1 cnt += 1 fp += (len(words) - cnt) fn += (len(tags) - cnt) print(tp, fn, fp) print('precision: {}'.format(tp/(tp+fp))) print('recall: {}'.format(tp/(tp+fn))) print('F1: {}'.format(2*tp/(2*tp+fp+fn)))
其中,每个文档提取的关键词数为2,并按词性做过滤;span表示TextRank算法中的滑动窗口的大小。评估结果如下:
方法 | Precision | Recall | F1-Measure |
---|---|---|---|
TFIDF | 0.263 | 0.219 | 0.239 |
TextRank span=5 | 0.244 | 0.204 | 0.222 |
TextRank span=7 | 0.246 | 0.205 | 0.224 |
jieba.add_word(),则评估结果如下:
方法 | Precision | Recall | F1-Measure |
---|---|---|---|
TFIDF | 0.314 | 0.262 | 0.286 |
TextRank span=5 | 0.275 | 0.230 | 0.251 |
TextRank span=7 | 0.278 | 0.232 | 0.253 |
// TFIDF, TextRank, labelled ['文强', '陈洪刚'] ['文强', '陈洪刚'] {'文强', '重庆'} ['内贾德', '伊朗'] ['伊朗', '内贾德'] {'制裁', '世博', '伊朗'} ['调控', '王珏林'] ['调控', '楼市'] {'楼市', '调控'} ['罗平县', '男子'] ['男子', '罗平县'] {'被砍', '副局长', '情感纠葛'} ['佟某', '黄玉'] ['佟某', '黄现忠'] {'盲井', '伪造矿难'} ['女生', '聚众淫乱'] ['女生', '聚众淫乱'] {'聚众淫乱', '东莞', '不雅视频'} ['马英九', '和平协议'] ['马英九', '推进'] {'国台办', '马英九', '和平协议'} ['东帝汶', '巡逻艇'] ['东帝汶', '中国'] {'东帝汶', '军舰', '澳大利亚'} ['墨西哥', '警方'] ['墨西哥', '袭击'] {'枪手', '墨西哥', '打死'}
从上述两组实验结果,可以发现:
TextRank与TFIDF均严重依赖于分词结果——如果某词在分词时被切分成了两个词,那么在做关键词提取时无法将两个词黏合在一起(TextRank有部分黏合效果,但需要这两个词均为关键词)。因此是否添加标注关键词进自定义词典,将会造成准确率、召回率大相径庭。
TextRank的效果并不优于TFIDF。
TextRank虽然考虑到了词之间的关系,但是仍然倾向于将频繁词作为关键词。
此外,由于TextRank涉及到构建词图及迭代计算,所以提取速度较慢。
3. 参考资料
[1] Rada, Mihalcea, and Paul Tarau. "TextRank: Bringing Order into Texts." empirical methods in natural language processing (2004): 404-411.相关文章推荐
- 短文本关键词提取算法RAKE & TextRank及改进
- textrank算法原理与提取关键词、自动提取摘要PYTHON
- TextRank 算法提取关键词的 Java 实现
- TextRank算法提取关键词的Java实现
- 基于TextRank的关键词提取算法
- [NLP技术]关键词提取算法-TextRank
- TextRank算法提取关键词的Java实现
- textrank关键词提取
- 文章关键词提取算法
- 关键词提取算法
- 文本关键词提取算法总结
- 关键词提取算法
- TF-IDF算法自动提取关键词
- textrank提取文档关键词
- jieba关键词提取算法
- TF-IDF提取文章关键词算法
- 文本关键词提取算法
- 基于TextRank的关键词、短语、摘要提取
- 余弦相似性算法之提取关键词
- 文本关键词提取算法