基于詞表的分詞方法
正向最大匹配算法FMM
從左到右掃描文本,得到詞的最大匹配。
案例分析:
用正向最大匹配法對(duì)“秦皇島今天晴空萬(wàn)里”進(jìn)行中文分詞,見下表。
詞典 :“秦皇島”“島”“今天”“天晴”“晴空萬(wàn)里”“萬(wàn)里”……
根據(jù)當(dāng)前詞典,單詞掃描的最大長(zhǎng)度 max=4
正向最大匹配函數(shù):
def FMM(dict, sentence): # 正向最大匹配算法FMM函數(shù),參數(shù)dict: 詞典 ,參數(shù)sentence: 句子
fmmresult = []
max_len = max([len(item) for item in dict])# max_len定義為詞典中最長(zhǎng)詞長(zhǎng)度
start = 0
while start != len(sentence): # FMM 為正向,start 從初始位置開始,指向結(jié)尾即為結(jié)束
index = start + max_len # index 的初始值為 start 的索引 + 詞典中元素的最大長(zhǎng)度或句子末尾
if index > len(sentence):
index = len(sentence)
for i in range(max_len):
# 當(dāng)分詞在字典中時(shí)或分到最后一個(gè)字時(shí),將其加入到結(jié)果列表中
if (sentence[start:index] in dict) or (len(sentence[start:index]) == 1):
# print(sentence[start:index], end='/')
fmmresult.append(sentence[start:index])
start = index# 分出一個(gè)詞,start 設(shè)置到 index 處
break
index += -1# 如果匹配失敗,則去掉最后一個(gè)字符
return fmmresult
逆向最大匹配算法RMM
從右到左掃描文本,得到詞的最大匹配。
在中文中,由于偏正結(jié)構(gòu)較多,所以從后向前進(jìn)行匹配會(huì)提高精確度,因此,逆向最大匹配算法比正向最大匹配算法的誤差要小。
逆向最大匹配函數(shù):
def RMM(dict, sentence): # 逆向最大匹配算法RMM函數(shù),參數(shù)dict: 詞典 ,參數(shù)sentence: 句子
rmmresult = []
max_len = max([len(item) for item in dict])# max_len定義為詞典中最長(zhǎng)詞長(zhǎng)度
start = len(sentence)
while start != 0: # RMM 為逆向,start 從末尾位置開始,指向開頭位置即為結(jié)束
index = start - max_len # 逆向時(shí) index 的初始值為 start 的索引 - 詞典中元素的最大長(zhǎng)度或句子開頭
if index < 0:
index = 0
for i in range(max_len):
# 當(dāng)分詞在字典中時(shí)或分到最后一個(gè)字時(shí),將其加入到結(jié)果列表中
if (sentence[index:start] in dict) or (len(sentence[index:start]) == 1):
# print(sentence[index:start], end='/')
rmmresult.insert(0, sentence[index:start])
start = index# 分出一個(gè)詞,start 設(shè)置到 index 處
break
index += 1 # 如果匹配失敗,則去掉最前面一個(gè)字符
return rmmresult
雙向最大匹配算法FMM
把正向最大匹配與逆向最大匹配都實(shí)施一遍,比較后選擇最優(yōu)結(jié)果。
雙向最大匹配函數(shù):
def BM(dict, sentence):# 雙向最大匹配(BM),參數(shù)dict: 詞典 ,參數(shù)sentence: 句子
res1 = FMM(dict, sentence) # res1 為 FMM 結(jié)果
res2 = RMM(dict, sentence) # res2 為 RMM 結(jié)果
if len(res1) == len(res2): # 若分詞數(shù)相同,則分情況討論
if res1 == res2: # 若FMM 與 RMM 的結(jié)果相同,則可取任意一個(gè)
return res1
else: # res1_sn 和 res2_sn 為兩個(gè)分詞結(jié)果的單字?jǐn)?shù)量,若二者不同,則返回單字較少的
res1_sn = len([i for i in res1 if len(i) == 1])
res2_sn = len([i for i in res2 if len(i) == 1])
return res1 if res1_sn < res2_sn else res2
else: # 若分詞數(shù)不同,則取分出詞較少的
return res1 if len(res1) < len(res2) else res2
調(diào)用函數(shù)舉例:
dict = [' 今日 ', ' 陽(yáng)光明媚 ', ' 光明 ', ' 明媚 ', ' 陽(yáng)光 ', ' 我們 ', ' 在 ', ' 在野 ', ' 生動(dòng) ', ' 野生 ', ' 動(dòng)物園 ', ' 野生動(dòng)物園 ', ' 物 ', ' 園 ', ' 玩 ']
sentence = ' 在野生動(dòng)物園玩 '
print("the results of FMM :\n", FMM(dict, sentence), end="\n") # 調(diào)用FMM函數(shù),輸出FMM分詞結(jié)果
print("the results of RMM :\n", RMM(dict, sentence), end="\n") # 調(diào)用RMM函數(shù),輸出RMM分詞結(jié)果
print("the results of BM :\n", BM(dict, sentence)) # 調(diào)用BM函數(shù),輸出BM分詞結(jié)果
缺點(diǎn): 基于詞表的分詞算法雖然簡(jiǎn)單快速,但對(duì)于未登錄詞以及切分歧義的情況無(wú)法處理。
基于N-gram的分詞方法
N-gram 模型稱為 N 元模型,它是一種語(yǔ)言模型,該語(yǔ)言模型是一個(gè)基于概率的判別模型,其輸入是一句話(詞的順序序列),輸出是這句話的概率, 即這句話里所有詞的聯(lián)合概率。 N-gram 模型可應(yīng)用在文化研究、分詞應(yīng)用、語(yǔ)音識(shí)別、輸入法、詞性標(biāo)注、垃圾短信分類、機(jī)器翻譯、語(yǔ)音識(shí)別、模糊匹配等領(lǐng)域。
N-gram分詞思想
此算法假設(shè)每個(gè)詞的出現(xiàn)只與它之前的 N-1 個(gè)詞相關(guān),通過(guò)大量的語(yǔ)料統(tǒng)計(jì)便可以得知句子中每個(gè)詞的出現(xiàn)概率,繼而計(jì)算出整個(gè)句子的出現(xiàn)概率。如果一個(gè)句子的出現(xiàn)概率越大,則越符合自然語(yǔ)言的規(guī)律。
通常 N 可以取 1、2、3、4, 其中 N 取 1、2、3 時(shí)分別稱為 unigram(一元分詞)、bigram(二元分詞)、trigram(三元分詞), 最常用的是 bigram 和 trigram。理論上,N 越大則 N-gram 模型越準(zhǔn)確,也越復(fù)雜,所需計(jì)算量和訓(xùn)練語(yǔ)料數(shù)據(jù)量也越大。
詞出現(xiàn)的概率可以直接從語(yǔ)料中統(tǒng)計(jì) N 個(gè)詞同時(shí)出現(xiàn)的次數(shù)得到。對(duì)于一個(gè)句子W,
假設(shè) W 是由詞序列 W1,W2,W3,…… ,Wn 組成的,那么概率可按如下公式計(jì)算。
P(W) =P(W1W2W3…Wn) =P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)
當(dāng)N=2時(shí),當(dāng)前詞只依賴它前面的詞(bigram):
P(W) =P(W1W2W3…Wn) =P(W1)P(W2|W1)P(W3|W2)…P(Wn|Wn-1)
N-gram分詞步驟:
①建立 N-gram 統(tǒng)計(jì)語(yǔ)言模型。
②對(duì)句子進(jìn)行單詞劃分,找出所有可能的分詞情況。
③對(duì)分詞的劃分結(jié)果進(jìn)行概率計(jì)算,找出出現(xiàn)可能性最大的分詞序列。
案例分析: 基于 N-gram 模型算法對(duì)“我喜歡觀賞日出”進(jìn)行中文分詞。
特點(diǎn): 基于 N-gram 模型的分詞算法是在原有中文算法基礎(chǔ)上進(jìn)行了改進(jìn),設(shè)計(jì)并且實(shí)現(xiàn)了新的中文分詞系統(tǒng),既實(shí)現(xiàn)了文本的快速分詞,又提高了中文分詞的準(zhǔn)確性,但其計(jì)算開銷比較大,并且仍然存在未登錄詞難以處理的問(wèn)題。
基于序列標(biāo)注的分詞方法
基于隱馬爾可夫模型的分詞方法
隱馬爾可夫模型(Hidden Markov Model,HMM)是關(guān)于時(shí)序的概率模型,描述由一個(gè)隱藏的馬爾可夫鏈隨機(jī)生成不可觀測(cè)(或稱為隱狀態(tài))的狀態(tài)隨機(jī)序列,再由各個(gè)狀態(tài)生成一個(gè)觀測(cè)從而產(chǎn)生觀測(cè)隨機(jī)序列的過(guò)程。
隱藏的馬爾可夫鏈隨機(jī)生成的狀態(tài)的序列, 稱為狀態(tài)序列 ;每個(gè)狀態(tài)生成一個(gè)觀測(cè),而由此產(chǎn)生的觀測(cè)的隨機(jī)序列,稱為觀測(cè)序列。 序列的每一個(gè)位置可以看作是一個(gè)時(shí)刻?;谛蛄袠?biāo)注的分詞算法除了有基于隱馬爾可夫模型,還有基于 CRF、基于 LSTM 等多種分詞算法。
隱馬爾可夫模型常應(yīng)用于序列標(biāo)注的問(wèn)題。它用于標(biāo)注時(shí),狀態(tài)對(duì)應(yīng)著標(biāo)記,標(biāo)注問(wèn)題是給定觀測(cè)序列預(yù)測(cè)其對(duì)應(yīng)的標(biāo)記序列。
隱馬爾可夫模型有兩個(gè)基本假設(shè) :馬爾可夫假設(shè)和觀測(cè)獨(dú)立性假設(shè)。
(1)馬爾可夫假設(shè) :即假設(shè)隱藏的馬爾可夫鏈在任意時(shí)刻 t 的狀態(tài)只依賴于其前一時(shí)刻的狀態(tài),與其他時(shí)刻的狀態(tài)及觀測(cè)無(wú)關(guān),也與時(shí)刻 t 無(wú)關(guān)。
(2)觀測(cè)獨(dú)立性假設(shè) :即假設(shè)任意時(shí)刻的觀測(cè)只依賴于該時(shí)刻的馬爾可夫鏈的狀態(tài), 與其他觀測(cè)及狀態(tài)無(wú)關(guān)。
基于隱馬爾可夫模型進(jìn)行中文分詞的基本原理: HMM 模型把分詞問(wèn)題轉(zhuǎn)化為序列標(biāo)注問(wèn)題, 也就是給定一個(gè)句子作為輸入,以“BEMS”組成的序列串作為輸出,然后再進(jìn)行分詞,從而得到輸入句子的劃分。其中:
? B(Begin)代表詞的起始位置,
? M(Middle) 代表詞的中間位置,
? E(End)表示詞的結(jié)束位置,
? S(Single)代表單字成詞。
設(shè)觀測(cè)狀態(tài)集合(輸入句子序列)為O={o1, o2, ?, on},隱藏狀態(tài)集合(“BMES”序列)I={i1, i2, ?, in},中文分詞就是對(duì)給定的觀測(cè)序列,求解對(duì)應(yīng)的最有可能的隱藏狀態(tài)序列,即求解最大條件概率maxP(i1, ?, in | o1,?, on),利用貝葉斯公式可得:
案例分析: 其中觀測(cè)序列也就是可見序列,狀態(tài)序列也就是隱含序列。
基于條件隨機(jī)場(chǎng)(CRF)的分詞算法
基于條件隨機(jī)場(chǎng)(Conditional Random Field,CRF)的分詞算法是一種判別式的無(wú)向圖模型,它試圖對(duì)多個(gè)變量在給定觀測(cè)值后的條件概率進(jìn)行建模,常用于序列標(biāo)注問(wèn)題。 在 CRF 的假設(shè)中,每個(gè)狀態(tài)不僅僅與它前面的狀態(tài)有關(guān),還與它后面的狀態(tài)有關(guān)。與隱馬爾可夫模型相比,CRF考慮的影響范圍更大,顧及更多數(shù)量的特征函數(shù)以及相應(yīng)權(quán)重。 因此該算法的精度也更高,當(dāng)然計(jì)算代價(jià)也偏高。
基于循環(huán)神經(jīng)網(wǎng)絡(luò)模型的分詞算法
深度學(xué)習(xí)中的循環(huán)神經(jīng)網(wǎng)絡(luò)也適用于序列標(biāo)注問(wèn)題,可以采用 CNN、LSTM 等深度學(xué)習(xí)模型,結(jié)合 CRF 等分類算法,從而實(shí)現(xiàn)中文分詞。
分詞工具
常見的中文分詞工具:
HanLP 分詞器、Jieba(結(jié)巴)分詞、哈工大的語(yǔ)言技術(shù)平臺(tái) LTP 及其語(yǔ)言云 LTP-Cloud、清華大學(xué)的中文詞法分析工具包 THULAC、北京大學(xué)的中文分詞工具包 pkuseg、斯坦福分詞器、 基于深度學(xué)習(xí)的分詞系統(tǒng) KCWS、新加坡科技設(shè)計(jì)大學(xué)的中文分詞器 ZPar、IKAnalyzer、 Jcseg、復(fù)旦大學(xué)的 FudanNLP、中文文本處理庫(kù)SnowNLP、ansj 分詞器、自然語(yǔ)言處理工 具包 NLTK、玻森中文語(yǔ)義開放平臺(tái) BosonNLP、簡(jiǎn)易中文分詞系統(tǒng) SCWS、IKAnalyzer、 庖丁解牛、中科院計(jì)算所 NLPIR 分詞系統(tǒng)、騰訊文智、百度 NLP、阿里云 NLP、新浪云、 搜狗分詞、盤古分詞等等。
Jieba 分詞
Jieba 分詞是一個(gè) Python 中文分詞組件。
功能:可以對(duì)中文文本進(jìn)行分詞、詞性標(biāo)注、關(guān)鍵詞抽取等,并且支持自定義詞典。
原理:算法使用了基于前綴詞典實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能生成詞情況所構(gòu)成的有向無(wú)環(huán)圖,再采用動(dòng)態(tài)規(guī)劃查找最大概率路徑,從而找出基于詞頻的最大切分組合。對(duì)于未登錄詞,它采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法。
特點(diǎn):在詞典文件添加自定義詞典速度快,適用于詞典數(shù)量大于五千萬(wàn)。但是其自定義詞典時(shí),帶空格的詞并不支持。
安裝:
全自動(dòng)安裝:easy_install jieba 或者 pip install jieba / pip3 install jieba
半自動(dòng)安裝:先下載 http://pypi.python.org/pypi/jieba/ ,解壓后運(yùn)行 python setup.py install
手動(dòng)安裝:將 jieba 目錄放置于當(dāng)前目錄或者 site-packages 目錄
通過(guò)pycharm安裝
模式:
基本應(yīng)用:
案例分析:
對(duì)“燕山大學(xué)源于哈爾濱工業(yè)大學(xué),始建于 1920 年”這句中文文本,使用 Jieba 分詞工具進(jìn)行分詞。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-416572.html
import jieba
# 全模式
seg_list = jieba.cut(" 燕山大學(xué)源于哈爾濱工業(yè)大學(xué),始建于 1920 年 ",cut_all=True)
print(" 全模式 :", "/ ".join(seg_list))
# 精確模式
seg_list = jieba.cut(" 燕山大學(xué)源于哈爾濱工業(yè)大學(xué),始建于 1920 年 ",cut_all=False)
print(" 精確模式 :", "/ ".join(seg_list))
# 默認(rèn)是精確模式
seg_list = jieba.cut(" 燕山大學(xué)源于哈爾濱工業(yè)大學(xué),始建于 1920 年 ")
print(" 默認(rèn)模式 :",", ".join(seg_list))
# 搜索引擎模式
seg_list = jieba.cut_for_search(" 燕山大學(xué)源于哈爾濱工業(yè)大學(xué),始建于 1920 年 ")
print(" 搜素引擎模式 :",", ".join(seg_list))
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-416572.html
到了這里,關(guān)于詳細(xì)介紹NLP中文分詞原理及分詞工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!