TextRank算法介紹及實現

目錄

1、PageRank算法

2、TextRank算法

(1)關鍵詞抽取(keyword extraction)

(2)關鍵短語抽取(keyphrase extration)

(3)關鍵句抽取(sentence extraction)

3、TextRank算法實現

(1)基於Textrank4zh的TextRank算法實現

(2)基於jieba的TextRank算法實現

(3)基於SnowNLP的TextRank算法實現

4、PageRank算法與TextRank算法的區別


1、PageRank算法

PageRank算法通過計算網頁鏈接的數量和質量來粗略估計網頁的重要性,算法創立之初即應用在谷歌的搜索引擎中,對網頁進行排名。 

PageRank算法的核心思想如下:

(1)鏈接數量:如果一個網頁被越多的其他網頁鏈接,說明這個網頁越重要,即該網頁的PR值(PageRank值)會相對較高;

(2)鏈接質量:如果一個網頁被一個越高權值的網頁鏈接,也能表明這個網頁越重要,即一個PR值很高的網頁鏈接到一個其他網頁,那麼被鏈接到的網頁的PR值會相應地因此而提高。

PageRank算法計算公式

PageRank算法論文The PageRank Citation Ranking: Bringing Order to the Web

2、TextRank算法

TextRank算法是一種基於圖的用於關鍵詞抽取和文檔摘要的排序算法,由谷歌的網頁重要性排序算法PageRank算法改進而來,它利用一篇文檔內部的詞語間的共現信息(語義)便可以抽取關鍵詞,它能夠從一個給定的文本中抽取出該文本的關鍵詞、關鍵詞組,並使用抽取式的自動文摘方法抽取出該文本的關鍵句。

TextRank算法的基本思想是將文檔看作一個詞的網絡,該網絡中的鏈接表示詞與詞之間的語義關係。

TextRank算法計算公式

TextRank算法論文TextRank: Bringing Order into Texts

TextRank算法主要包括:關鍵詞抽取、關鍵短語抽取、關鍵句抽取。

(1)關鍵詞抽取(keyword extraction)

關鍵詞抽取是指從文本中確定一些能夠描述文檔含義的術語的過程。對關鍵詞抽取而言,用於構建頂點集的文本單元可以是句子中的一個或多個字;根據這些字之間的關係(比如:在一個框中同時出現)構建邊。根據任務的需要,可以使用語法過濾器(syntactic filters)對頂點集進行優化。語法過濾器的主要作用是將某一類或者某幾類詞性的字過濾出來作爲頂點集。

(2)關鍵短語抽取(keyphrase extration)

關鍵詞抽取結束後,我們可以得到的N個關鍵詞,在原始文本中相鄰的關鍵詞構成關鍵短語。因此,從get_keyphrases函數的源碼中我們可以看到,它先調用get_keywords抽取關鍵詞,然後分析關鍵詞是否存在相鄰的情況,最後確定哪些是關鍵短語。

(3)關鍵句抽取(sentence extraction)

句子抽取任務主要針對的是自動摘要這個場景,將每一個sentence作爲一個頂點,根據兩個句子之間的內容重複程度來計算他們之間的“相似度”,以這個相似度作爲聯繫,由於不同句子之間相似度大小不一致,在這個場景下構建的是以相似度大小作爲edge權重的有權圖。

3、TextRank算法實現

(1)基於Textrank4zh的TextRank算法實現

# coding=utf-8
from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba.analyse
from snownlp import SnowNLP
import pandas as pd
import numpy as np

#關鍵詞抽取
def keywords_extraction(text):
    tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz'])
    # allow_speech_tags   --詞性列表,用於過濾某些詞性的詞
    tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
                 pagerank_config={'alpha': 0.85, })
    # text    --  文本內容,字符串
    # window  --  窗口大小,int,用來構造單詞之間的邊。默認值爲2
    # lower   --  是否將英文文本轉換爲小寫,默認值爲False
    # vertex_source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來構造pagerank對應的圖中的節點
    #                -- 默認值爲`'all_filters'`,可選值爲`'no_filter', 'no_stop_words', 'all_filters'
    # edge_source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來構造pagerank對應的圖中的節點之間的邊
    #              -- 默認值爲`'no_stop_words'`,可選值爲`'no_filter', 'no_stop_words', 'all_filters'`。邊的構造要結合`window`參數

    # pagerank_config  -- pagerank算法參數配置,阻尼係數爲0.85
    keywords = tr4w.get_keywords(num=6, word_min_len=2)
    # num           --  返回關鍵詞數量
    # word_min_len  --  詞的最小長度,默認值爲1
    return keywords

#關鍵短語抽取
def keyphrases_extraction(text):
    tr4w = TextRank4Keyword()
    tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
                 pagerank_config={'alpha': 0.85, })
    keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1)
    # keywords_num    --  抽取的關鍵詞數量
    # min_occur_num   --  關鍵短語在文中的最少出現次數
    return keyphrases

#關鍵句抽取
def keysentences_extraction(text):
    tr4s = TextRank4Sentence()
    tr4s.analyze(text, lower=True, source='all_filters')
    # text    -- 文本內容,字符串
    # lower   -- 是否將英文文本轉換爲小寫,默認值爲False
    # source  -- 選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個來生成句子之間的相似度。
    # 		  -- 默認值爲`'all_filters'`,可選值爲`'no_filter', 'no_stop_words', 'all_filters'
    # sim_func -- 指定計算句子相似度的函數

    # 獲取最重要的num個長度大於等於sentence_min_len的句子用來生成摘要
    keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6)
    return keysentences


def keywords_textrank(text):
    keywords = jieba.analyse.textrank(text, topK=6)
    return keywords


if __name__ == "__main__":
    text = "來源:中國科學報本報訊(記者肖潔)又有一位中國科學家喜獲小行星命名殊榮!4月19日下午,中國科學院國家天文臺在京舉行“周又元星”頒授儀式," \
           "我國天文學家、中國科學院院士周又元的弟子與後輩在歡聲笑語中濟濟一堂。國家天文臺黨委書記、" \
           "副臺長趙剛在致辭一開始更是送上白居易的詩句:“令公桃李滿天下,何須堂前更種花。”" \
           "據介紹,這顆小行星由國家天文臺施密特CCD小行星項目組於1997年9月26日發現於興隆觀測站," \
           "獲得國際永久編號第120730號。2018年9月25日,經國家天文臺申報," \
           "國際天文學聯合會小天體聯合會小天體命名委員會批准,國際天文學聯合會《小行星通報》通知國際社會," \
           "正式將該小行星命名爲“周又元星”。"
    #關鍵詞抽取
    keywords=keywords_extraction(text)
    print(keywords)

    #關鍵短語抽取
    keyphrases=keyphrases_extraction(text)
    print(keyphrases)

    #關鍵句抽取
    keysentences=keysentences_extraction(text)
    print(keysentences)

運行結果:

(2)基於jieba的TextRank算法實現

if __name__ == "__main__":
    text = "來源:中國科學報本報訊(記者肖潔)又有一位中國科學家喜獲小行星命名殊榮!4月19日下午,中國科學院國家天文臺在京舉行“周又元星”頒授儀式," \
           "我國天文學家、中國科學院院士周又元的弟子與後輩在歡聲笑語中濟濟一堂。國家天文臺黨委書記、" \
           "副臺長趙剛在致辭一開始更是送上白居易的詩句:“令公桃李滿天下,何須堂前更種花。”" \
           "據介紹,這顆小行星由國家天文臺施密特CCD小行星項目組於1997年9月26日發現於興隆觀測站," \
           "獲得國際永久編號第120730號。2018年9月25日,經國家天文臺申報," \
           "國際天文學聯合會小天體聯合會小天體命名委員會批准,國際天文學聯合會《小行星通報》通知國際社會," \
           "正式將該小行星命名爲“周又元星”。"

    # 基於jieba的textrank算法實現
    keywords=keywords_textrank(text)
    print(keywords)

運行結果:

(3)基於SnowNLP的TextRank算法實現

    # 基於SnowNLP的textrank算法實現
    snlp=SnowNLP(text)
    print(snlp.keywords(6))  #關鍵詞抽取
    print(snlp.summary(3))   #關鍵句抽取

運行結果:

4、PageRank算法與TextRank算法的區別

  • PageRank算法根據網頁之間的鏈接關係構造網絡,TextRank算法根據詞之間的共現關係構造網絡;
  • PageRank算法構造的網絡中的邊是有向無權邊,TextRank算法構造的網絡中的邊是無向有權邊。

 

參考:TextRank算法的基本原理及textrank4zh使用實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章