作者: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()
這兩個奇怪的函數。這是因爲我自己實現的時候用的特殊的字符串處理庫,你們使用時需要自己找庫來替換,當然,這兩個函數自己寫貌似也沒特別大的難度。