文獻(xiàn)閱讀 — TextRank: Bringing Order into Texts



作者主要做了什么?


在這篇paper中,作者將PageRank算法整合到了TextRank模型中,并應(yīng)用到兩類(lèi)跟排序相關(guān)的自然語(yǔ)言處理任務(wù)中,分別是:

1)關(guān)鍵詞(keyword extraction)提取,即選擇出能夠表達(dá)輸入文本含義的幾個(gè)關(guān)鍵短語(yǔ);

2)句子提取(sentence extraction),即確定輸入文本中最“重要”的幾個(gè)可以用來(lái)建立摘要(summary)的句子。

值得注意一點(diǎn)是,其他基于圖的排序算法,如HITS、Positional Function等,也可以輕松的整合到TextRank模型中。


TextRank是什么?


TextRank是一個(gè)基于圖排序的、用于文本處理的算法。使用TextRank算法,不需要有深入的語(yǔ)言學(xué)和專(zhuān)業(yè)領(lǐng)域知識(shí),它是一個(gè)無(wú)監(jiān)督的算法,這個(gè)特性使得它可以很方便的應(yīng)用到其他領(lǐng)域和語(yǔ)言中。

在文本中使用基于圖的排序算法需要構(gòu)建一張關(guān)系圖來(lái)表達(dá)文本、詞語(yǔ)以及其他實(shí)體。從實(shí)踐的角度出發(fā),詞語(yǔ)、詞語(yǔ)集合、整個(gè)句子等都可以作為圖中的頂點(diǎn),在這些頂點(diǎn)之間建立聯(lián)系,如:詞序關(guān)系、語(yǔ)義關(guān)系、內(nèi)容相似度等,就能夠構(gòu)建一張合適的關(guān)系圖。

由于基于圖的排序算法通過(guò)迭代計(jì)算整張圖的信息來(lái)確定頂點(diǎn)(vertex)重要性,而不是僅僅依賴(lài)頂點(diǎn)的局部信息,因此,基于圖的排序算法,如:HITS、PageRank,在引用分析(citation analysis)、社交網(wǎng)絡(luò)(social network)以及網(wǎng)頁(yè)排序等方面取得成功的應(yīng)用。


TextRank的優(yōu)點(diǎn)有哪些?


  • 無(wú)監(jiān)督學(xué)習(xí),使用者不需要有深入的語(yǔ)言學(xué)或者專(zhuān)業(yè)領(lǐng)域知識(shí);
  • 使用基于圖的排序算法,綜合考慮文本整體的信息來(lái)確定哪些words或者sentences可以更好的表達(dá)文本

不考慮加入圖中的元素的類(lèi)型和特征,如何在文本處理中應(yīng)用基于圖的排序算法?


step 1. 確定最適合當(dāng)前任務(wù)的文本單元集(text units),把它們作為頂點(diǎn)集(vertices)加入到圖中;

step 2. 確定text units之間的關(guān)系,基于這些關(guān)系把邊集(edges)畫(huà)出來(lái),edge可以是有向(directed)/無(wú)向(undirected)的,當(dāng)然,也可以是加權(quán)(weighted)/不加權(quán)(unweighted)的;

step 3. 使用基于圖的排序算法迭代計(jì)算,直到收斂,得到各頂點(diǎn)的重要性得分;

step 4. 根據(jù)各頂點(diǎn)得分對(duì)頂點(diǎn)集進(jìn)行排序,將排序之后的結(jié)果作為輸出。


使用TextRank對(duì)中文進(jìn)行分析


基于這篇paper,letiantian實(shí)現(xiàn)了針對(duì)中文進(jìn)行處理的TextRank算法,即TextRank4ZH。

由于英文中,詞和短語(yǔ)的區(qū)別不是很明顯,這篇paper的作者將英文的keyword extraction和keyphrase extraction統(tǒng)一在keyword extraction這節(jié)中,樣例中也沒(méi)有將keyword和keyphrase進(jìn)行區(qū)分。

但是中文里面的詞和短語(yǔ)區(qū)分非常明顯,關(guān)鍵詞提取和關(guān)鍵短語(yǔ)提取可以認(rèn)為是兩個(gè)不一樣的任務(wù),letiantian在實(shí)現(xiàn)這個(gè)算法的時(shí)候?qū)㈥P(guān)鍵詞提取、關(guān)鍵短語(yǔ)提取進(jìn)行了區(qū)分,分別封裝了兩個(gè)函數(shù):get_keywords和get_keyphrases。


關(guān)鍵詞提?。╧eyword extraction)


關(guān)鍵詞提取是指從文本中確定一些能夠描述文檔含義的術(shù)語(yǔ)的過(guò)程。

對(duì)關(guān)鍵詞提取而言,用于構(gòu)建頂點(diǎn)集(vertices)的文本單元(text unit)可以是句子中的一個(gè)或多個(gè)字;根據(jù)這些字之間的關(guān)系(比如:在一個(gè)框中同時(shí)出現(xiàn))構(gòu)建邊。根據(jù)任務(wù)的需要,可以使用語(yǔ)法過(guò)濾器(syntactic filters)對(duì)頂點(diǎn)集進(jìn)行優(yōu)化。語(yǔ)法過(guò)濾器的主要作用是將某一類(lèi)或者某幾類(lèi)詞性的字過(guò)濾出來(lái)作為頂點(diǎn)集。

step 1. 對(duì)文本進(jìn)行詞性標(biāo)記,這是為了應(yīng)用語(yǔ)法過(guò)濾器而進(jìn)行的預(yù)處理

step 2. 構(gòu)建圖

step 3. 使用PageRank進(jìn)行迭代計(jì)算,得到各頂點(diǎn)的重要性得分,按得分對(duì)頂點(diǎn)進(jìn)行排序

step 4. 將top-N結(jié)果輸出


下面是基于textrank4zh進(jìn)行中文關(guān)鍵詞提取的演示:
點(diǎn)擊下載樣本數(shù)據(jù)

from textrank4zh import TextRank4Keyword

lines = open('./keyword_extraction.data', 'r').readlines()
lines = [line.strip('\n') for line in lines]
text = ' '.join(lines)
tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz'])
#   將動(dòng)詞過(guò)濾掉
tr4w.analyze(text=text, window=2)
#   text       --  文本內(nèi)容,字符串。
#   window     --  窗口大小,int,用來(lái)構(gòu)造單詞之間的邊。默認(rèn)值為2。
kws = tr4w.get_keywords(num=6, word_min_len=2)
#   num           --  返回關(guān)鍵詞數(shù)量
#   word_min_len  --  詞的最小長(zhǎng)度,默認(rèn)值為1
kws

輸出結(jié)果如下:

[{'weight': 0.028586717054060257, 'word': '人工智能'},
 {'weight': 0.026946002730704365, 'word': '人類(lèi)'},
 {'weight': 0.02410264096249914, 'word': '機(jī)器人'},
 {'weight': 0.014908545336161625, 'word': '機(jī)器'},
 {'weight': 0.01362202506014923, 'word': '電影'},
 {'weight': 0.011395769681302775, 'word': '科幻'}]

關(guān)鍵短語(yǔ)提?。╧eyphrase extration)


關(guān)鍵詞提取結(jié)束后,我們可以得到的N個(gè)關(guān)鍵詞,在原始文本中相鄰的關(guān)鍵詞構(gòu)成關(guān)鍵短語(yǔ)。因此,從get_keyphrases函數(shù)的源碼中我們可以看到,它先調(diào)用get_keywords提取關(guān)鍵詞,然后分析關(guān)鍵詞是否存在相鄰的情況,最后確定哪些是關(guān)鍵短語(yǔ)。

get_keyphrases源碼如下:

def get_keyphrases(self, keywords_num = 12, min_occur_num = 2): 
    #  調(diào)用get_keywords提取關(guān)鍵詞
    #  word_min_len默認(rèn)值為1,get_keyphrases函數(shù)不支持修改該參數(shù),實(shí)際使用時(shí)如果不希望出現(xiàn)一個(gè)字的關(guān)鍵詞,
    #  可根據(jù)需要直接修改源碼中的參數(shù)
    keywords_set = set([ item.word for item in self.get_keywords(num=keywords_num, word_min_len = 1)])
    keyphrases = set()
    for sentence in self.words_no_filter:
        one = []
        # 在句子中檢查是否存在若干個(gè)相鄰的關(guān)鍵詞
        for word in sentence:
            if word in keywords_set:
                one.append(word)
            else:
                # 如果存在若干個(gè)關(guān)鍵詞相鄰,就將他們組合成關(guān)鍵短語(yǔ)
                if len(one) >  1:
                    keyphrases.add(''.join(one))
                if len(one) == 0:
                    continue
                else:
                    one = []
        if len(one) >  1:
            keyphrases.add(''.join(one))
    # 判斷phrase在文中出現(xiàn)的次數(shù)是否大于min_occur_num,輸出結(jié)果
    return [phrase for phrase in keyphrases 
            if self.text.count(phrase) >= min_occur_num]

下面是提取中文關(guān)鍵短語(yǔ)的演示:

kws = tr4w.get_keyphrases(keywords_num=20, min_occur_num= 1)
#   keywords_num    --  抽取的關(guān)鍵詞數(shù)量
#   min_occur_num   --  關(guān)鍵短語(yǔ)在文中的最少出現(xiàn)次數(shù)
kws

輸出結(jié)果如下:

['人類(lèi)思維', '人類(lèi)沙文主義', '機(jī)器人定律', '科幻作家', '人類(lèi)社會(huì)', '人類(lèi)智慧']

句子提?。╯entence extraction)


