關鍵詞提取之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慢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM