1. 程式人生 > >jieba 結巴分詞 常用說明

jieba 結巴分詞 常用說明

安裝

  • 全自動:easy_install jieba 或者 pip install jieba 或者pip3 install jieba
  • 手 動:jieba 目錄放置於當前目錄或者 site-packages 目錄

演算法

  • 基於統計詞典,構造字首詞典;基於字首詞典對句子進行切分,得到所有切分可能;根據切分位置,構造一個有向無環圖(DAG)
  • 基於DAG圖,採用動態規劃計算最大概率路徑(最有可能的分詞結果),根據最大概率路徑分詞
  • 對於未登入詞(詞庫中沒有的詞),採用有漢字成詞能力的 HMM 模型進行切分
  • 注: jieba中沒有使用trie樹作為字首詞典儲存的資料結構,用的是字首集合,如set([‘數’, ‘資料’, ‘資料結’, ‘資料結構’])

功能

1.分詞

  三種分詞模式
    A、精確模式:將句子精確切開,適合文字分析。預設是精確模式。
    B、全模式:將句中所有可以成詞的詞語都掃描出來,適合用於搜尋引擎構建倒排索引的分詞,粒度比較細
    C、搜尋引擎模式:在精確模式基礎上,對長詞再次切分,適合搜尋引擎
    注:當指定jieba.cut_for_searchjieba.cut的引數HMM=True時,就有了新詞發現的能力。


# encoding=utf-8

import jieba


# 精確模式
seg_list = jieba.cut("我去過清華大學和北京大學。") print(unicode("精確模式: ","utf-8")+ "/ ".join(seg_list)) # 全模式 seg_list = jieba.cut("我去過清華大學和北京大學。", cut_all=True) print(unicode("全模式: ","utf-8") + "/ ".join(seg_list)) # 搜尋引擎模式 seg_list = jieba.cut_for_search("我去過清華大學和北京大學。") print(unicode("搜尋引擎模式: ","utf-8"
) + "/ ".join(seg_list)) # 精確模式/全模式下-新詞發現 “杭研”沒有在詞典中,也被HMM模型 Viterbi演算法識別出來 seg_list = jieba.cut("他來到了網易杭研大廈",HMM=True) print(unicode("精確模式/全模式-新詞發現: ","utf-8") + "/ ".join(seg_list)) # 搜尋引擎模式下-新詞發現 “杭研”沒有在詞典中,也被HMM模型 Viterbi演算法識別出來 seg_list = jieba.cut_for_search("他來到了網易杭研大廈",HMM=True) print(unicode("搜尋引擎模式-新詞發現: ","utf-8") + "/ ".join(seg_list)) #print result: #精確模式: 我/ 去過/ 清華大學/ 和/ 北京大學/ 。 #全模式: 我/ 去過/ 清華/ 清華大學/ 華大/ 大學/ 和/ 北京/ 北京大學/ 大學/ / #搜尋引擎模式: 我/ 去過/ 清華/ 華大/ 大學/ 清華大學/ 和/ 北京/ 大學/ 北京大學/ 。 #精確模式/全模式-新詞發現: 他/ 來到/ 了/ 網易/ 杭研/ 大廈 #搜尋引擎模式-新詞發現: 他/ 來到/ 了/ 網易/ 杭研/ 大廈

2.新增自定義使用者詞典

  jieba 有新詞發現能力,但新增使用者詞典可以保證更高的正確率。
  無使用者詞典下中英文分詞示例


# encoding=utf-8

import jieba

data=[
   "世界經濟論壇也叫達沃斯論壇。",
   "The World Economic Forum is also called the Davos Forum."
    ]

for d in data:
   seg_list = jieba.cut(d)
   #詞與詞之間用","連線
   print(",".join(seg_list))


#無使用者詞典下中英文分詞結果

   # 世界, 經濟, 論壇, 也, 叫, 達沃斯, 論壇,。
   # The,, World,, Economic,, Forum,, is, , also,, called,, the,, >Davos,, Forum,.

  預設格式使用者詞典下中英文分詞示例
     預設詞典格式和 dict.txt(jieba包下) 一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name 若為路徑或二進位制方式開啟的檔案,則檔案必須為 UTF-8 編碼。
     把中文詞”世界經濟論壇”、”達沃斯論壇”;英文詞”World Economic Forum”、”Davos Forum”新增到專案目錄下”“dict/userdict”“中。示例如下…

 # encoding=utf-8
import jieba

