1. 程式人生 > 實用技巧 >基於python中jieba包的中文分詞中詳細使用之一

基於python中jieba包的中文分詞中詳細使用之一

基於python中jieba包的中文分詞中詳細使用(一)

01.前言

之前的文章中也是用過一些jieba分詞但是基本上都是處於皮毛,現在就現有的python環境中對其官方文件做一些自己的理解以及具體的介紹。本文主要內容也是從官網文件中獲取。

02.jieba的介紹

02.1 What

“jieba” (Chinese for “to stutter”)Chiese text segmention:built to be the best Python Chinse word segmenmtation module.
"jieba"中文分詞:做最好的Python中文分片語件

02.2特點

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

02.3安裝與使用

鑑於當前提供各大包的組織逐漸放棄對Python2的維護,這裡也強烈建議使用Python3。jieba分詞的安裝也是很簡單的。
全自動安裝的方式:pip install jieba (window環境) pip3 install jieba (Linux環境);
使用的方式:import jieba

02.4涉及到的演算法

  • 基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG)
  • 採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合
  • 對於未登入詞,採用了基於漢字成詞能力的 HMM (隱馬爾科夫)模型,使用了 Viterbi 演算法

03.主要功能

03.01分詞

  • 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為預設分詞器,所有全域性分詞相關函式都是該分詞器的對映。
    程式碼例項
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-05-05 22:15:13
# @Author  : JackPI ([email protected])
# @Link    : https://blog.csdn.net/meiqi0538
# @Version : $Id$
import jieba

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

seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print("精準模式: " + "/ ".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
  • 17
  • 18
  • 19

輸出結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.026 seconds.
Prefix dict has been built succesfully.
全模式: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學
精準模式: 我/ 來到/ 北京/ 清華大學
他, 來到, 了, 網易, 杭研, 大廈
小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, ,, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造
[Finished in 1.7s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

03.02新增自定義詞典

  • 開發者可以指定自己自定義的詞典,以便包含 jieba 詞庫裡沒有的詞。雖然 jieba 有新詞識別能力,但是自行新增新詞可以保證更高的正確率
  • 用法:jieba.load_userdict(file_name)# file_name 為檔案類物件或自定義詞典的路徑
  • 詞典格式和dict.txt一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name 若為路徑或二進位制方式開啟的檔案,則檔案必須為 UTF-8 編碼。
  • 詞頻省略時使用自動計算的能保證分出該詞的詞頻
    新增自定義字典舉例
創新辦 3 i
雲端計算 5
凱特琳 nz
臺中
  • 1
  • 2
  • 3
  • 4
  • 更改分詞器(預設為 jieba.dt)的 tmp_dir 和 cache_file 屬性,可分別指定快取檔案所在的資料夾及其檔名,用於受限的檔案系統。
    使用案例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-05-05 22:15:13
# @Author  : JackPI ([email protected])
# @Link    : https://blog.csdn.net/meiqi0538
# @Version : $Id$
#匯入jieba包
import jieba
#管理系統路徑
import sys
sys.path.append("../")
#獲取自定義詞典
jieba.load_userdict("userdict.txt")
#匯入詞性標註的包
import jieba.posseg as pseg

#新增詞
jieba.add_word('石墨烯')
jieba.add_word('凱特琳')
#刪除詞
jieba.del_word('自定義詞')
#元組型別的測試資料
test_sent = (
"李小福是創新辦主任也是雲端計算方面的專家; 什麼是八一雙鹿\n"
"例如我輸入一個帶“韓玉賞鑑”的標題,在自定義詞庫中也增加了此詞為N類\n"
"「臺中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
#預設分詞
words = jieba.cut(test_sent)
print('/'.join(words))#使用/把分詞的結果分開

print("="*40)
#用於詞性標註
result = pseg.cut(test_sent)
#使用for迴圈把分出的詞及其詞性用/隔開,並新增,和空格
for w in result:
    print(w.word, "/", w.flag, ", ", end=' ')

print("\n" + "="*40)

#對英文的分割
terms = jieba.cut('easy_install is great')
print('/'.join(terms))
#對英文和漢字的分割
terms = jieba.cut('python 的正則表示式是好用的')
print('/'.join(terms))

print("="*40)
# test frequency tune
testlist = [
('今天天氣不錯', ('今天', '天氣')),
('如果放到post中將出錯。', ('中', '將')),
('我們中出了一個叛徒', ('中', '出')),
]

for sent, seg in testlist:
    print('/'.join(jieba.cut(sent, HMM=False)))
    word = ''.join(seg)
    print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))
    print('/'.join(jieba.cut(sent, HMM=False)))
    print("-"*40)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.063 seconds.
Prefix dict has been built succesfully.
李小福/是/創新辦/主任/也/是/雲端計算/方面/的/專家/;/ /什麼/是/八一雙鹿/
/例如/我/輸入/一個/帶/“/韓玉賞鑑/”/的/標題/,/在/自定義/詞庫/中/也/增加/了/此/詞為/N/類/
/「/臺中/」/正確/應該/不會/被/切開/。/mac/上/可/分出/「/石墨烯/」/;/此時/又/可以/分出/來/凱特琳/了/。
========================================
李小福 / nr ,  是 / v ,  創新辦 / i ,  主任 / b ,  也 / d ,  是 / v ,  雲端計算 / x ,  方面 / n ,  的 / uj ,  專家 / n ,  ; / x ,    / x ,  什麼 / r ,  是 / v ,  八一雙鹿 / nz ,  
 / x ,  例如 / v ,  我 / r ,  輸入 / v ,  一個 / m ,  帶 / v ,  “ / x ,  韓玉賞鑑 / nz ,  ” / x ,  的 / uj ,  標題 / n ,  , / x ,  在 / p ,  自定義 / l ,  詞庫 / n ,  中 / f ,  也 / d ,  增加 / v ,  了 / ul ,  此 / r ,  詞 / n ,  為 / p ,  N / eng ,  類 / q ,  
 / x ,  「 / x ,  臺中 / s ,  」 / x ,  正確 / ad ,  應該 / v ,  不 / d ,  會 / v ,  被 / p ,  切開 / ad ,  。 / x ,  mac / eng ,  上 / f ,  可 / v ,  分出 / v ,  「 / x ,  石墨烯 / x ,  」 / x ,  ; / x ,  此時 / c ,  又 / d ,  可以 / c ,  分出 / v ,  來 / zg ,  凱特琳 / nz ,  了 / ul ,  。 / x ,  
========================================
easy_install/ /is/ /great
python/ /的/正則表示式/是/好用/的
========================================
今天天氣/不錯
今天天氣 Before: 3, After: 0
今天/天氣/不錯
----------------------------------------
如果/放到/post/中將/出錯/。
中將 Before: 763, After: 494
如果/放到/post/中/將/出錯/。
----------------------------------------
我們/中/出/了/一個/叛徒
中出 Before: 3, After: 3
我們/中/出/了/一個/叛徒
----------------------------------------
[Finished in 2.6s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

03.02調整詞典

  • 使用add_word(word, freq=None, tag=None)del_word(word)可在程式中動態修改詞典。
  • 使用suggest_freq(segment, tune=True)可調節單個詞語的詞頻,使其能(或不能)被分出來。
  • 注意:自動計算的詞頻在使用 HMM 新詞發現功能時可能無效。
>>> print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
如果/放到/post/中將/出錯/。
>>> jieba.suggest_freq(('中', '將'), True)
494
>>> print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
如果/放到/post/中/將/出錯/。
>>> print('/'.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False)))
「/臺/中/」/正確/應該/不會/被/切開
>>> jieba.suggest_freq('臺中', True)
69
>>> print('/'.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False)))
「/臺中/」/正確/應該/不會/被/切開



02.關鍵詞提取

02.01基於TF-IDF演算法的關鍵詞提取

import jieba.analyse
  • 1
  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False,
    allowPOS=())
    其中需要說明的是:
    1.sentence 為待提取的文字
    2.topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
    3.withWeight 為是否一併返回關鍵詞權重值,預設值為 False
    4.allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 例項,idf_path 為 IDF 頻率檔案

