1. 程式人生 > >Python的jieba分詞及TF-IDF和TextRank 演算法提取關鍵字

Python的jieba分詞及TF-IDF和TextRank 演算法提取關鍵字

參考文章:Github上的專案———jieba

中文分詞

對於NLP(自然語言處理)來說,分詞是一步重要的工作,市面上也有各種分詞庫,11款開放中文分詞系統比較

1.基於詞典:基於字典、詞庫匹配的分詞方法;(字串匹配、機械分詞法) 
2.基於統計:基於詞頻度統計的分詞方法; 
3.基於規則:基於知識理解的分詞方法。

  • 第一類方法應用詞典匹配、漢語詞法或其它漢語語言知識進行分詞,如:最大匹配法、最小分詞方法等。這類方法簡單、分詞效率較高,但漢語語言現象複雜豐富,詞典的完備性、規則的一致性等問題使其難以適應開放的大規模文字的分詞處理。
  • 第二類基於統計的分詞方法則基於字和詞的統計資訊,如把相鄰字間的資訊、詞頻及相應的共現資訊等應用於分詞,由於這些資訊是通過調查真實語料而取得的,因而基於統計的分詞方法具有較好的實用性。

jieba分詞,完全開源,有整合的python庫,簡單易用。 
jieba分詞是基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG),動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合

安裝jieba

在安裝有python3 和 pip 的機子上,安裝jieba庫很簡單,使用pip即可:

pip install jieba
  • 1

這裡寫圖片描述

jieba分詞特性

  1. 支援三種分詞模式:

    • 精確模式,試圖將句子最精確地切開,適合文字分析;
    • 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
    • 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。
  2. 支援繁體分詞

  3. 支援自定義詞典
  4. MIT 授權協議

主要功能


分詞


  • jieba.cut : 方法接受三個輸入引數: 需要分詞的字串;cut_all 引數用來控制是否採用全模式;HMM 引數用來控制是否使用 HMM 模型
  • jieba.cut_for_search : 方法接受兩個引數:需要分詞的字串;是否使用 HMM 模型。該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細
  • 待分詞的字串可以是 unicode 或 UTF-8 字串、GBK 字串。注意:不建議直接輸入 GBK 字串,可能無法預料地錯誤解碼成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 迴圈來獲得分詞後得到的每一個詞語(unicode),或者用jieba.lcut 以及jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) : 新建自定義分詞器,可用於同時使用不同詞典。jieba.dt 為預設分詞器,所有全域性分詞相關函式都是該分詞器的對映。
# 官方例程

# encoding=utf-8
import jieba

seg_list = jieba.cut("我來到北京清華大學", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精確模式

seg_list = jieba.cut("他來到了網易杭研大廈")  # 預設是精確模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造")  # 搜尋引擎模式
print(", ".join(seg_list))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學 
【精確模式】: 我/ 來到/ 北京/ 清華大學 
【新詞識別】:他, 來到, 了, 網易, 杭研, 大廈 (此處,“杭研”並沒有在詞典中,但是也被Viterbi演算法識別出來了) 
【搜尋引擎模式】: 小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造


關鍵詞提取


基於 TF-IDF(term frequency–inverse document frequency) 演算法的關鍵詞抽取

import jieba.analyse

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

  • sentence :為待提取的文字
  • topK: 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
  • withWeight : 為是否一併返回關鍵詞權重值,預設值為 False
  • allowPOS : 僅包括指定詞性的詞,預設值為空,即不篩選
# 基於TF-IDF演算法的關鍵詞抽取

import jieba
import jieba.analyse

sentence = '全國港澳研究會會長徐澤在會上發言指出,學習系列重要講話要深刻領會 主席關於香港迴歸後的憲制基礎和憲制秩序的論述,這是過去20年特別是中共十八大以來"一國兩制"在香港實踐取得成功的根本經驗。首先,要在夯實 香港的憲制基礎、鞏固香港的憲制秩序上著力。只有牢牢確立起"一國兩制"的憲制秩序,才能保證"一國兩制"實踐不走樣 、不變形。其次,要在完善基本法實施的制度和機制上用功。中央直接行使的權力和特區高度自治權的結合是特區憲制秩 序不可或缺的兩個方面,同時必須切實建立以行政長官為核心的行政主導體制。第三,要切實加強香港社會特別是針對公 職人員和青少年的憲法、基本法宣傳,牢固樹立"一國"意識,堅守"一國"原則。第四,要努力在全社會形成聚焦發展、抵 制泛政治化的氛圍和勢能,全面準確理解和落實基本法有關經濟事務的規定,使香港繼續在國家發展中發揮獨特作用並由 此讓最廣大民眾獲得更實在的利益。'

keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n','nr','ns'))

# print(type(keywords))
# <class 'list'>

for item in keywords:
    print(item[0],item[1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

執行結果: 
這裡寫圖片描述

基於 TextRank 演算法的關鍵詞抽取

  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,介面相同,注意預設過濾詞性。
  • jieba.analyse.TextRank() 新建自定義 TextRank 例項

基本思想:

  • 將待抽取關鍵詞的文字進行分詞
  • 以固定視窗大小(預設為5,通過span屬性調整),詞之間的共現關係,構建圖
  • 計算圖中節點的PageRank,注意是無向帶權圖
# 基於TextRank演算法的關鍵詞抽取

keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n','nr','ns'))

# type(keywords)
# <class 'list'>

for item in keywords:
    print(item[0],item[1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

執行結果:

這裡寫圖片描述


詞性標註


  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 引數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為預設詞性標註分詞器。
  • 標註句子分詞後每個詞的詞性,採用和 ictclas 相容的標記法。
# 官方例程
import jieba.posseg as pseg

words = pseg.cut("我愛北京天安門")
# words類別為:generator

for word, flag in words:
    print('%s %s' % (word, flag))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

執行結果:

我 r 
愛 v 
北京 ns 
天安門 ns

詞性對照表

  1. 名詞 (1個一類,7個二類,5個三類) 
    名詞分為以下子類: 
    n 名詞 
    nr 人名 
    nr1 漢語姓氏 
    nr2 漢語名字 
    nrj 日語人名 
    nrf 音譯人名 
    ns 地名 
    nsf 音譯地名 
    nt 機構團體名 
    nz 其它專名 
    nl 名詞性慣用語 
    ng 名詞性語素
  2. 時間詞(1個一類,1個二類) 
    t 時間詞 
    tg 時間詞性語素
  3. 處所詞(1個一類) 
    s 處所詞
  4. 方位詞(1個一類) 
    f 方位詞
  5. 動詞(1個一類,9個二類) 
    v 動詞 
    vd 副動詞 
    vn 名動詞 
    vshi 動詞“是” 
    vyou 動詞“有” 
    vf 趨向動詞 
    vx 形式動詞 
    vi 不及物動詞(內動詞) 
    vl 動詞性慣用語 
    vg 動詞性語素
  6. 形容詞(1個一類,4個二類) 
    a 形容詞 
    ad 副形詞 
    an 名形詞 
    ag 形容詞性語素 
    al 形容詞性慣用語
  7. 區別詞(1個一類,2個二類) 
    b 區別詞 
    bl 區別詞性慣用語
  8. 狀態詞(1個一類) 
    z 狀態詞
  9. 代詞(1個一類,4個二類,6個三類) 
    r 代詞 
    rr 人稱代詞 
    rz 指示代詞 
    rzt 時間指示代詞 
    rzs 處所指示代詞 
    rzv 謂詞性指示代詞 
    ry 疑問代詞 
    ryt 時間疑問代詞 
    rys 處所疑問代詞 
    ryv 謂詞性疑問代詞 
    rg 代詞性語素
  10. 數詞(1個一類,1個二類) 
    m 數詞 
    mq 數量詞
  11. 量詞(1個一類,2個二類) 
    q 量詞 
    qv 動量詞 
    qt 時量詞
  12. 副詞(1個一類) 
    d 副詞
  13. 介詞(1個一類,2個二類) 
    p 介詞 
    pba 介詞“把” 
    pbei 介詞“被”
  14. 連詞(1個一類,1個二類) 
    c 連詞 
    cc 並列連詞
  15. 助詞(1個一類,15個二類) 
    u 助詞 
    uzhe 著 
    ule 了 嘍 
    uguo 過 
    ude1 的 底 
    ude2 地 
    ude3 得 
    usuo 所 
    udeng 等 等等 云云 
    uyy 一樣 一般 似的 般 
    udh 的話 
    uls 來講 來說 而言 說來 
    uzhi 之 
    ulian 連 (“連小學生都會”)
  16. 嘆詞(1個一類) 
    e 嘆詞
  17. 語氣詞(1個一類) 
    y 語氣詞(delete yg)
  18. 擬聲詞(1個一類) 
    o 擬聲詞
  19. 字首(1個一類) 
    h 字首
  20. 字尾(1個一類) 
    k 字尾
  21. 字串(1個一類,2個二類) 
    x 字串 
    xx 非語素字 
    xu 網址URL
  22. 標點符號(1個一類,16個二類) 
    w 標點符號 
    wkz 左括號,全形:( 〔 [ { 《 【 〖 〈 半形:( [ { < 
    wky 右括號,全形:) 〕 ] } 》 】 〗 〉 半形: ) ] { > 
    wyz 左引號,全形:“ ‘ 『 
    wyy 右引號,全形:” ’ 』 
    wj 句號,全形:。 
    ww 問號,全形:? 半形:? 
    wt 歎號,全形:! 半形:! 
    wd 逗號,全形:, 半形:, 
    wf 分號,全形:; 半形: ; 
    wn 頓號,全形:、 
    wm 冒號,全形:: 半形: : 
    ws 省略號,全形:…… … 
    wp 破折號,全形:—— -- ——- 半形:— —- 
    wb 百分號千分號,全形:% ‰ 半形:% 
    wh 單位符號,全形:¥ $ £ ° ℃ 半形:$

轉自https://blog.csdn.net/sinat_34022298/article/details/75943272    侵請聯刪