?jieba 庫
?jieba 庫的原理分析
jieba庫可用于將中文的一段語句分解為單詞,通常用于解析中文語句的含義。例如外國人需要學習中文而中文語句是一直連續的文字組合。例如“我們在學習Python辦公自動化”這句話,外國人在理解這句話的含義時,首先需要將這句話正確地分解為一個個單詞,即“我們”“在”“學習”“Python”“辦公”“自動化”,如單詞分解錯誤就無法理解這句話的含義,例如“我”“們在”。
將一段文字分解為一個個單詞的原理是庫中已經建立了“詞典”,“詞典”收集了漢語中的所有詞語,當需要對一段文字進行分詞時,會將文字的所有內容和詞典進行匹配,當匹配成功時即得到一個單詞。但還是會在有歧義的問題,例如“路上行人行路上”,代碼可能會將其分詞為“路上”“行”“人行路”“上”,但實際的分詞應該為“路上”“行人”“行”“路上”,而jieba庫會使用概率最大化來決定選擇哪個詞。因此在建立“詞典”時還需對每個詞設置使用概率,概率最大的詞表示使用率最高。由于一段文字中每個詞的概率不同,因此jieba庫中還設置了最優化算法,即選擇一段文字中概率最大的詞。
綜上所述,jieba庫分詞不能保證所有的分詞都是正確的,讀者在后面的學習過程中可能會發現分詞錯誤的情況。關于jieba庫的安裝已經在8.5.3小節進行了演示,讀者可按照如圖8-4所示的命令進行安裝。
iieba 庫的解析
在8.6節介紹的Pyinstaller庫是使用命令的形式來運行代碼的,但是并沒有使用代碼,在iieba庫中將使用代碼的形式實現分詞功能。
接下來對jieba庫做一個簡單的分析。使用pip工具下載、安裝完jieba庫后,打開iieba庫安裝目錄(可通過命令pip show jieba返回的Location獲取到安裝目錄地址)后
其中最為關鍵的是__init_-.py文件,包含用于創建分詞對象的類Tokenizer,類Tokenizer包含大量與分詞相關的方法。analyse文件夾中是用于設計算法以實現分析詞語的相關代碼。finalseg文件夾中是用于詞完成后處理的相關代碼。lac_small文件夾中是用于創建詞法分析模型和模型數據讀取器的相關代碼。main_-·py文件可以實現使用命令的形式運行jieba庫中函數的功能(與Pyinstaller庫的使用方法相同)dict.txt文件是iieba庫中的詞典,用于保存所有的詞語。
__init__.py文件中的類Tokenizer包含處理分詞的方法。本書第6保細介紹了__init__.py文件的組成和原理,讀者需要進入此文件中觀察代碼文件的組成,獲取關鍵函數和類。
類Tokenizer的簡潔定義:
Elass Tokenizer(object):#位于庫jieba\ init .py中definit__(self,dictionary=DEFAULT DICT):...#初始化類def gen pfdict(f):...
def initialize(self,dictionary=None):...#檢查初始化
def check initialized(self):...
def calc(self,sentence,DAG,route):...#計算分詞def get DAG(self,sentence):...def cut(self,sentence,cut_all=False,HMM=True, use paddle=False):..#精確模式分詞,返回一個分詞對象
def cut_for_search(self,sentence,H=True):...#搜索引擎模式分詞,返回一個分詞對象def lcut(self,*args,**kwargs):...#精確模式分詞,返回一個列表
def lcut_for_search(self,*args,**kwargs):...#搜索引擎模式分詞,返回一個列表
def get dict_file(self):...#獲取詞典def load userdict(self,):...#加載個性化詞典,提高分詞正確率
def add word(self,word,freq=None,tag=None):...#向詞典中添加單詞def del word(self,word):...#刪除一個單詞
def suggest freq(self,segment,tune=False):...#調節單詞的頻率def tokenize(self,unicode sentence, mode="default",HMM=True):#對一個句子進行標記并生成元組
def set dictionary(self,dictionary path):...#設置分詞依賴的詞典
這里僅列舉類名和方法名,以便于讀者快速掌握類Tokenizer的使用方法,而對于方法的代碼實現,讀者并不需要過于關心,在此后的所有章節中均按照該形式列舉類的定義。
jieba 庫的使用
jieba庫中提供了3種分詞模式,即精確模式、全模式和搜索引擎模式。
精確模式
精確模式指對句子進行精確的切分,是文本分析中較為常用的一種模式。其使用形式如下:
cut(sentence,cut all=False,HMM=True,use_paddle=False)
參數sentence:需要分詞的中文句子,值的數據類型為字符串類型。
參數cut_all:參數值的數據類型為布爾值類型,值為False表示使用精確模式,值為True表示使用全模式。
參數HMM:是否使用隱馬爾可夫模型(一種優化模型算法)。
示例代碼:
import jieba
s = '我們在學習Python辦公自動化'
jb_a = jieba.Tokenizer() #類Tokenizer所包含的處理分詞的方法
result = jb_a.cut(sentence = s) #精確模式
print(result,list(result))
第3行代碼使用iieba庫中的類Tokenizer初始化一個分詞對象jb_a。第4行代碼使用了分詞對象中的cut()方法,并對第2行代碼中的字符串內容進行了精確模式分詞。第5行代碼輸出結果,由于cut()方法分詞后會返回一種Python內部數據,因此可以使用list()函數將該數據
轉換為列表類型數據。
輸出結果:
<generator object Tokenizer.cut at 0x0000022B1C26EF80> ['我們', '在', '學習', 'Python', '辦公自動化']
執行代碼后的輸出結果如圖8-21所示,標注框中的紅色字為分詞過程所產生的信息,用于告訴當前用N行分詞的狀態、消耗的時間(尋找最優化分詞的過程需要消耗大量的時間,因此通過消耗時間可以對比不圓最優化算法的性能)等。藍色字為分詞后的內容,轉換為列表數據后表明jieba庫將'我們在學習Python辦公動化'分詞為了'我們'在'學習’'Python'辦公自動化。
全模式
全模式指把句子中所有可以成詞的詞語都掃描出來,這種分詞模式雖然速度快,但不能解決歧義問題。將cut()方法中的參數cut_all的值設置為True即可使用全模式。
示例代碼:
import jieba
s = '我們在學習Python辦公自動化'
jb_a = jieba.Tokenizer()
result = jb_a.cut(sentence = s,cut_all=True)#全模式
print(list(result))
代碼執行結果:
['我們', '在', '學習', 'Python', '辦公', '辦公自動化', '自動', '自動化']
結果中每個可以作為一個單詞的文字都將展示出來。
搜索引擎模式
搜索引擎模式指在精確模式基礎上,對長詞再次切分,適用于搜索引警分詞。其使用形式如下:
cut for search(sentence,HMM=True)
參數sentence:需要分詞的中文句子,值的數據類型為字符串類型。
參數HMM:是否使用隱馬爾可夫模型。
示例代碼:
import jieba
s = '我們在學習Python辦公自動化'
jb_a = jieba.Tokenizer()
result = jb_a.cut_for_search(sentence = s)#搜索引擎模式
print(list(result))
第4行代碼使用cut_for_search()對第2行代碼中的文字進行搜索引擎模式分詞,分詞后的結果如下,表明在精確模式的基礎上再次對“辦公自動化”進行分詞。
['我們', '在', '學習', 'Python', '辦公', '自動', '自動化', '辦公自動化']
添加新詞
除了U上3種分詞模式,由于社會還會不斷地創造出新的間語,因此為子滿是當前社會對分司的需求,還可以使用add-word()方法向詞典中添加新詞(添加的詞語不是永久的:儀當前代碼中有效)。其使用形式如下:
add word(word, freq=None, tag=None)
參數word:需要添加到詞典中的詞語。示例代碼:
import jieba
s = '我們在學習Python辦公自動化'
jb_a = jieba.Tokenizer()
jb_a.add_word('Python辦公自動化')#添加新詞
result = jb_a.cut(sentence = s)
print(list(result))
第4行代碼使用add_word()方法將單詞“Python辦公自動化”添加到詞典中。
第5行代碼使用cut()方法進行精確模式分詞。
執行代碼后的輸出結果如下,可以看出“Python辦公自動化”并沒有分開,而是作為一個詞。
['我們', '在', '學習', 'Python辦公自動化']
在__init--.py文件中對類Tokenizer的使用進行簡化,并重新對該類中的方法進行賦值,代碼如下:
dt = Tokenizer()get FREQ=lambda k,d=None:dt.FREQ.get(k,d)add word = dt.add wordcut =dt.cut
lcut = dt.lcut
cut for search=dt.cut for search
lcut for search =dt.lcut for search
del word = dt.del wordget dict file= dt.get dict file
也可以直接使用iieba.cut()、jieba.cut_for_search()和jieba.add_word()實現以上介紹的4個功能(8.7.4小節的代碼中有此種用法)。
小項目案例:實現判斷評論為好評或差評
項目描述
為了自動識別例如抖音的某個視頻、微博的某個文案、淘寶的某個商品的評論為好評或差評,需要設計一個可以自動判斷用戶評論好壞的代碼程序。
項目任務
任務1:使用jieba庫將用戶的評論分詞為一個個單詞,并建立一套好評、差評詞庫,例如在以下代碼中,列表good中為好評詞語,列表bad中為差評詞語。
任務2:將用戶評論分詞后的單詞分別與列表good、bad進行匹配,并統計好評詞語和差評詞語的個數
項目實現代碼:
import jieba
good = ['好評','好看']
bad = ['差評','垃圾']
s_1 = '衣服好看,顯得皮膚白'
s_2 = '尺寸不差評分必須高'
s_3 = '差評買過最垃圾的東西'
def get_value(s):good_value = bad_value = 0result = list(jieba.cut(sentence=s))print(result)for r in result:if r in good:good_value += 1if r in bad:bad_value += 1print('好評詞語個數:',good_value,'差評詞語個數:',bad_value)if good_value > bad_value:print('此條評論為好評')elif good_value == bad_value:print('此條評論暫無法判斷')else:print('此條評論為差評')
get_value(s_1)
get_value(s_2)
get_value(s_3)
第2、3行代碼中的good和bad分別保存好評詞語和差評詞語。在實際開發中的詞語可能會遠遠多于以上代碼中的詞語,讀者在實際開發中可以自行增加。
第4~6行代碼中為3條待分析的評論。
第7~22行代碼創建了一個用于分析評論的函數get_value()。其中第8行代碼中的good_value和 badvalue用于統計好評詞語和差評詞語的個數。第9行代碼使用iieba.cut()方法將評論解析為單詞。第11~16代碼使用for循環依次判斷解析后的詞語中是否有好評詞語或差評詞語,如果有好評詞語則good_value值加I如果有差評詞語則bad_value值加1。第17~22行代碼用于判斷good_value和bad_value的大小,如果好評詞語的個數大于差評詞語的個數,則表明評論為好評;如果個數相同則暫時無法判斷評論是好評還是差評;如果好評詞語的個數小于差評詞語的個數,則表明評論為差評。
執行代碼后的輸出結果如圖8-22所示,解析后的第1條評論為好評、第2條評論暫時無法判斷、第3條評論為差評,解析后的結果基本是正確。本小節的代碼僅用于演示效果,對于實際中廣泛的、真實的評論來說,需要完全分辨出好評或差評是一件較為困難的事情目前的常用方法是結合人工智能深度學習算法并解析每條評論的語義,但仍然只能是盡可能提高識別的正確率。?