"""
預設格式下的使用者詞典"dict/userdict:
世界經濟論壇 n
達沃斯論壇 n
World Economic Forum n
Davos Forum n

"""


# 載入使用者詞典

jieba.load_userdict("dict/userdict")

# 測試使用者詞典


data=[
   "世界經濟論壇也叫達沃斯論壇。",
   "The World Economic Forum is also called the Davos Forum."
    ]

for d in data:
   seg_list = jieba.cut(d)
   #詞與詞之間用","連線
   print(",".join(seg_list))


#預設格式使用者詞典下中英文分詞結果

   # 世界經濟論壇,也,叫,達沃斯論壇,。
   # The, ,World, ,Economic, ,Forum, ,is, ,also, ,called, ,the, ,Davos, >,Forum,.


     可以看到jieba分詞在預設格式下,中文沒問題,英文專有名詞不太理想。不過,可以通過修改jieba包中的init.py檔案幾個正則來解決。詳情請見:jieba分詞支援關鍵詞帶空格和特殊字元
  修改格式後用戶詞典下中英文分詞示例
     根據上述連結修改後,測試中英文下根據使用者詞典分詞。

 # encoding=utf-8
import jieba

"""
修改格式後的使用者詞典"dict/userdict:用@@來間隔詞、詞頻、詞性
世界經濟論壇@@n
達沃斯論壇@@n
World Economic [email protected]@n
Davos [email protected]@n

"""


# 載入使用者詞典

jieba.load_userdict("dict/userdict")

# 測試使用者詞典


data=[
   "世界經濟論壇也叫達沃斯論壇。",
   "The World Economic Forum is also called the Davos Forum."
    ]

for d in data:
   seg_list = jieba.cut(d)
   #詞與詞之間用","連線
   print(",".join(seg_list))


#修改格式後中英文分詞結果

   # 世界經濟論壇,也,叫,達沃斯論壇,。
   # The, ,World Economic Forum, ,is, ,also, ,called, ,the, ,Davos >Forum,.

2.關鍵詞提取

  基於 TF-IDF 演算法的關鍵詞抽取
     jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))
     引數解釋:
       (1)sentence :待提取的文字;
       (2)topK :返回K個權重最大的關鍵詞
       (3)withWeight :是否返回權重
       (4)allowPOS :是否僅包括指定詞性的詞

 # encoding=utf-8

#關鍵詞提取

import jieba.analyse

kWords = jieba.analyse.extract_tags("此外,公司擬對全資子公司吉林歐亞置業>有限公司增資4.3億元,增資後,吉林歐亞置業註冊資本由7000萬元增加到5億元。>吉林歐亞置業主要經營範圍為房地產開發及百貨零售等業務。目前在建吉林歐亞城>市商業綜合體專案。2013年,實現營業收入0萬元,實現淨利潤-139.13萬元。", >topK=5,withWeight=True)
for word,weight in kWords:
   # print(word+":"+weight)
   print word,":",weight


#結果


# 歐亞 : 0.730014270029


# 吉林 : 0.659038184374


# 置業 : 0.488713452211


# 萬元 : 0.339272248186


# 增資 : 0.335824019852

     注: 關鍵詞提取所使用逆文頻(IDF)庫、停用詞庫可切換成自定路徑
  基於 TextRank 演算法的關鍵詞抽取
     jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))
     引數解釋:
       (1)sentence :待提取的文字;
       (2)topK :返回K個權重最大的關鍵詞
       (3)withWeight :是否返回權重
       (4)allowPOS :是否僅包括指定詞性的詞
     TextRank基本思想:
       (1)分詞
       (2)找詞之間共現關係,構建圖
       (3)計算圖中節點的PageRank

3.詞性標註

import jieba.posseg as pseg
words = pseg.cut("我愛北京天安門")
for word, flag in words:
print('%s %s' % (word, flag))

#詞性


#我 r


#愛 v


#北京 ns


#天安門 ns

4.並行分詞

  原理:
    文字按行分隔後,分配到多個 Python 程序並行分詞,最後歸併結果。
  用法:
    jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程序數
    jieba.disable_parallel() # 關閉並行分詞模式
  效果:
    在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程序版的 3.3 倍。
  注意:
    並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。目前暫不支援 Windows

5.返回詞語在原文的起止位置

import jieba
result = jieba.tokenize(u'永和服裝飾品有限公司')
for tk in result:
   print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))

#結果


#word 永和       start: 0        end:2


#word 服裝       start: 2        end:4


#word 飾品       start: 4        end:6


#word 有限公司     start: 6        end:10


#word 不是       start: 10       end:12