什么是漢語(yǔ)分詞
所謂分詞就是將連續(xù)的字序列按照一定的規(guī)范重新組合成詞序列的過程。
在英文的行文中,單詞之間是以空格作為自然分界符的。例如:I am a student.
當(dāng)然上面是比較正式的定義。在我看來(lái),漢語(yǔ)分詞就是將句子劃分為一系列合理的詞。有人會(huì)覺得這不就相當(dāng)于什么都沒說(shuō)嗎。合理,什么算是合理呢——這就是我認(rèn)為漢語(yǔ)分詞需要研究的地方,如何合理的進(jìn)行劃分,這個(gè)合理的根據(jù)到底是什么。
算法前先聊聊必要性
漢語(yǔ)自然語(yǔ)言處理的第一步。我覺得這句話足以代表漢語(yǔ)分詞有多么重要了。這說(shuō)明了漢語(yǔ)分詞是漢語(yǔ)自然語(yǔ)言處理的最基礎(chǔ)的根基,可想而知,如果根基除了問題,那么上層建筑就毫無(wú)意義可言。
那么目標(biāo)是什么呢
這里就說(shuō)說(shuō)最重要的吧:
第一自然是準(zhǔn)確性,我們認(rèn)為漢語(yǔ)分詞的準(zhǔn)確性應(yīng)到達(dá)99.9%以上才能基本滿足上層使用的要求。有人會(huì)問這是為什么呢。(我特別喜歡回答這個(gè)問題,因?yàn)槲矣幸粋€(gè)很好的例子,23333)假設(shè)我們每句話有10個(gè)詞組成,然后我們現(xiàn)在又10句話需要我們處理。我們那現(xiàn)在漢語(yǔ)分詞能達(dá)到的最高的準(zhǔn)確率98%來(lái)說(shuō),那就意味著我100個(gè)詞會(huì)分錯(cuò)2個(gè),也就是說(shuō)我在這10句話中就會(huì)分錯(cuò)2句話。(這么一想是不是很可怕,因?yàn)槟?%的錯(cuò)誤率是的上層的錯(cuò)誤率達(dá)到了20%)。
第二是我們說(shuō)的運(yùn)行速度,目前我們認(rèn)為一個(gè)好的漢語(yǔ)分詞系統(tǒng)§每秒鐘處理1萬(wàn)字或5千詞以上。
讓我們看看比較厲害的漢語(yǔ)分詞系統(tǒng)
1、清華大學(xué)SEGTAG系統(tǒng)
此系統(tǒng)著眼于將各種各類的信息進(jìn)行綜合,以便最大限度地利用這些信息提高切分精度。系統(tǒng)使用有向圖來(lái)集成各種各樣的信息,這些信息包括切分標(biāo)志、預(yù)切分模式、其他切分單位。為了實(shí)現(xiàn)有限的全切分,系統(tǒng)對(duì)詞典中的每一個(gè)重要的詞都加上了切分標(biāo)志,即標(biāo)志"ck"或"qk"。"qk"標(biāo)志表示該詞可進(jìn)行絕對(duì)切分,不必理會(huì)它是否產(chǎn)生切分歧義;"ck"標(biāo)志表示該詞有組合歧義,系統(tǒng)將對(duì)其進(jìn)行全切分,即保留其所有可能的切分方式。
系統(tǒng)通過這兩種標(biāo)志并使用幾條規(guī)則以實(shí)現(xiàn)有限的全切分,限制過多的切分和沒有必要的搜索。規(guī)則包括:
1、無(wú)條件切出qk類詞;
2、完全切分ck類詞(保留所有可能子串);
3、對(duì)沒有標(biāo)記(qk或ck)的詞,若它與別的詞之間存在交叉歧義,則作全切分;
否則將其切出。
為了獲得切分結(jié)果,系統(tǒng)采用在有向圖DAG上搜索最佳路徑的方法,使用一個(gè)評(píng)價(jià)函數(shù)EVALUATE Path),求此評(píng)價(jià)函數(shù)的極大值而獲得最佳路徑Pmax。所運(yùn)用的搜索算法有兩種,"動(dòng)態(tài)規(guī)劃"和"全切分搜索+葉子評(píng)價(jià)",使用了詞頻、詞類頻度、詞類共現(xiàn)頻度等統(tǒng)計(jì)信息。通過實(shí)驗(yàn),該系統(tǒng)的切分精度基本上可達(dá)到99%左右,能夠處理未登錄詞比較密集的文本,切分速度約為30字/秒。
2、復(fù)旦分詞系統(tǒng)
此系統(tǒng)由四個(gè)模塊構(gòu)成。
一、預(yù)處理模塊,利用特殊的標(biāo)記將輸入的文本分割成較短的漢字串,這些標(biāo)記包括標(biāo)點(diǎn)符號(hào)、數(shù)字、字母等非漢字符,還包括文本中常見的一些字體、字號(hào)等排版信息。一些特殊的數(shù)詞短語(yǔ)、時(shí)間短語(yǔ)、貨幣表示等,由于其結(jié)構(gòu)相對(duì)簡(jiǎn)單,即由數(shù)詞和特征字構(gòu)成構(gòu)成,也在本階段進(jìn)行處理。為此系統(tǒng)特別增加一次獨(dú)立的掃描過程來(lái)識(shí)別這些短語(yǔ),系統(tǒng)維護(hù)一張?zhí)卣髟~表,在掃描到特征字以后,即調(diào)用這些短語(yǔ)的識(shí)別模塊,確定這些短語(yǔ)的左、右邊界,然后將其完整地切分開;
二、歧義識(shí)別模塊,使用正向最小匹配和逆向最大匹配對(duì)文本進(jìn)行雙向掃描,如果兩種掃描結(jié)果相同,則認(rèn)為切分正確,否則就判別其為歧義字段,需要進(jìn)行歧義處理;
三、歧義字段處理模塊,此模塊使用構(gòu)詞規(guī)則和詞頻統(tǒng)計(jì)信息來(lái)進(jìn)行排歧。構(gòu)詞規(guī)則包括前綴、后綴、重疊詞等構(gòu)詞情況,以及成語(yǔ)、量詞、單字動(dòng)詞切分優(yōu)先等規(guī)則。在使用規(guī)則無(wú)效的情況下,使用了詞頻信息,系統(tǒng)取詞頻的乘積最大的詞串作為最后切分結(jié)果;最后,此系統(tǒng)還包括一個(gè)未登錄詞識(shí)別模塊,以解決未登錄詞造成的分詞錯(cuò)誤。未登錄詞和歧義字段構(gòu)成了降低分詞準(zhǔn)確率的兩大因素,而未登錄詞造成的切分錯(cuò)誤比歧義字段更為嚴(yán)重,實(shí)際上絕大多數(shù)分詞錯(cuò)誤都是由未登錄詞造成的。系統(tǒng)對(duì)中文姓氏進(jìn)行了自動(dòng)識(shí)別,它利用了中文姓名的用字規(guī)律、頻率,以及姓名的上下文等信息。通過對(duì)十萬(wàn)以上的中文姓名進(jìn)行抽樣綜合統(tǒng)計(jì),建立了姓氏頻率表和名字用字頻率表,由此可獲得任意相鄰的二、三個(gè)單字構(gòu)成姓氏的概率大小和某些規(guī)律,再利用這些字串周圍的一些稱謂、指界動(dòng)詞和特定模式等具有指示意義的上下文信息,對(duì)字串是否構(gòu)成姓名進(jìn)行辨別。實(shí)驗(yàn)過程中,對(duì)中文姓氏的自動(dòng)辨別達(dá)到了70%的準(zhǔn)確率。系統(tǒng)對(duì)文本中的地名和領(lǐng)域?qū)S性~匯也進(jìn)行了一定的識(shí)別。
3、哈工大統(tǒng)計(jì)分詞系統(tǒng)
該系統(tǒng)是一種典型的運(yùn)用統(tǒng)計(jì)方法的純切詞系統(tǒng),它試圖將串頻統(tǒng)計(jì)和詞匹配結(jié)合起來(lái)。
系統(tǒng)由三個(gè)部分構(gòu)成:
一、預(yù)處理模塊,利用顯式和隱式的切分標(biāo)記(標(biāo)點(diǎn)符號(hào)、數(shù)字、ASCII字符以及出現(xiàn)頻率高、構(gòu)詞能力差的單字詞、數(shù)詞+單字常用量詞模式)將待分析的文本切分成短的漢字串,這大大地減少了需要統(tǒng)計(jì)的(無(wú)效)字串的數(shù)量和高頻單字或量詞邊界串;
二、串頻統(tǒng)計(jì)模塊,此模塊計(jì)算各個(gè)已分開的短漢字串中所有長(zhǎng)度大于1的子串在局部上下文中出現(xiàn)的次數(shù),并根據(jù)串頻和串長(zhǎng)對(duì)每個(gè)這樣的子串進(jìn)行加權(quán),加權(quán)函數(shù)為?(F為串頻,L為串長(zhǎng),即串中漢字個(gè)數(shù))。根據(jù)經(jīng)驗(yàn),局部上下文中取為200字左右。局部上下文的串頻計(jì)算使用一個(gè)滑動(dòng)窗口(為一個(gè)隊(duì)列式緩沖區(qū),保存當(dāng)前待切分漢字串及其前后20個(gè)短串),當(dāng)當(dāng)前待切分漢字串處理完之后,窗口下移一個(gè)短串(中心變?yōu)橄噜徬乱粋€(gè)短串)。系統(tǒng)采用一個(gè)外散列表來(lái)記錄窗口中的短串,以加快窗口中串頻計(jì)數(shù)。散列函數(shù)取為漢字的GB-80位碼(二級(jí)漢字共用入口95),每個(gè)桶中保存窗口中
每一行(短串)上的漢字位置:(短串的行號(hào),漢字列號(hào)),并且對(duì)于在窗口中出現(xiàn)多次的漢字位置用一個(gè)鏈指針連接起來(lái),則計(jì)算某個(gè)字串在窗口中出現(xiàn)的頻度時(shí),不必將該字串與窗口中的短串逐個(gè)匹配,而只需統(tǒng)計(jì)在該字串中的各個(gè)漢字所對(duì)應(yīng)的位置鏈表中能夠相鄰的位置的序列的個(gè)數(shù)即可。此外,還需要根據(jù)詞綴集(前、后綴集合)對(duì)字串的權(quán)值進(jìn)行提升,例如"處理器"中"處理"的權(quán)值很高,但由于對(duì)"處理器"的權(quán)值作了提升(達(dá)到或超過了"處理"),就不會(huì)切成"處理/器"。如果某個(gè)漢字串的權(quán)值超過某一閾值D(取為40),則將此漢字串作為一個(gè)新識(shí)別的詞,將其存入一臨時(shí)詞庫(kù)中;
三、切分模塊,首先用臨時(shí)詞庫(kù)對(duì)每個(gè)短的漢字串進(jìn)行切分,使用的是逐詞遍歷算法,再利用一個(gè)小型的常用詞詞典對(duì)漢字短串中未切分的子串進(jìn)行正向最大匹配分詞。對(duì)于短漢字串中那些仍未切分的子串,則將所有相鄰單字作為一個(gè)權(quán)值很低的生詞(例如"瑪"、"莉")。其中每個(gè)模塊都對(duì)待分析的文本進(jìn)行了一次掃描,因而是三遍掃描方法。此系統(tǒng)能夠利用上下文識(shí)別大部分生詞,解決一部分切分歧義,但是統(tǒng)計(jì)分詞方法對(duì)常用詞識(shí)別精度差的固有缺點(diǎn)仍然存在(例如切出"由/來(lái)"、"語(yǔ)/用"、"對(duì)/聯(lián)"等)。
經(jīng)測(cè)試,此系統(tǒng)的分詞錯(cuò)誤率為1.5%,速度為236字/秒。
下面說(shuō)說(shuō)我最喜歡的分詞算法
人工智能法—— 神經(jīng)網(wǎng)絡(luò)方法
為啥喜歡,首先是機(jī)器學(xué)習(xí)越來(lái)越火,然后上完機(jī)器學(xué)習(xí)課之后感覺自己真的對(duì)這方面比較感興趣,所以愿意研究一哈,并不是說(shuō)這個(gè)算法是最好的,其實(shí)我覺得挺好的。。。
第一步:數(shù)據(jù)預(yù)處理:將語(yǔ)句中的字、單詞進(jìn)行編碼,使得神經(jīng)網(wǎng)絡(luò)可以識(shí)別
? ? ? ? ? ? ? ?編碼方式:直接對(duì)字進(jìn)行固定長(zhǎng)度編碼、根據(jù)詞性進(jìn)行編碼
第二步:激勵(lì)函數(shù)的選?。簼h語(yǔ)分詞問題可以看成在某個(gè)詞后面時(shí)候切分的二分類問題,因此刺激函數(shù)可以采用S型函數(shù)(Sigmoid函數(shù))
第三步:反向修正形式的確定:在反向回饋修改權(quán)值的過程中,我們選擇利用梯度下降法來(lái)優(yōu)化是的損失函數(shù)最小
第四步:參數(shù)的調(diào)整:輸入層、隱含層、輸出層神經(jīng)元個(gè)數(shù)的選取,閾值、學(xué)習(xí)速率的確定,確定合理的訓(xùn)練次數(shù)
當(dāng)然這只是很簡(jiǎn)單的闡述,詳細(xì)實(shí)現(xiàn)與具體解釋見之后說(shuō)哦~