中文分词的古今中外,你想知道的都在这里
作者:QvQ,夕小瑤,小鹿鹿鹿
前言
分詞(word tokenization),也叫切詞,即通過某種方式將句子中的各個(gè)詞語識(shí)別并分離開來,使得文本從“字序列”的表示升級(jí)為“詞序列”表示。分詞技術(shù)不僅僅適用于中文,對(duì)于英文、日文、韓文等語言也同樣適用。
雖然英文中有天然的單詞分隔符(空格),但是常有單詞與其他標(biāo)點(diǎn)黏滯的情況,比如"Hey, how are you."中的"Hey"和"you"是需要與身后的標(biāo)點(diǎn)分隔開的
目錄
為什么需要分詞?
能不能不分詞?
中文分詞難在哪?
從古至今的分詞算法:詞典到預(yù)訓(xùn)練
從中到外的分詞工具
為什么需要分詞?
對(duì)于中文來說,如果不進(jìn)行分詞,那么神經(jīng)網(wǎng)絡(luò)將直接基于原始的漢字序列進(jìn)行處理和學(xué)習(xí)。然而我們知道一個(gè)字在不同的詞語中可能含義迥然不同,比如“哈哈”與“哈士奇”中“哈”的含義相去甚遠(yuǎn),如果模型在訓(xùn)練階段沒見過“哈士奇”,那么預(yù)測的時(shí)候就有可能以為“哈士奇”所在的句子在表達(dá)歡快的氣氛了╮( ̄▽ ̄"")╭
顯然,要解決上述問題的話,分詞就是了,分詞之后,最小的輸入單位就不再是字了,而是詞,由于“哈哈”與“哈士奇”是兩個(gè)不同的詞,自然就不會(huì)有前面這個(gè)問題啦。因此可以認(rèn)為,分詞緩解了“一字多義”的問題。
除此之外,從特征(feature)與NLP任務(wù)的角度來說,字相比詞來說,是更原始和低級(jí)的特征,往往與任務(wù)目標(biāo)的關(guān)聯(lián)比較小;而到了詞級(jí)別后,往往與任務(wù)目標(biāo)能發(fā)生很強(qiáng)的關(guān)聯(lián)。比如對(duì)于情感分類任務(wù),“我今天走狗屎運(yùn)了”這句中的每個(gè)字都跟正向情感關(guān)系不大,甚至“狗”這個(gè)字還往往跟負(fù)面情感密切相關(guān),但是“狗屎運(yùn)”這個(gè)詞卻表達(dá)了“幸運(yùn)”、“開心”、“驚喜”的正向情感,因此,分詞可以看作是給模型提供了更high-level、更直接的feature,丟給模型后自然容易獲得更佳的表現(xiàn)。
能不能不分詞?
答案是,當(dāng)然可以。從前面分詞的目的可以看出,只要模型本身能夠?qū)W習(xí)到字的多義性,并且自己學(xué)到由字組詞的規(guī)律,那么就相當(dāng)于隱含的內(nèi)置了一個(gè)分詞器在模型內(nèi)部,這時(shí)候這個(gè)內(nèi)置的分詞器是與解決目標(biāo)任務(wù)的網(wǎng)絡(luò)部分一起“端到端訓(xùn)練”的,因此甚至可能獲得更佳的性能。
然而,從上面這段的描述也能看出,要滿足這個(gè)條件,是很難得的。這需要訓(xùn)練語料非常豐富,且模型足夠大(可以有額外容量來內(nèi)置一個(gè)隱含的分詞模型),才有可能獲得比“分詞器+詞級(jí)模型“更好的表現(xiàn)。這也是為什么BERT等大型預(yù)訓(xùn)練模型往往是字級(jí)別的,完全不需要使用分詞器。
此外,分詞也并不是百利而無一害的,一旦分詞器的精度不夠高,或者語料本身就噪聲很大(錯(cuò)字多、句式雜亂、各種不規(guī)范用語),這時(shí)強(qiáng)行分詞反而容易使得模型更難學(xué)習(xí)。比如模型終于學(xué)會(huì)了“哈士奇”這個(gè)詞,卻有人把哈士奇打成了“蛤士奇”,結(jié)果分詞器沒認(rèn)出來,把它分成了“蛤”、“士”、“奇”這三個(gè)字,這樣我們這個(gè)已經(jīng)訓(xùn)練好的“word level模型”就看不到“哈士奇”了(畢竟模型訓(xùn)練的時(shí)候,“哈士奇”是基本單位)。
中文分詞難在哪?
1 歧義問題
首先,前面提到分詞可以緩解“一字多義”的問題,但是分詞本身又會(huì)面臨“切分歧義”的問題。
?
例如,切分書名《無線電法國別研究》
? ? ? ? ? ? ?
雖然切分成《無線電/法國/別/研究》看起來沒毛病,但是考慮到這是個(gè)書名,顯然正解《無線電法/國別/研究》對(duì)分詞器來說太南了(。 ?︿ ?。)而如果不告訴你這是一個(gè)書名,顯然兩種切分方式看起來都沒毛病。
?
2 未登錄詞問題
此外,中文詞典也是與時(shí)俱進(jìn)的,例如“青青草原”、“累覺不愛”等網(wǎng)絡(luò)詞在10年前是沒有的,今天訓(xùn)練的分詞器也一定會(huì)在不久的將來遇到不認(rèn)識(shí)的詞(即“未登錄詞”,out-of-vocabulary word),那個(gè)時(shí)候分詞器很容易因?yàn)椤奥湮椤倍霈F(xiàn)切分錯(cuò)誤。
?
3 規(guī)范問題
最后,分詞時(shí)的切分邊界也一直沒有一個(gè)確定的規(guī)范。盡管在 1992 年國家頒布了《信息處理用現(xiàn)代詞漢語分詞規(guī)范》,但是這種規(guī)范很容易受主觀因素影響,在實(shí)際場景中也難免遇到有所不及的問題。
算法篇
1 基于詞典
對(duì)于中文分詞問題,最簡單的算法就是基于詞典直接進(jìn)行greedy匹配。
?
比如,我們可以直接從句子開頭的第一個(gè)字開始查字典,找出字典中以該字開頭的最長的單詞,然后就得到了第一個(gè)切分好的詞。比如這句“夕小瑤正在講NLP”,查字典發(fā)現(xiàn)“夕小瑤”是最長的詞了,于是得到
夕小瑤/正在講NLP
然后從下一個(gè)詞的開頭開始繼續(xù)匹配字典,發(fā)現(xiàn)“正在”就是最長的詞了,于是
夕小瑤/正在/講NLP
依此類推,最終得到
夕小瑤/正在/講/NLP
這種簡單的算法即為前向最大匹配法(FMM)
雖然做法很樸素,但是名字聽起來還有點(diǎn)高端╮(╯▽╰)╭
不過,由于中文句子本身具有重要信息后置的特點(diǎn),從后往前匹配的分詞正確率往往要高于從前往后,于是就有了反向進(jìn)行的“后向最大匹配法(BMM)”。
?
當(dāng)然了,無論是FMM還是BMM,都一定存在不少切分錯(cuò)誤,因此一種考慮更周到的方法是“雙向最大匹配”。
?
雙向最大匹配算法是指對(duì)待切分句子分別使用FMM和RMM進(jìn)行分詞,然后對(duì)切分結(jié)果不重合的歧義句進(jìn)行進(jìn)一步的處理。通常可對(duì)兩種方法得到的詞匯數(shù)目進(jìn)行比較,根據(jù)數(shù)目的相同與否采取相應(yīng)的措施,以此來降低歧義句的分詞錯(cuò)誤率.
2 基于統(tǒng)計(jì)
2.1 基于語言模型
基于詞典的方法雖然簡單,但是明顯能看出來太!不!智!能!了!稍微復(fù)雜一些的句子,例如“沒關(guān)系,除夕小瑤在家做飯。”,這時(shí)候如果使用后向最大匹配法,就會(huì)切分成“沒關(guān)系/,/除/夕小瑤/在家/做飯/。”,這明顯錯(cuò)的很不可原諒。
?
犯這種錯(cuò)誤的根本原因在于,基于詞典的方法在切分時(shí)是沒有考慮詞語所在的上下文的,沒有從全局出發(fā)找最優(yōu)解。其實(shí)上面這個(gè)句子無非就是在糾結(jié)兩種切分方式:
a. 沒關(guān)系/,/除/夕小瑤/在家/做飯/。
b. 沒關(guān)系/,/除夕/小瑤/在家/做飯/。
我們?nèi)粘Uf話中很少會(huì)有人說出“沒關(guān)系/,/除/xxxx/做飯/。”這種句子,而第二個(gè)句子出現(xiàn)的頻率則會(huì)非常高,比如里面的“小瑤”可以替換成“我”、“老王”等。顯然給定一個(gè)句子,各種切分組合是數(shù)量有限的,如果有一個(gè)東西可以評(píng)估出任何一個(gè)組合的存在合理性的分值,那么不就找到了最佳的分詞組合嘛!
?
所以,這種方法的本質(zhì)就是在各種切詞組合中找出那個(gè)最合理的組合,這個(gè)過程就可以看作在切分詞圖中找出一條概率最大的路徑:
? ? ? ?? ? ? ?
而這個(gè)可以給詞序列存在合理性打分的東西就叫做“語言模型”(language model)。這種利用語言模型來評(píng)估各種切分組合的方法是不是就顯得智能多啦╮(╯▽╰)╭
?
給定一個(gè)句子分詞后得到的單詞序列{w1,w2...wm},語言模型就能計(jì)算出這個(gè)句子(或者說詞序列)存在的可能性:
這個(gè)表達(dá)式可通過鏈?zhǔn)椒▌t進(jìn)行展開:
? ? ?
顯然,當(dāng)m取值稍微一大,乘法鏈的后面幾項(xiàng)會(huì)變得非常難計(jì)算(估計(jì)出這幾項(xiàng)的概率需要依賴極其龐大的語料才能保證估計(jì)誤差可接受)。計(jì)算困難怎么辦?當(dāng)然是用合理的假設(shè)來簡化計(jì)算,比如我們可以假設(shè)當(dāng)前位置取什么詞僅取決于相鄰的前面n個(gè)位置,即
這種簡化的語言模型就稱為n-gram語言模型。這樣乘法鏈中的每個(gè)乘子都可以在已經(jīng)完成人工標(biāo)注的分詞語料中計(jì)算得到啦。當(dāng)然了,在實(shí)際計(jì)算中可能還會(huì)引入一些平滑技巧,來彌補(bǔ)分詞語料規(guī)模有限導(dǎo)致的估計(jì)誤差,這里就不展開講啦。
2.2 基于統(tǒng)計(jì)機(jī)器學(xué)習(xí)
NLP是一門跟機(jī)器學(xué)習(xí)強(qiáng)綁定的學(xué)科,分詞問題自然也不例外。中文分詞同樣可以建模成一個(gè)“序列標(biāo)注”問題,即一個(gè)考慮上下文的字分類問題。因此可以先通過帶標(biāo)簽的分詞語料來訓(xùn)練一個(gè)序列標(biāo)注模型,再用這個(gè)模型對(duì)無標(biāo)簽的語料進(jìn)行分詞。
?
樣本標(biāo)簽
?
一般用{B:begin, M:middle, E:end, S:single}這4個(gè)類別來描述一個(gè)分詞樣本中每個(gè)字所屬的類別。它們代表的是該字在詞語中的位置。其中,B代表該字是詞語中的起始字,M代表是詞語中的中間字,E代表是詞語中的結(jié)束字,S則代表是單字成詞。
一個(gè)樣本如下所示:
人/b? 們/e? 常/s? 說/s? 生/b? 活/e? 是/s? 一/s? 部/s? 教/b? 科/m? 書/e
?
之后我們就可以直接套用統(tǒng)計(jì)機(jī)器學(xué)習(xí)模型來訓(xùn)練出一個(gè)分詞器啦。統(tǒng)計(jì)序列標(biāo)注模型的代表就是生成式模型的代表——隱馬爾可夫模型(HMM),和判別式模型的代表——(線性鏈)條件隨機(jī)場(CRF)。已經(jīng)對(duì)這兩個(gè)模型很熟悉的小伙伴可以跳過。
?
隱馬爾可夫模型(HMM)
?
HMM模型的詳細(xì)介紹見
《如果你跟夕小瑤戀愛了... (上)》? /? ?《下》
在了解了HMM模型的基本概念之后,我們來看看HMM模型是如何進(jìn)行分詞的吧~
基本思路:將分詞問題轉(zhuǎn)換為給每個(gè)位置的字進(jìn)行分類的問題,即序列標(biāo)注問題。其中,類別有4個(gè)(前面講到的B、M、E、S)。給所有的位置分類完成后,便可以根據(jù)類別序列得到分詞結(jié)果啦。
?
舉個(gè)栗子!
?
我們的輸入是一個(gè)句子:
小Q碩士畢業(yè)于中國科學(xué)院通過算法,我們成功預(yù)測出各個(gè)字位對(duì)應(yīng)的分詞標(biāo)簽:
BEBEBMEBEBME根據(jù)這個(gè)狀態(tài)序列我們可以進(jìn)行切詞:
BE/BE/BME/BE/BME所以切詞結(jié)果如下:
小Q/碩士/畢業(yè)于/中國/科學(xué)院?
那么問題又來了,假如一個(gè)完美的HMM分詞模型給你了,那么如何用這個(gè)模型對(duì)輸入的字序列進(jìn)行序列標(biāo)注呢?
?
首先看下HMM模型中的兩個(gè)核心概念:觀測序列和狀態(tài)序列。
觀測序列就是我可以直接看到的序列,也就是“小Q碩士畢業(yè)于中國科學(xué)院”這個(gè)字序列,而狀態(tài)序列則是不能通過肉眼直接觀察到的內(nèi)在序列,也就是上面這句話所對(duì)應(yīng)的標(biāo)注結(jié)果“BEBEBMEBEBME”,而我們的HMM模型,就可以幫助我們完成從觀測序列->狀態(tài)序列的華麗變身!
?
用數(shù)學(xué)抽象表示如下:用??代表輸入的句子,n為句子長度,表示字,??代表輸出的標(biāo)簽,那么理想的輸出即為:
? ? ? ?
我們的理想輸出的是? ?,通過貝葉斯公式能夠得到:
為給定的輸入,因此 ?計(jì)算為常數(shù),可以忽略,因此最大化?等價(jià)于最大化 ?.
可是,上面這個(gè)式子也太難算了吧!!!為此,聰明的科學(xué)家們引入了兩個(gè)可以簡化計(jì)算的假說:
觀測獨(dú)立性假設(shè):每個(gè)字的輸出僅僅與當(dāng)前字有關(guān),即每個(gè)λ的值只依賴于其對(duì)應(yīng)的O值,即
?
齊次馬爾可夫假設(shè):每個(gè)輸出僅僅與上一個(gè)輸出有關(guān),即Oi的值只依賴于Oi-1,即
綜合上面兩個(gè)式子,我們得到:
? ? ?
在HMM中,將稱為觀測概率, ?稱為轉(zhuǎn)移概率。通過設(shè)置某些?,可以排除類似BBB、EM等不合理的組合。
?
最后,求解?? ?的常用方法是Veterbi算法。它是一種動(dòng)態(tài)規(guī)劃方法,核心思想是:如果最終的最優(yōu)路徑經(jīng)過某個(gè)?,那么從初始節(jié)點(diǎn)到 ?點(diǎn)的路徑必然也是一個(gè)最優(yōu)路徑。當(dāng)然啦,這一切的前提是HMM中的模型參數(shù)都已經(jīng)被訓(xùn)練好了,而訓(xùn)練這些模型參數(shù)可以通過萬能的極大似然估計(jì)來從有標(biāo)簽的分詞語料中學(xué)習(xí)得到,這里就不展開贅述啦,對(duì)細(xì)節(jié)不清楚的小伙伴可參考本小節(jié)開頭給出的兩篇文章。
?
條件隨機(jī)場 (CRF)
?
HMM隱馬模型有一個(gè)非常大的缺點(diǎn),就是其存在輸出獨(dú)立性假設(shè),導(dǎo)致其不能將上下文納入特征設(shè)計(jì),大大限制了特征的可用范圍。CRF則沒有這個(gè)限制,它不對(duì)單獨(dú)的節(jié)點(diǎn)進(jìn)行歸一化,而是對(duì)所有特征進(jìn)行全局歸一化,進(jìn)而全局的最優(yōu)值。因此,在分詞問題上,顯然作為判別式模型的CRF相比HMM更具優(yōu)越性。
?
關(guān)于CRF的詳細(xì)介紹可以看小夕之前寫的這篇推文:
《邏輯回歸到條件隨機(jī)場》
?
這里再來簡單回顧一下。
?
HMM模型圍繞的是一個(gè)關(guān)于序列X和Y的聯(lián)合概率分布????(????,????),而條件隨機(jī)場則圍繞條件概率分布模型????(????|????)展開。
? ? ? ? ? ? ?
從圖中我們可以看出模型之間的遞進(jìn)關(guān)系,CRF是一個(gè)概率無向圖模型,它和HMM很類似,但是CRF沒有隱變量,并且是一個(gè)判別模型。使用CRF計(jì)算序列中的每個(gè)字位??????????對(duì)應(yīng)的分詞標(biāo)簽??????????時(shí),都可以看做是一次考慮上下文依賴關(guān)系的分類。
CRF通過定義條件概率P(Y∣X) 來描述模型。?
?? ? ? ?
Z(x)就是概率圖模型中的配分函數(shù),目的就是提供一個(gè)歸一化因子,將各個(gè)類別的值求和,為計(jì)算每個(gè)類別的概率提供一個(gè)分母,對(duì)這個(gè)思想還不清楚的小伙伴請(qǐng)移步本節(jié)開頭的推薦文章哦,這里不再贅述其背后的數(shù)學(xué)思想了。K為設(shè)計(jì)的特征(函數(shù))的數(shù)量,w_k為每個(gè)特征函數(shù)待學(xué)習(xí)的權(quán)重。
?
而這里的f_k就是能夠幫助CRF完成分詞的特征啦,確切的說是特征函數(shù)。特征函數(shù)可以看作一個(gè)比較復(fù)雜的特征,特征值取決于多個(gè)輸入變量的取值。當(dāng)然啦,這里只給出了簡化形式,特征函數(shù)又分為轉(zhuǎn)移特征和狀態(tài)特征,其中轉(zhuǎn)移特征會(huì)考慮歷史時(shí)刻的輸出,而狀態(tài)特征僅考慮當(dāng)前時(shí)刻。
?
舉個(gè)特征函數(shù)的栗子:
f(y_1, x_1, x) = {1 if y_1 == 'I' and x_1 == '小' and x=='瑤'; else 0}
這里即表示如果當(dāng)前位置的字(觀測值)是‘瑤’,且上個(gè)位置的字是‘小’,且上個(gè)位置的預(yù)測標(biāo)簽是類別‘I’,那么該特征函數(shù)會(huì)輸出1,也就是說該特征的特征值為1,其余情況均為0。顯然這個(gè)特征一旦取值為1,則是一個(gè)很強(qiáng)的特征來指示‘瑤’這個(gè)字的位置的預(yù)測標(biāo)簽為‘E’。
?
與HMM一樣,訓(xùn)練CRF中的參數(shù)依然是通過萬能的極大似然估計(jì),具體算法形式如梯度下降法、IIS、擬牛頓法等。訓(xùn)練好CRF分詞模型后,跟HMM一樣, 可以通過Viterbi算法來進(jìn)行全局的推理,從而得到最優(yōu)的分詞序列。這里同樣不展開講啦。
?
總結(jié)一下,與HMM比,使用CRF進(jìn)行分詞有以下優(yōu)點(diǎn):
CRF可以使用輸入文本的全局特征,而HMM只能看到輸入文本在當(dāng)前位置的局部特征
CRF是判別式模型,直接對(duì)序列標(biāo)注建模;HMM則引入了不必要的先驗(yàn)信息
3 基于神經(jīng)網(wǎng)絡(luò)
眾所周知,深度學(xué)習(xí)已經(jīng)成功占領(lǐng)NLP,席卷了NLP中的分類、序列標(biāo)注和生成問題。如前所述,分詞也可以建模為序列標(biāo)注問題,那么擅長處理序列數(shù)據(jù)的LSTM(長短時(shí)記憶網(wǎng)絡(luò)+超鏈接到歷史推文)和最近超級(jí)火的預(yù)訓(xùn)練模型同樣可以用于中文分詞。
3.1 基于(Bi-)LSTM
對(duì)LSTM模型還不熟悉的小伙伴見小夕以前寫的這篇的《step-by-step to LSTM》,本文對(duì)lstm的基本理論不再贅述啦。
?
如前面語言模型一節(jié)中所述,字的上下文信息對(duì)于排解切分歧義來說非常重要,能考慮的上下文越長,自然排解歧義的能力就越強(qiáng)。而前面的n-gram語言模型也只能做到考慮一定距離的上下文,那么有沒有在理論上能考慮無限長上下文距離的分詞模型呢?
?
答案就是基于LSTM來做。
?
當(dāng)然啦,LSTM是有方向的,為了讓每個(gè)位置的字分類時(shí)既能考慮全部歷史信息(左邊的所有的字),又能考慮全部未來信息(右邊所有的字),我們可以使用雙向LSTM(Bi-LSTM)來充當(dāng)序列標(biāo)注的骨架模型,如圖
? ? ? ?
LSTM完成對(duì)每個(gè)位置的上下文信息的編碼后,最終通過softmax分類層完成對(duì)每個(gè)位置的分類,從而跟HMM和CRF一樣完成了基于序列標(biāo)注的中文分詞。
?
3.2 基于預(yù)訓(xùn)練模型+知識(shí)蒸餾
?
最近的一年多的時(shí)間里,BERT、ERNIE、XLNet等大型預(yù)訓(xùn)練席卷了NLP的絕大部分領(lǐng)域,在分詞問題上也有顯著的優(yōu)越性。
? ? ? ?? ? ? ?
然而,眾所周知,預(yù)訓(xùn)練模型太大了,過于消耗計(jì)算資源,如果要對(duì)海量的文本進(jìn)行分詞,哪怕用上8卡的32G Tesla V100都會(huì)顯得力不從心,因此一種解決方案就是,將預(yù)訓(xùn)練模型中的分詞知識(shí)通過知識(shí)蒸餾(Knowledge Distillation)來遷移到小模型(比如LSTM、GRU)上。近期Jieba分詞器中就上線了這么一個(gè)用這種方法得到的先進(jìn)分詞模型(其實(shí)是個(gè)通用的詞法分析模型),感興趣的小伙伴可以自行了解一下。預(yù)訓(xùn)練模型和知識(shí)蒸餾的資料很多了,這里就不贅述啦。
工具篇
下面列了幾個(gè)較為主流的分詞工具(排名不分先后,大家自行試用),相關(guān)的paper請(qǐng)?jiān)谟嗛喬?hào)后臺(tái)回復(fù)【中文分詞】領(lǐng)取。
1 Jieba
說到分詞工具第一個(gè)想到的肯定是家喻戶曉的“結(jié)巴”中文分詞,主要算法是前面講到的基于統(tǒng)計(jì)的最短路徑詞圖切分,近期還內(nèi)置了百度飛槳的預(yù)訓(xùn)練模型+大規(guī)模蒸餾的前沿分詞模型。
github項(xiàng)目地址:https://github.com/fxsjy/jieba
使用示例:
#encoding=utf-8 #Jieba #pip install jieba import jiebasentence = "不會(huì)講課的程序員不是一名好的算法工程師" tokens = jieba.cut(sentence) print("jieba: " + " ".join(tokens))#output #Building prefix dict from the default dictionary ... #Loading model from cache /tmp/jieba.cache #Loading model cost 0.266 seconds. #Prefix dict has been built successfully. #jieba: 不會(huì) 講課 的 程序員 不是 一名 好 的 算法 工程2 THULAC(THU Lexical Analyzer for Chinese)
由清華大學(xué)自然語言處理與社會(huì)人文計(jì)算實(shí)驗(yàn)室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標(biāo)注功能。該工具所采用的分詞模型為結(jié)構(gòu)化感知機(jī)。更多算法細(xì)節(jié)請(qǐng)參考github項(xiàng)目和閱讀論文原文。
github項(xiàng)目地址:https://github.com/thunlp/THULAC
論文鏈接:https://www.mitpressjournals.org/doi/pdf/10.1162/coli.2009.35.4.35403
使用示例:
#THULAC #pip install thulac import thulacsentence = "不會(huì)講課的程序員不是一名好的算法工程師" thu1 = thulac.thulac(seg_only=True) #只分詞 text = thu1.cut(sentence, text=True) #進(jìn)行一句話分詞 print("THULAC: " + text)#output #Model loaded succeed #THULAC: 不 會(huì) 講課 的 程序員 不 是 一 名 好 的 算法 工程師?
3 NLPIR-ICTCLAS漢語分詞系統(tǒng)
北京理工大學(xué)海量語言信息處理與云計(jì)算工程研究中心大數(shù)據(jù)搜索與挖掘?qū)嶒?yàn)室( Big Data Search and Mining Lab.BDSM@BIT)發(fā)布。是基于層次HMM的分詞庫,將分詞、POS、NER等都納入到了一個(gè)層次HMM的框架之下聯(lián)合訓(xùn)練得到。
主頁:http://ictclas.nlpir.org/
github項(xiàng)目地址:https://github.com/tsroten/pynlpir
使用示例:
#NLPIR-ICTCLAS #pip install pynlpir import pynlpirsentence = "不會(huì)講課的程序員不是一名好的算法工程師" pynlpir.open() tokens = [x[0] for x in pynlpir.segment(sentence)] print("NLPIR-TCTCLAS: " + " ".join(tokens)) pynlpir.close()#output #NLPIR-TCTCLAS: 不 會(huì) 講課 的 程序員 不 是 一 名 好 的 算法 工程4 LTP
哈工大出品,同THULAC一樣,LTP也是基于結(jié)構(gòu)化感知器(Structured Perceptron, SP),以最大熵準(zhǔn)則學(xué)習(xí)的分詞模型。
項(xiàng)目主頁:https://www.ltp-cloud.com/
github項(xiàng)目地址:https://github.com/HIT-SCIR/ltp
論文鏈接:http://jcip.cipsc.org.cn/CN/abstract/abstract1579.shtml
使用示例:使用前需下載分詞模型(http://ltp.ai/download.html)
#LTP #pip install pyltp from pyltp import Segmentorsentence = "不會(huì)講課的程序員不是一名好的算法工程師" segmentor = Segmentor() #segmentor.load("/path/to/your/cws/model") segmentor.load("ltp_data_v3.4.0/cws.model") tokens = segmentor.segment(sentence) print("LTP: " + " ".join(tokens)) segmentor.release()#output #LTP: 不 會(huì) 講課 的 程序員 不 是 一 名 好 的 算法 工程5 HanLP
HanLP是隨《自然語言處理入門》配套開源的一系列NLP算法庫。除了經(jīng)典的1.x版本在不斷迭代更新以外,今年還全新推出了2.0版本。1.x版本有有基于詞典的分詞工具和基于CRF的切詞模型。2.0版本開源了基于深度學(xué)習(xí)算法的分詞工具。
?
1.x版本
github項(xiàng)目地址:https://github.com/hankcs/pyhanlp
使用示例:
#HanLP #v1.x #pip install pyhanlp from pyhanlp import *sentence = "不會(huì)講課的程序員不是一名好的算法工程師" print(HanLP.segment(sentence))2.0版本
github地址:https://github.com/hankcs/HanLP/tree/doc-zh
使用示例:要求Python 3.6以上使用
#HanLP #v2.0 #pip install hanlp import hanlpsentence = "不會(huì)講課的程序員不是一名好的算法工程師" tokenizer = hanlp.load('PKU_NAME_MERGED_SIX_MONTHS_CONVSEG') tokens = tokenizer(sentence) print("hanlp 2.0: " + " ".join(tokens)) #output #hanlp 2.0: 不 會(huì) 講課 的 程序員 不 是 一 名 好 的 算法 工程6 Stanford CoreNLP
斯坦福推出的切詞工具,可以支持多種語言。算法核心是基于CRF模型。
github項(xiàng)目地址:https://github.com/Lynten/stanford-corenlp
論文鏈接:https://nlp.stanford.edu/pubs/sighan2005.pdf
使用示例:需要先從stanford官網(wǎng)下載中文切詞模型(https://stanfordnlp.github.io/CoreNLP/)
###stanford CoreNLP #pip install stanfordcorenlp from stanfordcorenlp import StanfordCoreNLPsentence = "不會(huì)講課的程序員不是一名好的算法工程師" with StanfordCoreNLP(r'stanford-chinese-corenlp-2018-10-05-models', lang='zh') as nlp:print("stanford: " + " ".join(nlp.word_tokenize(sentence)))往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請(qǐng)回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看
總結(jié)
以上是生活随笔為你收集整理的中文分词的古今中外,你想知道的都在这里的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【GCN】图卷积网络(GCN)入门详解
- 下一篇: 【NLP傻瓜式教程】手把手带你fastT