“結(jié)巴”分詞是一個Python 中文分詞組件,參見

在羅江等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,成都全網(wǎng)營銷,外貿(mào)營銷網(wǎng)站建設(shè),羅江網(wǎng)站建設(shè)費(fèi)用合理。
可以對中文文本進(jìn)行 分詞、詞性標(biāo)注、關(guān)鍵詞抽取 等功能,并且支持自定義詞典。
本文包括以下內(nèi)容:
1、jieba分詞包的 安裝
2、jieba分詞的 使用教程
3、jieba分詞的 工作原理與工作流程
4、jieba分詞所涉及到的 HMM、TextRank、TF-IDF等算法介紹
可以直接使用pip來進(jìn)行安裝:
sudo pip install jieba
或者
sudo pip3 install jieba
關(guān)鍵詞抽取有兩種算法,基于TF-IDF和基于TextRank:
jieba分詞有三種不同的分詞模式: 精確模式、全模式和搜索引擎模式 :
對應(yīng)的,函數(shù)前加l即是對應(yīng)得到list結(jié)果的函數(shù):
精確模式是最常用的分詞方法,全模式會將句子中所有可能的詞都列舉出來,搜索引擎模式則適用于搜索引擎使用。具體的差別可在下一節(jié)工作流程的分析中詳述。
在上述每個函數(shù)中,都有名為HMM的參數(shù)。這一項(xiàng)表示是否在分詞過程中利用HMM進(jìn)行新詞發(fā)現(xiàn)。關(guān)于HMM,本文附錄中將簡述相關(guān)知識。
另外分詞支持自定義字典,詞典格式和 dict.txt 一樣,一個詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。
具體使用方法為:
關(guān)鍵詞抽取的兩個函數(shù)的完整參數(shù)為:
可以通過
來打開或關(guān)閉并行分詞功能。
個人感覺一般用不到,大文件分詞需要手動實(shí)現(xiàn)多進(jìn)程并行,句子分詞也不至于用這個。
jieba分詞主要通過詞典來進(jìn)行分詞及詞性標(biāo)注,兩者使用了一個相同的詞典。正因如此,分詞的結(jié)果優(yōu)劣將很大程度上取決于詞典,雖然使用了HMM來進(jìn)行新詞發(fā)現(xiàn)。
jieba分詞包整體的工作流程如下圖所示:
下面將根據(jù)源碼詳細(xì)地分析各個模塊的工作流程。
在之后幾節(jié)中,我們在 藍(lán)色的方框 中示范了關(guān)鍵步驟的輸出樣例或詞典文件的格式樣例。在本節(jié)中都采用類似的表示方式。
jieba分詞中,首先通過對照典生成句子的 有向無環(huán)圖 ,再根據(jù)選擇的模式不同,根據(jù)詞典 尋找最短路徑 后對句子進(jìn)行截取或直接對句子進(jìn)行截取。對于未登陸詞(不在詞典中的詞)使用 HMM 進(jìn)行新詞發(fā)現(xiàn)。
詞典的格式應(yīng)為
word1 freq1 word_type1
word2 freq2 word_type2
…
其中自定義用戶詞典中詞性word_type可以省略。
詞典在其他模塊的流程中可能也會用到,為方便敘述,后續(xù)的流程圖中將會省略詞典的初始化部分。
圖b演示了搜索引擎模式的工作流程,它會在精確模式分詞的基礎(chǔ)上,將長詞再次進(jìn)行切分。
在這里我們假定讀者已經(jīng)了解HMM相關(guān)知識,如果沒有可先行閱讀下一章內(nèi)容中的HMM相關(guān)部分或者跳過本節(jié)。
在jieba分詞中,將字在詞中的位置B、M、E、S作為隱藏狀態(tài),字是觀測狀態(tài),使用了詞典文件分別存儲字之間的表現(xiàn)概率矩陣(finalseg/prob_emit.py)、初始概率向量(finalseg/prob_start.py)和轉(zhuǎn)移概率矩陣(finalseg/prob_trans.py)。這就是一個標(biāo)準(zhǔn)的 解碼問題 ,根據(jù)概率再利用 viterbi算法 對最大可能的隱藏狀態(tài)進(jìn)行求解。
詞性分析部分與分詞模塊用了同一個基礎(chǔ)的分詞器,對于詞典詞的詞性,將直接從詞典中提取,但是對于新詞,詞性分析部分有一個 專屬的新詞及其詞性的發(fā)現(xiàn)模塊 。
用于詞性標(biāo)注的HMM模型與用于分詞的HMM模型相似,同樣將文字序列視為可見狀態(tài),但是隱藏狀態(tài)不再是單單的詞的位置(B/E/M/S),而變成了詞的位置與詞性的組合,如(B,v)(B,n)(S,n)等等。因此其初始概率向量、轉(zhuǎn)移概率矩陣和表現(xiàn)概率矩陣和上一節(jié)中所用的相比都要龐大的多,但是其本質(zhì)以及運(yùn)算步驟都沒有變化。
具體的工作流程如下圖所示。
jieba分詞中有兩種不同的用于關(guān)鍵詞抽取的算法,分別為TextRank和TF-IDF。實(shí)現(xiàn)流程比較簡單,其核心在于算法本身。下面簡單地畫出實(shí)現(xiàn)流程,具體的算法可以參閱下一章內(nèi)容。
TextRank方法默認(rèn)篩選詞性,而TF-IDF方法模型不進(jìn)行詞性篩選。
在本章中,將會簡單介紹相關(guān)的算法知識,主要包括用于新詞發(fā)現(xiàn)的 隱馬爾科夫模型 和 維特比算法 、用于關(guān)鍵詞提取的 TextRank 和 TF-IDF 算法。
HMM即隱馬爾科夫模型,是一種基于馬爾科夫假設(shè)的統(tǒng)計模型。之所以為“隱”,是因?yàn)橄噍^于馬爾科夫過程HMM有著未知的參數(shù)。在世界上,能看到的往往都是表象,而事物的真正狀態(tài)往往都隱含在表象之下,并且與表象有一定的關(guān)聯(lián)關(guān)系。
其中,S、O分別表示狀態(tài)序列與觀測序列。
如果讀者還對這部分內(nèi)容心存疑問,不妨先往下閱讀,下面我們將以一個比較簡單的例子對HMM及解碼算法進(jìn)行實(shí)際說明與演示,在讀完下一小節(jié)之后再回來看這些式子,或許能夠恍然大悟。
下面以一個簡單的例子來進(jìn)行闡述:
假設(shè)小明有一個網(wǎng)友小紅,小紅每天都會在朋友圈說明自己今天做了什么,并且假設(shè)其僅受當(dāng)天天氣的影響,而當(dāng)天的天氣也只受前一天天氣的影響。
于小明而言,小紅每天做了什么是可見狀態(tài),而小紅那里的天氣如何就是隱藏狀態(tài),這就構(gòu)成了一個HMM模型。一個HMM模型需要有五個要素:隱藏狀態(tài)集、觀測集、轉(zhuǎn)移概率、觀測概率和初始狀態(tài)概率。
即在第j個隱藏狀態(tài)時,表現(xiàn)為i表現(xiàn)狀態(tài)的概率。式中的n和m表示隱藏狀態(tài)集和觀測集中的數(shù)量。
本例中在不同的天氣下,小紅要做不同事情的概率也不同, 觀測概率 以表格的形式呈現(xiàn)如下:
其中
除此之外,還需要一個初始狀態(tài)概率向量π,它表示了觀測開始時,即t=0時,隱藏狀態(tài)的概率值。本例中我們指定 π={0,0,1} 。
至此,一個完整的 隱馬爾科夫模型 已經(jīng)定義完畢了。
HMM一般由三類問題:
概率計算問題 ,即給定 A,B,π 和隱藏狀態(tài)序列,計算觀測序列的概率;
預(yù)測問題 ,也成解碼問題,已知 A,B,π 和觀測序列,求最優(yōu)可能對應(yīng)的狀態(tài)序列;
學(xué)習(xí)問題 ,已知觀測序列,估計模型的 A,B,π 參數(shù),使得在該模型下觀測序列的概率最大,即用極大似然估計的方法估計參數(shù)。
在jieba分詞中所用的是解碼問題,所以此處對預(yù)測問題和學(xué)習(xí)問題不做深入探討,在下一小節(jié)中我們將繼續(xù)以本節(jié)中的例子為例,對解碼問題進(jìn)行求解。
在jieba分詞中,采用了HMM進(jìn)行新詞發(fā)現(xiàn),它將每一個字表示為B/M/E/S分別代表出現(xiàn)在詞頭、詞中、詞尾以及單字成詞。將B/M/E/S作為HMM的隱藏狀態(tài),而連續(xù)的各個單字作為觀測狀態(tài),其任務(wù)即為利用觀測狀態(tài)預(yù)測隱藏狀態(tài),并且其模型的 A,B,π 概率已經(jīng)給出在文件中,所以這是一個標(biāo)準(zhǔn)的解碼問題。在jieba分詞中采用了 Viterbi算法 來進(jìn)行求解。
Viterbi算法的基本思想是: 如果最佳路徑經(jīng)過一個點(diǎn),那么起始點(diǎn)到這個點(diǎn)的路徑一定是最短路徑,否則用起始點(diǎn)到這點(diǎn)更短的一條路徑代替這段,就會得到更短的路徑,這顯然是矛盾的;從起始點(diǎn)到結(jié)束點(diǎn)的路徑,必然要經(jīng)過第n個時刻,假如第n個時刻有k個狀態(tài),那么最終路徑一定經(jīng)過起始點(diǎn)到時刻n中k個狀態(tài)里最短路徑的點(diǎn) 。
將時刻t隱藏狀態(tài)為i所有可能的狀態(tài)轉(zhuǎn)移路徑i1到i2的狀態(tài)最大值記為
下面我們繼續(xù)以上一節(jié)中的例子來對viterbi算法進(jìn)行闡述:
小明不知道小紅是哪里人,他只能通過小紅每天的活動來推斷那里的天氣。
假設(shè)連續(xù)三天,小紅的活動依次為:“睡覺-打游戲-逛街”,我們將據(jù)此計算最有可能的天氣情況。
表示第一天為雨天能夠使得第二天為晴天的概率最大(也就是說如果第二天是晴天在最短路徑上的話,第一天是雨天也一定在最短路徑上,參見上文中Viterbi算法的基本思想)
此時已經(jīng)到了最后的時刻,我們開始回溯。
其計算過程示意圖如下圖所示。
)的路徑。
TF-IDF(詞頻-逆文本頻率)是一種用以評估字詞在文檔中重要程度的統(tǒng)計方法。它的核心思想是,如果某個詞在一篇文章中出現(xiàn)的頻率即TF高,并且在其他文檔中出現(xiàn)的很少,則認(rèn)為這個詞有很好的類別區(qū)分能力。
其中:
TextRank是一種用以關(guān)鍵詞提取的算法,因?yàn)槭腔赑ageRank的,所以先介紹PageRank。
PageRank通過互聯(lián)網(wǎng)中的超鏈接關(guān)系確定一個網(wǎng)頁的排名,其公式是通過一種投票的思想來設(shè)計的:如果我們計算網(wǎng)頁A的PageRank值,那么我們需要知道哪些網(wǎng)頁鏈接到A,即首先得到A的入鏈,然后通過入鏈給網(wǎng)頁A進(jìn)行投票來計算A的PR值。其公式為:
其中:
d為阻尼系數(shù),取值范圍為0-1,代表從一定點(diǎn)指向其他任意點(diǎn)的概率,一般取值0.85。
將上式多次迭代即可直到收斂即可得到結(jié)果。
TextRank算法基于PageRank的思想,利用投票機(jī)制對文本中重要成分進(jìn)行排序。如果兩個詞在一個固定大小的窗口內(nèi)共同出現(xiàn)過,則認(rèn)為兩個詞之間存在連線。
公式與PageRank的基本相同。多次迭代直至收斂,即可得到結(jié)果。
在jieba分詞中,TextRank設(shè)定的詞窗口大小為5,將公式1迭代10次的結(jié)果作為最終權(quán)重的結(jié)果,而不一定迭代至收斂。
python做中文分詞處理主要有以下幾種:結(jié)巴分詞、NLTK、THULAC
1、fxsjy/jieba
結(jié)巴的標(biāo)語是:做最好的 Python 中文分詞組件,或許從現(xiàn)在來看它沒做到最好,但是已經(jīng)做到了使用的人最多。結(jié)巴分詞網(wǎng)上的學(xué)習(xí)資料和使用案例比較多,上手相對比較輕松,速度也比較快。
結(jié)巴的優(yōu)點(diǎn):
支持三種分詞模式
支持繁體分詞
支持自定義詞典
MIT 授權(quán)協(xié)議
2、THULAC:一個高效的中文詞法分析工具包
前兩天我在做有關(guān)于共享單車的用戶反饋分類,使用jieba分詞一直太過零散,分類分不好。后來江兄給我推薦了THULAC: 由清華大學(xué)自然語言處理與社會人文計算實(shí)驗(yàn)室研制推出的一套中文詞法分析工具包 。THULAC的接口文檔很詳細(xì),簡單易上手。
THULAC分詞的優(yōu)點(diǎn):
能力強(qiáng)。利用規(guī)模最大的人工分詞和詞性標(biāo)注中文語料庫(約含5800萬字)訓(xùn)練而成,模型標(biāo)注能力強(qiáng)大。
準(zhǔn)確率高。該工具包在標(biāo)準(zhǔn)數(shù)據(jù)集Chinese Treebank(CTB5)上分詞的F1值可達(dá)97.3%,詞性標(biāo)注的F1值可達(dá)到92.9%
速度較快。同時進(jìn)行分詞和詞性標(biāo)注速度為300KB/s,每秒可處理約15萬字。只進(jìn)行分詞速度達(dá)到1.3MB/s,速度比jieba慢
Python 解決中文編碼問題基本可以用以下邏輯:
utf8(輸入) —— unicode(處理) —— (輸出)utf8
Python 里面處理的字符都是都是unicode 編碼,因此解決編碼問題的方法是把輸入的文本(無論是什么編碼)解碼為(decode)unicode編碼,然后輸出時再編碼(encode)成所需編碼。
由于處理的一般為txt 文檔,所以最簡單的方法,是把txt 文檔另存為utf-8 編碼,然后使用Python 處理的時候解碼為unicode(sometexts.decode('utf8')),輸出結(jié)果回txt 的時候再編碼成utf8(直接用str() 函數(shù)就可以了)。
下面這個程序是對一個文本文件里的內(nèi)容進(jìn)行分詞的程序:test.py
[python] view plain copy
#!/usr/bin/python
#-*-?encoding:utf-8?-*-
import?jieba????????????????????????????????????????????????????#導(dǎo)入jieba模塊
def?splitSentence(inputFile,?outputFile):
fin?=?open(inputFile,?'r')??????????????????????????????????#以讀的方式打開文件
fout?=?open(outputFile,?'w')????????????????????????????????#以寫得方式打開文件
for?eachLine?in?fin:
line?=?eachLine.strip().decode('utf-8',?'ignore')???????#去除每行首尾可能出現(xiàn)的空格,并轉(zhuǎn)為Unicode進(jìn)行處理
wordList?=?list(jieba.cut(line))????????????????????????#用結(jié)巴分詞,對每行內(nèi)容進(jìn)行分詞
outStr?=?''
for?word?in?wordList:
outStr?+=?word
outStr?+=?'/?'
fout.write(outStr.strip().encode('utf-8')?+?'\n')???????#將分詞好的結(jié)果寫入到輸出文件
fin.close()
fout.close()
splitSentence('myInput.txt',?'myOutput.txt')
寫完程序之后,在Linux重點(diǎn)輸入:python test.py即可運(yùn)行程序進(jìn)行分詞。
輸入的文件內(nèi)容如下所示:
經(jīng)過結(jié)巴分詞后,輸出結(jié)果如下所示:
注意:第11行的 jieba.cut()返回的結(jié)構(gòu)是一個可迭代的generator,可以用list(jieba.cut(...))轉(zhuǎn)化為list
python中文分詞:結(jié)巴分詞
中文分詞是中文文本處理的一個基礎(chǔ)性工作,結(jié)巴分詞利用進(jìn)行中文分詞。其基本實(shí)現(xiàn)原理有三點(diǎn):
基于Trie樹結(jié)構(gòu)實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖(DAG)
采用了動態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合
對于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法
安裝(Linux環(huán)境)
下載工具包,解壓后進(jìn)入目錄下,運(yùn)行:python setup.py install
模式
默認(rèn)模式,試圖將句子最精確地切開,適合文本分析
全模式,把句子中所有的可以成詞的詞語都掃描出來,適合搜索引擎
接口
組件只提供jieba.cut 方法用于分詞
cut方法接受兩個輸入?yún)?shù):
第一個參數(shù)為需要分詞的字符串
cut_all參數(shù)用來控制分詞模式
待分詞的字符串可以是gbk字符串、utf-8字符串或者unicode
jieba.cut返回的結(jié)構(gòu)是一個可迭代的generator,可以使用for循環(huán)來獲得分詞后得到的每一個詞語(unicode),也可以用list(jieba.cut(...))轉(zhuǎn)化為list
實(shí)例
#! -*- coding:utf-8 -*-
import jieba
seg_list = jieba.cut("我來到北京清華大學(xué)", cut_all = True)
print "Full Mode:", ' '.join(seg_list)
seg_list = jieba.cut("我來到北京清華大學(xué)")
print "Default Mode:", ' '.join(seg_list)
Python代碼
#encoding=utf-8??
import?jieba??
seg_list?=?jieba.cut("我來到北京清華大學(xué)",cut_all=True)??
print?"Full?Mode:",?"/?".join(seg_list)?#全模式??
seg_list?=?jieba.cut("我來到北京清華大學(xué)",cut_all=False)??
print?"Default?Mode:",?"/?".join(seg_list)?#默認(rèn)模式??
seg_list?=?jieba.cut("他來到了網(wǎng)易杭研大廈")??
print?",?".join(seg_list)
輸出:?
Full?Mode:?我/?來/?來到/?到/?北/?北京/?京/?清/?清華/?清華大學(xué)/?華/?華大/?大/?大學(xué)/?學(xué)??
Default?Mode:?我/?來到/?北京/?清華大學(xué)??
他,?來到,?了,?網(wǎng)易,?杭研,?大廈????(此處,“杭研”并沒有在詞典中,但是也被Viterbi算法識別出來了)
# -*- coding: utf-8 -*-
import jieba
import jieba.posseg as pseg
import jieba.analyse
#jieba.load_userdict('userdict.txt')#jieba默認(rèn)有一個dict.txt詞庫,但可以根據(jù)自己需要加入自己的詞條
str1 = "訓(xùn)練一個可進(jìn)行N維分類的網(wǎng)絡(luò)的常用方法是使用多項(xiàng)式邏輯回歸"
str2 = "可以嘗試修改網(wǎng)絡(luò)架構(gòu)來準(zhǔn)確的復(fù)制全連接模型"
str3 = "模型的目標(biāo)函數(shù)是求交叉熵?fù)p失和所有權(quán)重衰減項(xiàng)的和,loss()函數(shù)的返回值就是這個值"
seg_list = jieba.cut(str1,cut_all =True) #全模式
print("/".join(seg_list))
result = pseg.cut(str1)
result2 = jieba.cut(str2) #精準(zhǔn)模式
result3 = jieba.analyse.extract_tags(str3,4) #關(guān)鍵詞提取
result4 = jieba.cut_for_search(str3) #搜索引擎模式
for w in result:
print(w.word,w.flag)
print(" ".join(result2))
print(" ".join(result3))
print(" ".join(result4))
當(dāng)前標(biāo)題:python結(jié)巴分詞函數(shù) 中文分詞算法python
標(biāo)題路徑:http://www.chinadenli.net/article22/dooeocc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、電子商務(wù)、搜索引擎優(yōu)化、做網(wǎng)站、品牌網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)