作者:LogM
本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~
1. 概述
TextRank 论文地址:https://www.aclweb.org/anthology/W04-3252
上一篇博客 TextRank C++ 版本 提到,两位大佬的代码还有改进空间,所以我自己也实现了一个版本。
2. 致谢
首先要非常感谢 3 位大佬,我的代码是借鉴了他们 3 人的代码实现的。
主要借鉴的点:letiantian 对中文的处理;comoody 对图的构建;lostfish 对 PageRank 的实现。
letiantian: https://github.com/letiantian/TextRank4ZH.git
comoody: https://github.com/comoody/TextRank.git
lostfish: https://github.com/lostfish/textrank.git
3. 我自己的实现
Github 地址:https://github.com/imLogM/TextRank_Cpp.git
原本我是给自己定的以下几个目标:
a. 遵循原论文思路;
b. 代码简洁;
c. 优化计算速度;
d. 考虑异常输入。
后来我发现,要 b、c、d 兼得真的好难。为了加速计算速度,用空间换时间,把一些计算中间值单拎了出来,代码简洁度 –。为了应对用户各种奇葩的输入,写了很多判断语句,代码简洁度 –。
还是,就是为了兼容旧的编译器,range-based for loop
和 匿名函数
是肯定不能用的,代码简洁度 –。
4. 注意事项
代码里面会有 xxxx::toLowerCase()
和 xxxx::split()
这两个奇怪的函数。这是因为我自己实现的时候用的特殊的字符串处理库,你们使用时需要自己找库来替换,当然,这两个函数自己写貌似也没特别大的难度。