自然語言處理之jieba分詞


英文分詞可以使用空格,中文就不同了,一些分詞的原理后面再來說,先說下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。

 

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM