自然語言處理之jieba分詞

奧辰發表於2020-08-18

英文分詞可以使用空格,中文就不同了,一些分詞的原理後面再來說,先說下python中常用的jieba這個工具。

首先要注意自己在做練習時不要使用jieba.Py命名檔案,否則會出現

jieba has no attribute named cut …等這些,如果刪除了自己建立的jieba.py還有錯誤是因為沒有刪除jieba.pyc檔案。

(1)基本分詞函式和用法

  首先介紹下分詞的三種模式:

  精確模式:適合將句子最精確的分開,適合文字分析;

  全模式:把句子中所有可以成詞的詞語都掃描出來,速度快,但是不能解決歧義;

  搜尋引擎模式:在精確模式的基礎上,對長詞再次進行切分,提高召回率,適用於搜尋引擎分詞;

 jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 迴圈來獲得分詞後得到的每一個詞語

  jieba.cut 方法接受三個輸入引數:

  • 需要分詞的字串
  • cut_all 引數用來控制是否採用全模式
  • HMM 引數用來控制是否使用 HMM 模型

  jieba.cut_for_search 方法接受兩個引數

  • 需要分詞的字串
  • 是否使用 HMM 模型。

  

 1 import jieba 
 2 seg_list = jieba.cut("我愛學習自然語言處理", cut_all=True)
 3 print("Full Mode: " + "/ ".join(seg_list))  # 全模式
 4 
 5 seg_list = jieba.cut("我愛自然語言處理", cut_all=False)
 6 print("Default Mode: " + "/ ".join(seg_list))  # 精確模式
 7 
 8 seg_list = jieba.cut("他畢業於上海交通大學,在百度深度學習研究院進行研究")  # 預設是精確模式
 9 print(", ".join(seg_list))
10 
11 seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在哈佛大學深造")  # 搜尋引擎模式
12 print(", ".join(seg_list))
View Code

 

jieba.lcut以及jieba.lcut_for_search直接返回 list

1 import jieba 
2 result_lcut = jieba.lcut("小明碩士畢業於中國科學院計算所,後在哈佛大學深造")
3 result_lcut_for_search = jieba.lcut("小明碩士畢業於中國科學院計算所,後在哈佛大學深造",cut_all=True)
4 print ('result_lcut:',result_lcut)
5 print ('result_lcut_for_search:',result_lcut_for_search)
6 
7 print (" ".join(result_lcut))
8 print (" ".join(result_lcut_for_search))
View Code

  新增使用者自定義字典:

  很多時候我們需要針對自己的場景進行分詞,會有一些領域內的專有詞彙。

  • 1.可以用jieba.load_userdict(file_name)載入使用者字典
  • 2.少量的詞彙可以自己用下面方法手動新增:
    • 用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程式中動態修改詞典
    • 用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來。
1 import jieba
2 result_cut=jieba.cut('如果放到舊字典中將出錯。', HMM=False)
3 print('/'.join(result_cut))
4 jieba.suggest_freq(('', ''), True)
5 result_cut=jieba.cut('如果放到舊字典中將出錯。', HMM=False)
6 print('/'.join(result_cut))
View Code

(2)關鍵詞提取

基於TF-IDF的關鍵詞抽取

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 為待提取的文字
    • topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
    • withWeight 為是否一併返回關鍵詞權重值,預設值為 False
    • allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選

 

1 import jieba.analyse as analyse
2 import codecs
3 
4 lines_NBA = codecs.open('NBA.txt',encoding='utf-8').read()
5 print ("  ".join(analyse.extract_tags(lines_NBA, topK=20, withWeight=False, allowPOS=())))
View Code

另:

    關鍵詞提取所使用逆向檔案頻率(IDF)文字語料庫可以切換成自定義語料庫的路徑:jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑

    關鍵詞提取所使用停止詞(Stop Words)文字語料庫可以切換成自定義語料庫的路徑:jieba.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑

基於TextRank的關鍵詞提取

 

1 import jieba.analyse as analyse
2 import codecs
3 
4 lines_NBA = codecs.open('NBA.txt',encoding='utf-8').read()
5 print("  ".join(analyse.textrank(lines_NBA, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn','v'))))
View Code

(3)詞性標註

jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 引數可指定內部使用的 jieba.Tokenizer 分詞器。

jieba.posseg.dt 為預設詞性標註分詞器。

1 import jieba.posseg as pseg
2 words = pseg.cut("我愛自然語言處理")
3 for word, flag in words:
4     print('%s %s' % (word, flag))

(4)並行分詞

原理:將目標文字按行分隔後,把各行文字分配到多個 Python 程式並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升 基於 python 自帶的 multiprocessing 模組,目前暫不支援 Windows

用法:

jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程式數
jieba.disable_parallel() # 關閉並行分詞模式

實驗結果:在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程式版的 3.3 倍。

注意:並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。

 

 --------------------------------我是結束分割線 --------------------------------

 注:本文參考寒小陽自然語言處理

 

相關文章