程式碼示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-05-05 22:15:13
# @Author  : JackPI ([email protected])
# @Link    : https://blog.csdn.net/meiqi0538
# @Version : $Id$
import jieba
import jieba.analyse
#讀取檔案,返回一個字串,使用utf-8編碼方式讀取,該文件位於此python同以及目錄下
content  = open('人民的名義.txt','r',encoding='utf-8').read()
tags = jieba.analyse.extract_tags(content,topK=10) 
print(",".join(tags))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

執行結果

Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.280 seconds.
Prefix dict has been built succesfully.
侯亮,李達康,高育良,祁同偉,高小琴,瑞金,陳海,老師,丁義珍,成功
[Finished in 5.9s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

  • 用法: jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑
  • 自定義語料庫示例
    勞動防護 13.900677652 勞動防護 13.900677652 生化學 13.900677652 生化學 13.900677652 奧薩貝爾 13.900677652 奧薩貝爾 13.900677652 考察隊員 13.900677652 考察隊員 13.900677652 崗上 11.5027823792 崗上 11.5027823792 倒車檔 12.2912397395 倒車檔 12.2912397395 編譯 9.21854642485 編譯 9.21854642485 蝶泳 11.1926274509 外委 11.8212361103
  • 用法示例
import jieba
import jieba.analyse
#讀取檔案,返回一個字串,使用utf-8編碼方式讀取,該文件位於此python同以及目錄下
content  = open('idf.txt.big','r',encoding='utf-8').read()
tags = jieba.analyse.extract_tags(content, topK=10)
print(",".join(tags))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.186 seconds.
Prefix dict has been built succesfully.
13.2075304714,13.900677652,12.8020653633,12.5143832909,12.2912397395,12.1089181827,11.9547675029,11.8212361103,11.7034530746,11.598092559
[Finished in 20.9s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

關鍵詞提取所使用停止詞(Stop Words)文字語料庫可以切換成自定義語料庫的路徑

  • 用法: jieba.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑
  • 自定義語料庫示例:
!
"
#
$
%
&
'
(
)
*
+
,
-
--
.
..
...
......
...................
./
.一
記者
數
年
月
日
時
分
秒
/
//
0
1
2
3
4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 用法示例
import jieba
import jieba.analyse
#讀取檔案,返回一個字串,使用utf-8編碼方式讀取,該文件位於此python同以及目錄下
content  = open(u'人民的名義.txt','r',encoding='utf-8').read()
jieba.analyse.set_stop_words("stopwords.txt")
tags = jieba.analyse.extract_tags(content, topK=10)
print(",".join(tags))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.316 seconds.
Prefix dict has been built succesfully.
侯亮,李達康,高育良,祁同偉,高小琴,瑞金,陳海,老師,丁義珍,成功
[Finished in 5.2s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

關鍵詞一併返回關鍵詞權重值示例

import jieba
import jieba.analyse
#讀取檔案,返回一個字串,使用utf-8編碼方式讀取,該文件位於此python同以及目錄下
content  = open(u'人民的名義.txt','r',encoding='utf-8').read()
jieba.analyse.set_stop_words("stopwords.txt")
tags = jieba.analyse.extract_tags(content, topK=10,withWeight=True)
for tag in tags:
	print("tag:%s\t\t weight:%f"%(tag[0],tag[1]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.115 seconds.
Prefix dict has been built succesfully.
tag:侯亮		 weight:0.257260
tag:李達康		 weight:0.143901
tag:高育良		 weight:0.108856
tag:祁同偉		 weight:0.098479
tag:高小琴		 weight:0.062259
tag:瑞金		 weight:0.060405
tag:陳海		 weight:0.054036
tag:老師		 weight:0.051980
tag:丁義珍		 weight:0.049729
tag:成功		 weight:0.046647
[Finished in 5.3s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

02.02詞性標註

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer
    引數可指定內部使用的 jieba.Tokenizer 分詞器。 jieba.posseg.dt 為預設詞性標註分詞器。
  • 標註句子分詞後每個詞的詞性,採用和 ictclas 相容的標記法。
  • 用法示例
>>> import jieba.posseg as pseg
>>> words = pseg.cut("我愛北京天安門")
>>> for word, flag in words:
...    print('%s %s' % (word, flag))
...
我 r
愛 v
北京 ns
天安門 ns
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

詞性對照表

詞性編碼詞性名稱註解
Ag 形語素 形容詞性語素。形容詞程式碼為 a,語素程式碼g前面置以A。
a 形成詞 取英語形容詞 adjective的第1個字母。
ad 副形詞 直接作狀語的形容詞。形容詞程式碼 a和副詞程式碼d並在一起。
an 名形詞 具有名詞功能的形容詞。形容詞程式碼 a和名詞程式碼n並在一起。
b 區別詞 取漢字“別”的聲母。
c 連詞 取英語連詞 conjunction的第1個字母。
dg 副語素 副詞性語素。副詞程式碼為 d,語素程式碼g前面置以D。
d 副詞 取 adverb的第2個字母,因其第1個字母已用於形容詞。
e 嘆詞 取英語嘆詞 exclamation的第1個字母。
f 方位詞 取漢字“方”
g 語素 絕大多數語素都能作為合成詞的“詞根”,取漢字“根”的聲母。
h 前接成分 取英語 head的第1個字母。
i 成語 取英語成語 idiom的第1個字母。
j 簡稱略語 取漢字“簡”的聲母。
k 後接成分
l 習用語 習用語尚未成為成語,有點“臨時性”,取“臨”的聲母。
m 數詞 取英語 numeral的第3個字母,n,u已有他用。
Ng 名語素 名詞性語素。名詞程式碼為 n,語素程式碼g前面置以N。
n 名詞 取英語名詞 noun的第1個字母。
nr 人名 名詞程式碼 n和“人(ren)”的聲母並在一起。
ns 地名 名詞程式碼 n和處所詞程式碼s並在一起。
nt 機構團體 “團”的聲母為 t,名詞程式碼n和t並在一起。
nz 其他專名 “專”的聲母的第 1個字母為z,名詞程式碼n和z並在一起。
o 擬聲詞 取英語擬聲詞 onomatopoeia的第1個字母。
p 介詞 取英語介詞 prepositional的第1個字母。
q 量詞 取英語 quantity的第1個字母。
r 代詞 取英語代詞 pronoun的第2個字母,因p已用於介詞。
s 處所詞 取英語 space的第1個字母。
tg 時語素 時間詞性語素。時間詞程式碼為 t,在語素的程式碼g前面置以T。
t 時間詞 取英語 time的第1個字母。
u 助詞 取英語助詞 auxiliary
vg 動語素 動詞性語素。動詞程式碼為 v。在語素的程式碼g前面置以V。
v 動詞 取英語動詞 verb的第一個字母
vd 副動詞 直接作狀語的動詞。動詞和副詞的程式碼並在一起。
vn 名動詞 指具有名詞功能的動詞。動詞和名詞的程式碼並在一起。
w 標點符號
x 非語素字 非語素字只是一個符號,字母 x通常用於代表未知數、符號。
y 語氣詞 取漢字“語”的聲母。
z 狀態詞 取漢字“狀”的聲母的前一個字母
un 未知詞 不可識別詞及使用者自定義片語。取英文Unkonwn首兩個字母。(非北大標準,CSW分詞中定義)

02.03並行分詞

  • 原理:將目標文字按行分隔後,把各行文字分配到多個 Python 程序並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升
  • 基於 python 自帶的 multiprocessing 模組,目前暫不支援 Windows
  • 用法
    jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程序數 jieba.disable_parallel() # 關閉並行分詞模式
    官方使用案例
import sys
import time
sys.path.append("../../")
import jieba

jieba.enable_parallel()

url = sys.argv[1]
content = open(url,"rb").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))

t2 = time.time()
tm_cost = t2-t1

log_f = open("1.log","wb")
log_f.write(words.encode('utf-8'))

print('speed %s bytes/second' % (len(content)/tm_cost))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 注意:並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。

02.04Tokenize:返回詞語在原文的起止位置

注意,輸入引數只接受 unicode
預設模式

import jieba
import jieba.analyse
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]))
  • 1
  • 2
  • 3
  • 4
  • 5

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.054 seconds.
Prefix dict has been built succesfully.
word 永和		 start: 0 		 end:2
word 服裝		 start: 2 		 end:4
word 飾品		 start: 4 		 end:6
word 有限公司		 start: 6 		 end:10
[Finished in 3.3s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 搜尋模式
result = jieba.tokenize(u'永和服裝飾品有限公司', mode='search')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
  • 1
  • 2
  • 3

結果

word 永和                start: 0                end:2
word 服裝                start: 2                end:4
word 飾品                start: 4                end:6
word 有限                start: 6                end:8
word 公司                start: 8                end:10
word 有限公司            start: 6                end:10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#02.05ChineseAnalyzer for Whoosh 搜尋引擎

  • 引用: from jieba.analyse import ChineseAnalyzer
  • 官方案例
# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
import sys,os
sys.path.append("../")
from whoosh.index import create_in,open_dir
from whoosh.fields import *
from whoosh.qparser import QueryParser

from jieba.analyse import ChineseAnalyzer

analyzer = ChineseAnalyzer()

schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))
if not os.path.exists("tmp"):
    os.mkdir("tmp")

