TextRank 提取关键词

如上一篇博文所立下的 flag, 本篇开始填坑

TextRank 就不多介绍了, 来自 PageRank 公式很简单, 相关资料一堆, 大家一看便知;
不知道是否有人和我一样对 TextRank 的公式抱有疑惑, 尤其是构建图结构的部分, 接下来我们慢慢揭开新谜团

公式说明:
d 阻尼系数 默认0.85
In(Vi) 权重
Out(Vj) 相关词个数
需要迭代收敛

###1. 预处理
分词, 去词性, 去空白, 去标点符号, 去停用词,

2. 构建图

这一步很重要, 我开始一直没看明白, 直到看到一份代码, 仔细打印 log 日志才明了; 假设我们有以下语料

机器学习是人工智能的一个分支。人工智能的研究是从以“推理”为重点到以“知识”为重点,再到以“学习”为重点,一条自然、清晰的脉络。

预处理后得到

机器, 学习, 人工智能, 分支, 人工智能, 研究, 是从, 推理, 重点, 知识, 重点, 学习, 重点, 脉络

然后按论文所述以 4 构建窗口

[ 机器 ] 学习, 人工智能, 分支
[ 学习 ] 人工智能, 研究, 机器, 分支
[ 人工智能 ] 学习, 是从, 研究, 机器, 分支
[ 分支 ] 是从, 机器, 人工智能, 学习, 研究, 推理
[ 人工智能 ] 是从, 机器, 研究, 推理, 学习, 重点, 分支
[ 研究 ] 是从, 人工智能, 推理, 知识, 学习, 重点, 分支
[ 是从 ] 人工智能, 推理, 知识, 研究, 重点, 分支
[ 推理 ] 是从, 人工智能, 知识, 学习, 研究, 重点, 分支
[ 重点 ] 是从, 人工智能, 知识, 学习, 研究, 推理
[ 知识 ] 是从, 脉络, 研究, 重点, 学习, 推理
[ 重点 ] 是从, 脉络, 人工智能, 知识, 学习, 研究, 推理
[ 学习 ] 机器, 脉络, 人工智能, 推理, 知识, 研究, 重点, 分支
[ 重点 ] 是从, 脉络, 人工智能, 知识, 学习, 研究, 推理
[ 脉络 ] 学习, 知识, 重点

代码在 Github, 大概步骤是

 for i in n
   使用 python 的 `Counter` 类计数
   窗口范围是 i-4 ~ i+4
   如果 i-4 < 0, 超出范围, 就取 word_list[:window+1+i]
   如果 i-4 > 0 and i+4 < n, 刚好在范围内, 正常取值
   剩下的情况就是 i+4 > n, 超出范围 word_list[i-4:]
   取值后移除 word_list[i], 即窗口中心位置
 迭代结束, 即统计出词频

我以为是这样构造的
[w1,w2,…,wk]、[w2,w3,…,wk+1]、[w3,w4,…wk+2], 结果就..

实际上, 我们构造了许多 Counter, 利用 Counter计算词频

[学习: 1, 人工智能: 2, 分支: 1]
[人工智能: 2, 研究: 1, 机器: 1, 分支: 1]
[学习: 1, 是从: 1, 研究: 1, 机器: 1, 分支: 1]
[是从: 1, 机器: 1, 人工智能: 2, 学习: 1, 研究: 1, 推理: 1]
[是从: 2, 机器: 2, 研究: 2, 推理: 1, 学习: 2, 重点: 1, 分支: 2]
[是从: 1, 人工智能: 2, 推理: 1, 知识: 1, 学习: 1, 重点: 1, 分支: 1]
[人工智能: 2, 推理: 1, 知识: 1, 研究: 1, 重点: 2, 分支: 1]
[是从: 1, 人工智能: 1, 知识: 1, 学习: 1, 研究: 1, 重点: 2, 分支: 1]
[是从: 1, 人工智能: 1, 知识: 1, 学习: 1, 研究: 1, 推理: 1]
[是从: 1, 脉络: 1, 研究: 1, 重点: 3, 学习: 1, 推理: 1]
[是从: 2, 脉络: 1, 人工智能: 1, 知识: 2, 学习: 2, 研究: 1, 推理: 2]
[机器: 1, 脉络: 1, 人工智能: 2, 推理: 1, 知识: 1, 研究: 1, 重点: 3, 分支: 1]
[是从: 2, 脉络: 2, 人工智能: 1, 知识: 3, 学习: 3, 研究: 1, 推理: 2]
[学习: 1, 知识: 1, 重点: 2]

根据公式计算

到现在位置, 所有的值都有了, 把上面的公式带入即可
结果

重点 1.58155891975
人工智能 1.39039042515
学习 1.27490524093
知识 0.953759142095
研究 0.949008599048
推理 0.946782367798
是从 0.946755776582
分支 0.86448073234
机器 0.550460042232
脉络 0.541898754083

代码在 Github

相关博客:
http://ihong-blog.logdown.com/posts/873914
http://www.letiantian.me/2014-12-01-text-rank/