TextRank算法

TextRank算法

TD-IDF是基於詞頻的算法,而TextRank是基於圖 形的算法。python

TextRank是受到PageRank算法的啓發。web

 

PageRank算法

PageRank主要用於對在線搜索結果中的網頁進行排序算法

PageRank對於每一個網頁頁面都給出一個正實數,表示網頁的重要程度,PageRank值越高,表示網頁越重要,在互聯網搜索的排序中越可能被排在前面。一樣,被連接的網頁的PageRank值也會相應的所以而提升。網絡

假設整個互聯網是一個有向圖,節點是網頁,每條邊是轉移機率。網頁瀏覽者在每一個頁面上依照鏈接出去的超連接,以等機率跳轉到下一個網頁,而且在網頁上持續不斷地進行這樣的隨機跳轉,這個過程造成了一階馬爾科夫鏈,好比下圖:
在這裏插入圖片描述
  每一個笑臉是一個網頁,既有其餘網頁跳轉到該網頁,該網頁也會跳轉到其餘網頁。在不斷地跳轉以後,這個馬爾科夫鏈會造成一個平穩分佈,而PageRank就是這個平穩分佈,每一個網頁的PageRank值就是平穩機率。app

  PageRank的核心公式是PageRank值的計算公式。公式以下:
函數

  其中,PR(Vi)表示結點Vi的rank值,In(Vi)表示結點Vi的前驅結點集合,Out(Vj)表示結點Vj的後繼結點集合。
  這個公式來自於《統計學習方法》,等號右邊的平滑項(經過某種處理,避免一些突變的畸形值,儘量接近實際狀況)不是(1-d),而是(1-d)/n。
  阻尼係數d(damping factor)的意義是,在任意時刻,用戶到達某頁面後並繼續向後瀏覽的機率。1-d就是用戶中止點擊,隨機跳到新URL的機率。
  加平滑項是由於有些網頁沒有跳出去的連接,那麼轉移到其餘網頁的機率將會是0,這樣就沒法保證存在馬爾科夫鏈的平穩分佈。
  因而,咱們假設網頁以等機率(1/n)跳轉到任何網頁,再按照阻尼係數d,對這個等機率(1/n)與存在連接的網頁的轉移機率進行線性組合,那麼馬爾科夫鏈必定存在平穩分佈,必定能夠獲得網頁的PageRank值。學習

  因此PageRank的定義意味着網頁瀏覽者按照如下方式在網上隨機遊走:以機率d按照存在的超連接隨機跳轉,以等機率從超連接跳轉到下一個頁面;或以機率(1-d)進行徹底隨機跳轉,這時以等機率(1/n)跳轉到任意網頁。ui

  PageRank的計算是一個迭代過程,先假設一個初始的PageRank分佈,經過迭代,不斷計算全部網頁的PageRank值,直到收斂爲止,也就是:
在這裏插入圖片描述spa

 

 

從PageRank到TextRank算法

  和基於詞頻( TF-IDF )相比,TextRank進一步考慮了文檔內詞條之間的語義關係也就是說考慮到額這個詞條的上下文,若是這個詞的上下文都是一些很重要的詞,那麼這個詞大機率也是很重要的詞。  code

基本原理:

  • 將文檔按照整句進行分割
  • 分詞並清理,只保留指定詞性的詞條
  • 以整句爲單位計算詞條的共現矩陣(主要用於發現主題,解決詞向量相近關係的表示 ),只要在一個句子裏出現,就要考慮共現性了,
  • 按指定窗口長度K,構建詞條網絡
  • 基於網絡鏈接特徵計算詞條重要性
  • 排序並輸出結果

 

 

 

TextRank算法介紹

TextRank

TextRank 算法是一種用於文本的基於圖的排序算法。其基本思想來源於谷歌的 PageRank算法, 經過把文本分割成若干組成單元(單詞、句子)並創建圖模型, 利用投票機制對文本中的重要成分進行排序, 僅利用單篇文檔自己的信息便可實現關鍵詞提取、文摘。和 LDA、HMM 等模型不一樣, TextRank不須要事先對多篇文檔進行學習訓練, 因其簡潔有效而獲得普遍應用。

  TextRank 通常模型能夠表示爲一個有向有權圖 G =(V, E), 由點集合 V和邊集合 E 組成, E 是V ×V的子集。圖中任兩點 Vi , Vj 之間邊的權重爲 wji , 對於一個給定的點 Vi, In(Vi) 爲 指 向 該 點 的 點 集 合 , Out(Vi) 爲點 V指向的點集合。點 Vi 的得分定義以下:

 

  其中, d 爲阻尼係數, 取值範圍爲 0 到 1, 表明從圖中某一特定點指向其餘任意點的機率, 通常取值爲 0.85。使用TextRank 算法計算圖中各點的得分時, 須要給圖中的點指定任意的初值, 並遞歸計算直到收斂, 即圖中任意一點的偏差率小於給定的極限值時就能夠達到收斂, 通常該極限值取 0.0001。

1. 基於TextRank的關鍵詞提取

  關鍵詞抽取的任務就是從一段給定的文本中自動抽取出若干有意義的詞語或詞組。TextRank算法是利用局部詞彙之間關係(共現窗口)對後續關鍵詞進行排序,直接從文本自己抽取。其主要步驟以下:

  (1)把給定的文本T按照完整句子進行分割,即

  (2)對於每一個句子,進行分詞和詞性標註處理,並過濾掉停用詞,只保留指定詞性的單詞,如名詞、動詞、形容詞,即,其中是保留後的候選關鍵詞。

  (3)構建候選關鍵詞圖G = (V,E),其中V爲節點集,由(2)生成的候選關鍵詞組成,而後採用共現關係(co-occurrence)構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的詞彙在長度爲K的窗口中共現,K表示窗口大小,即最多共現K個單詞。

  (4)根據上面公式,迭代傳播各節點的權重,直至收斂。

  (5)對節點權重進行倒序排序,從而獲得最重要的T個單詞,做爲候選關鍵詞。 

  (6)由(5)獲得最重要的T個單詞,在原始文本中進行標記,若造成相鄰詞組,則組合成多詞關鍵詞。例如,文本中有句子「Matlab code for plotting ambiguity function」,若是「Matlab」和「code」均屬於候選關鍵詞,則組合成「Matlab code」加入關鍵詞序列。

用jieba實現TextRank算法

  

from gensim.corpora import Dictionary

import wordcloud
import pandas as pd
import jieba
import jieba.analyse
import matplotlib.pyplot as plt
from nltk.corpus import brown

from sklearn.feature_extraction.text import CountVectorizer

# 數據準備
# ============================================================================================================
#
raw = pd.read_table('./金庸-射鵰英雄傳txt精校版.txt',names=['txt'],encoding='GBK')
# print(raw)

# 加入章節標識
# 章節判斷用變量預處理
def m_head(tmpstr):
    return tmpstr[:1]  #取第一個字

def m_mid(tmpstr):
    return tmpstr.find("")

# 用apply函數將下面的屬性加入到對應列
raw['head'] = raw.txt.apply(m_head)
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)


# 章節判斷
chapnum = 0
for i in range(len(raw)):
    if raw['head'][i] == "" and raw['mid'][i] >0 and raw['len'][i]<30:
        chapnum += 1
    if chapnum >= 40 and raw['txt'][i] == "附錄一:成吉思汗家族":
        chapnum=0
    raw.loc[i,'chap'] = chapnum

# 刪除臨時變量
del raw['head']
del raw['mid']
del raw['len']

# 段落聚合  根據章節聚合
rawgrp = raw.groupby('chap')

chapter = rawgrp.agg(sum)

chapter = chapter[chapter.index != 0]
# 設定分詞以及清理停用詞函數
# 先用pandas將停用詞讀出,存到變量w中,最後取出w,轉爲list
stoplist = list(pd.read_csv('停用詞.txt',names=['w'],sep='aaa',encoding='utf-8',engine='python').w)
# 清理停用詞哈數
def m_cut(intxt):
    return [w for w in jieba.cut(intxt) if w not in stoplist and len(w)>1]
countvec = CountVectorizer()

analyze = countvec.build_analyzer()
# 使用空格分開
t = analyze('郭靖 和 哀牢山 三十六 劍 。')
# 默認刪去停用詞列表中的詞和符號
print(t)
# ['郭靖', '哀牢山', '三十六']


#
# ============================================================================================================
# 數據準備結束


# TextRank算法的jieba實現

# 對射鵰英雄傳的第一章進行關鍵詞抓取,取前20個
t = jieba.analyse.textrank(
    chapter.txt[1],
    topK=20,#詞頻前20
    withWeight=True
)
# 默認是過濾詞性的 也就是allowPOS=('ns','n','vn','v')  默認值
print(t)
# 這個結果和前面的TF-IDF結果差別較大,由於TextRank算法過濾掉了一些詞性,只保留了名詞和動詞
# [('官兵', 1.0), ('武官', 0.9334143199050102), ('丘處機', 0.7358359699167335), ('娘子', 0.6744231421648419), ('丈夫', 0.5830294283456839), ('金兵', 0.5781198085682175), ('臨安', 0.5770670188243039), ('說道', 0.5770566609658306), ('小人', 0.5090129786491732), ('只見', 0.4571074590990817), ('皇帝', 0.44602714989497655), ('出來', 0.44153726005111005), ('妻子', 0.3806600930485957), ('道人', 0.37477396448704836), ('道長', 0.3700338339927484), ('百姓', 0.326847924487172), ('短劍', 0.30052710293852547), ('雙手', 0.29602787925127344), ('心想', 0.29137224579945303), ('貧道', 0.28869640746976294)]
相關文章
相關標籤/搜索