這篇paper中的句子提取任務(wù)主要針對(duì)的是自動(dòng)摘要這個(gè)場(chǎng)景。由于工作中不涉及這個(gè)場(chǎng)景,對(duì)這個(gè)任務(wù)的理解很淺。下面簡(jiǎn)單介紹一下paper中進(jìn)行sentence extraction的主要思想中與keyword extration的不同之處:

  1. 將每一個(gè)sentence作為一個(gè)頂點(diǎn);

  2. 不能再使用“同時(shí)出現(xiàn)”作為頂點(diǎn)之間的聯(lián)系,“同時(shí)出現(xiàn)”在這個(gè)應(yīng)用場(chǎng)景沒(méi)有意義,作為替代,文中根據(jù)兩個(gè)句子之間的內(nèi)容重復(fù)程度來(lái)計(jì)算他們之間的“相似度”,以這個(gè)相似度作為聯(lián)系;

  3. 由于不同句子之間相似度大小不一致,在這個(gè)場(chǎng)景下構(gòu)建的是以相似度大小作為edge權(quán)重的有權(quán)圖。

下面是提取句子的演示:

from textrank4zh import TextRank4Sentence
tr4s = TextRank4Sentence()
tr4s.analyze(text=text, lower=True, source = 'all_filters')
tr4s.get_key_sentences(num=6)

輸出結(jié)果如下:

[{'index': 19,
  'sentence': '直到《機(jī)械姬》(2015年)中,具有獨(dú)立思考能力的智能機(jī)器人“夏娃”才以一個(gè)能通過(guò)“圖靈測(cè)試”,讓男人分辨不出是機(jī)器還是人類(lèi)的形象,而且是以一個(gè)女性“她”的形象,開(kāi)始呈現(xiàn)出人工智能未必都是男性,她也渴望成為人的訴求',
  'weight': 0.01843663608214886},
 {'index': 25,
  'sentence': '人類(lèi)沙文主義:機(jī)器人三定律只存在于貴圈  想要便成人,一個(gè)最主要的緣由是在文藝作品中有了獨(dú)立思考能力的人工智能們渴望擺脫人類(lèi)的奴役',
  'weight': 0.016295422313582313},
 {'index': 71,
  'sentence': '而無(wú)論是機(jī)器人、人造人還是人工智能,處處透著一個(gè)“人”字烙印,標(biāo)志著“非人”和“人造”的雙重含義,亦在同時(shí),讓人類(lèi)有了上帝造人之感',
  'weight': 0.016030835354765443},
 {'index': 38,
  'sentence': '這一思維的集大成者,無(wú)疑是被科幻迷們奉為圭臬的機(jī)器人三定律,或者說(shuō)是在科幻小說(shuō)中理所當(dāng)然的人工智能設(shè)定:  第一定律:機(jī)器人不得傷害人類(lèi),或因不作為使人類(lèi)受到傷害',
  'weight': 0.015822579189346337},
 {'index': 47,
  'sentence': '而另一位人工智能理論研究者本·格策爾給出的答案更加讓人有顛覆之感:阿西莫夫的未來(lái)社會(huì)是光天化日的基質(zhì)沙文主義,人類(lèi)擁有的權(quán)利比人形機(jī)器人的權(quán)利更多',
  'weight': 0.015683710871720248},
 {'index': 100,
  'sentence': '或者說(shuō),類(lèi)似機(jī)器或西蒙妮這樣的人工智能形象,更符合人類(lèi)給予人工智能的設(shè)定,即他和她之外的第三人,配合、輔助、參與、完善和實(shí)現(xiàn)人類(lèi)的最終幻想,或許也是覺(jué)醒后的人工智能的最終幻想,而非簡(jiǎn)單的以暴易暴式對(duì)抗',
  'weight': 0.015327223889169753}]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載請(qǐng)聲明出處。到這里才發(fā)現(xiàn)簡(jiǎn)書(shū)不支持Mathjax,真蛋疼,要看公式的話(huà)還是到我的博客上看,留言就在這里留吧,我...
    TonLP閱讀 2,805評(píng)論 0 6
  • 最近人工智能隨著AlphaGo戰(zhàn)勝李世乭這一事件的高關(guān)注度,重新掀起了一波新的關(guān)注高潮,有的說(shuō)人工智能將會(huì)如何超越...
    MiracleJQ閱讀 3,127評(píng)論 2 1
  • 怎樣上網(wǎng)、看書(shū)、交談......如何能更高效地把別人的經(jīng)驗(yàn)內(nèi)化為自己的行動(dòng)? 以看書(shū)舉例,上網(wǎng)和交談內(nèi)化知識(shí)的原理...
    王丁一閱讀 642評(píng)論 2 3
  • 瓜 一片土地 一條水溝 兩種瓜 一個(gè)努力爬著 一個(gè)開(kāi)心躺著 一個(gè)甜 一個(gè)苦 它有個(gè)好聽(tīng)的名字 叫青門(mén)綠玉房 它有個(gè)...
    木駒閱讀 376評(píng)論 1 1
  • 可以說(shuō),電影《老炮兒》是一部讓人看完之后心情沉重的電影,我相信大多數(shù)人跟我的感受應(yīng)該是一樣的。電影里充斥著太多底層...
    重慶森林cqsenlin閱讀 1,152評(píng)論 6 13

友情鏈接更多精彩內(nèi)容