ix = create_in("tmp", schema) # for create new index
#ix = open_dir("tmp") # for read only
writer = ix.writer()

writer.add_document(
    title="document1",
    path="/a",
    content="This is the first document we’ve added!"
)

writer.add_document(
    title="document2",
    path="/b",
    content="The second one 你 中文測試中文 is even more interesting! 吃水果"
)

writer.add_document(
    title="document3",
    path="/c",
    content="買水果然後來世博園。"
)

writer.add_document(
    title="document4",
    path="/c",
    content="工信處女幹事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作"
)

writer.add_document(
    title="document4",
    path="/c",
    content="咱倆交換一下吧。"
)

writer.commit()
searcher = ix.searcher()
parser = QueryParser("content", schema=ix.schema)

for keyword in ("水果世博園","你","first","中文","交換機","交換"):
    print("result of ",keyword)
    q = parser.parse(keyword)
    results = searcher.search(q)
    for hit in results:
        print(hit.highlights("content"))
    print("="*10)

for t in analyzer("我的好朋友是李明;我愛北京天安門;IBM和Microsoft; I have a dream. this is intetesting and interested me a lot"):
    print(t.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

03.延遲載入

jieba 採用延遲載入,import jieba 和 jieba.Tokenizer() 不會立即觸發詞典的載入,一旦有必要才開始載入詞典構建字首字典。如果你想手工初始 jieba,也可以手動初始化。

import jieba
jieba.initialize()  # 手動初始化(可選)
  • 1
  • 2

官方使用案例

#encoding=utf-8
from __future__ import print_function
import sys
sys.path.append("../")
import jieba

def cuttest(test_sent):
    result = jieba.cut(test_sent)
    print("  ".join(result))

def testcase():
    cuttest("這是一個伸手不見五指的黑夜。我叫孫悟空,我愛北京,我愛Python和C++。")
    cuttest("我不喜歡日本和服。")
    cuttest("雷猴迴歸人間。")
    cuttest("工信處女幹事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作")
    cuttest("我需要廉租房")
    cuttest("永和服裝飾品有限公司")
    cuttest("我愛北京天安門")
    cuttest("abc")
    cuttest("隱馬爾可夫")
    cuttest("雷猴是個好網站")
    
if __name__ == "__main__":
    testcase()
    jieba.set_dictionary("foobar.txt")
    print("================================")
    testcase()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

04.其他詞典

1.佔用記憶體較小的詞典檔案https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
2.支援繁體分詞更好的詞典檔案https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big
下載你所需要的詞典,然後覆蓋 jieba/dict.txt 即可;或者用jieba.set_dictionary('data/dict.txt.big')