jieba分詞庫——基於 TextRank 演算法的關鍵詞抽取
阿新 • • 發佈:2022-03-09
基於 TextRank 演算法的關鍵詞抽取
TextRank 由 Mihalcea 與 Tarau 於 EMNLP 在2014年提出來,其思想非常簡單。關鍵詞抽取的任務就是從一段給定的文字中自動抽取出若干有意義的調語或片語。 TextRank 演算法是利用區域性調匯之間關係《共現視窗)對後續關鍵詞進行排序,直接從文字本身抽取
- 定義:通過詞之間的相鄰關係構建網路,然後用 PageRank 迭代計算毎個節點的 rank 值,排序 rank 值即可得到關鍵詞
- 方法:利用圖模型來提取文章中的關鍵詞步驟
基於 TextRank 的關鍵詞提取過程步驟如下:
- 把給定的文字按照完整句子進行分割,對於每個句子。進行分詞和詞性標註處理,並過濾掉停用詞,只保留指定詞性得單詞
- 構建候選關鍵詞圖 G -(. E ),其中 V 為節點集,上一步生成的候選關鍵片語成,然後採用共現關係( co - occurrence )構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的詞彙在長度為 K 的國口中共曾量更新現, K 表示視窗大小,即最多共現 K 個單詞。根據上面公式,迭代傳播各節點的權重,直至收斂。
- 對節點權重進行倒序排序,從而得到最裡要的 T 個單詞,作為候選關鏞詞。第二部得到最裡要的 T 個單詞,在原始文字中進行標記,著形成相鄰片語,則組合成多詞關鍵詞。例如。文字中有句子" Matlab code for plotting ambiguity function ",如果“ Matlab "和" code "均屬於候選關鍵詞,則組合成“ Matlab與召回排序計算code "加入關鍵詞序列。
詞性和專名類別標籤集合如下表,其中我們將最常用的4個專名類別標記為大寫的形式:(https://github.com/baidu/lac)
用法示例:
def textrank(partition): import os import jieba import jieba.analyse import jieba.posseg as pseg import codecs class TextRank(jieba.analyse.TextRank): def __init__(self, window=20, word_min_len=2): super(TextRank, self).__init__() self.span = window # 視窗大小 self.word_min_len = word_min_len # 單詞的最小長度 # 要保留的詞性,根據jieba github ,具體參見https://github.com/baidu/lac self.pos_filt = frozenset( ('n', 'x', 'eng', 'f', 's', 't', 'nr', 'ns', 'nt', "nw", "nz", "PER", "LOC", "ORG")) def pairfilter(self, wp): """過濾條件,返回True或者False""" if wp.flag == "eng": if len(wp.word) <= 2: return False if wp.flag in self.pos_filt and len(wp.word.strip()) >= self.word_min_len \ and wp.word.lower() not in stopwords_list: return True # TextRank過濾視窗大小為5,單詞最小為2 textrank_model = TextRank(window=5, word_min_len=2) allowPOS = ('n', "x", 'eng', 'nr', 'ns', 'nt', "nw", "nz", "c") for row in partition: tags = textrank_model.textrank(row.sentence, topK=20, withWeight=True, allowPOS=allowPOS, withFlag=False) for tag in tags: yield row.article_id, row.channel_id, tag[0], tag[1]