(云南財經大學 云南 昆明 650032)
對于英語等很多西方語言來說,其文本內容中的詞與詞之間是以空格、標點等符號顯式分隔的,因此可以很容易的將詞切割開,并不存在分詞的問題。然而中文的文本內容是以連續(xù)的漢字串形式表示的,詞與詞之間沒有明確的分隔標記,因此,中文的自動分詞一直是自然語言處理領域中的一項非常重要的基礎性工作,如果無法獲得準確的分詞,也就無法再進行后續(xù)操作。近年來,隨著互聯(lián)網技術的發(fā)展和移動終端的普及,以及微博、抖音等社交媒體的出現(xiàn),開始涌現(xiàn)大量的新詞,新詞的出現(xiàn)使現(xiàn)有分詞軟件的分詞準確率明顯降低。同時,由于不同行業(yè)或學科中都有其特定的專業(yè)術語,現(xiàn)有分詞軟件很難做到個性化處理準確地對特殊詞匯進行分割。因此,如何有效地發(fā)現(xiàn)新詞,對提高中文分詞的分詞效果有著重要作用,對提高工作效率具有重要的意義。
目前,新詞發(fā)現(xiàn)主要有基于統(tǒng)計的新詞發(fā)現(xiàn)和基于規(guī)則的新詞發(fā)現(xiàn)兩大類方法。Peng(2004)將詞匯特征和領域知識特征融入到模型中,利用CRF訓練,進而識別新詞。徐憶蘇(2008)利用條件隨機場模型對上下文特征進行訓練,從而進行新詞識別。徐遠方(2012)等人通過支持向量機訓練新詞詞間模式特征和詞內模式特征的向量化樣本,得到支持向量機從而預測新詞。陳飛(2013)等人利用條件隨機場方法,結合歸納出的許多區(qū)分新詞邊界的統(tǒng)計特征實現(xiàn)了新詞發(fā)現(xiàn),并在SogouT 大規(guī)模語料上進行新詞發(fā)現(xiàn)實驗,證明了方法的有效性。黃軒(2013)等通過詞出現(xiàn)的頻率,詞分布的密度,上下文分析以及詞在時間域上的變化分析對詞進行過濾;最后通過詞的統(tǒng)計信息和詞性規(guī)則對候選詞進行排序以提高準確率;在此基礎上建立新詞發(fā)現(xiàn)系統(tǒng)。邢恩軍(2016)等提出了一種基于上下文詞頻詞匯量的統(tǒng)計指標來實現(xiàn)新詞發(fā)現(xiàn)的方法,而該指標主要通過修改信息熵公式中參數(shù)的定義。
基于規(guī)則的方法往往需要人工構建規(guī)則庫,這些規(guī)則的建立往往需要耗費大量的人力物力,且新詞出現(xiàn)速度快,消失地也快,人工構建規(guī)則庫常常跟不上新詞的腳步。而且大部分規(guī)則都具有局限性,只能針對特定領域,很難制定出完全適用于各個領域的規(guī)則。基于統(tǒng)計的方法通常利用有監(jiān)督的機器學習算法進行新詞發(fā)現(xiàn),這些算法都需要標注語料,而且算法復雜。而本文基于統(tǒng)計方法的新詞發(fā)現(xiàn)并不需要大量的預料標注,算法簡單。主要步驟為首先對語料進行預處理,通過計算詞內部結合度,篩選出候選二元詞組; 然后計算邊界自由度,對二元詞組再次篩選和擴展,并通過調節(jié)閾值最終發(fā)現(xiàn)新詞。
要進行新詞發(fā)現(xiàn)的工作,首先要對文本在現(xiàn)有技術的條件下進行一次分詞,再從分詞好的語料中進行統(tǒng)計、分析,從中找到需要的新詞,我們把這一步驟稱為一元分詞。本文中的所有分析都是在Python軟件中實現(xiàn)的,而在Python中,有封裝好的分詞工具可以使用,因此,直接利用Python中的jieba分詞工具對文本進行一元分詞。經過jieba分詞后,大部分常用詞都可以被正確分開,少部分新詞也可以被找到。例如,“我們在玩狼人殺”這句話,就可以被切分成“我們/在/玩/狼人/殺”,而“狼人殺”是一個最近流行的桌游,是我們想要發(fā)現(xiàn)的新詞,但進行一元分詞后并沒有把它正確劃分出,因此,需要進行后續(xù)分析。
進行一元分詞后的語料會以單字和詞語的形式呈現(xiàn),如果一個新詞被錯誤的劃分開,則會被分成兩個甚至更多的部分,所以要想找到新詞,這里又把臨近的詞兩兩組合,重新構成字符串,我們把新構成的詞稱為二元詞。例如,上例中的“我們/在/玩/狼人/殺”,構成二元詞就是“我們在/在玩/玩狼人/狼人殺”。
內部凝固度是對兩個一元詞緊密結合的度量,用來衡量兩個詞構成新詞語的可能性。凝固度越大,表明結合的越緊密,構成新詞的可能性就越大。例如詞A和詞B單獨出現(xiàn)的概率分別是P(A)和P(B),假設這兩個詞是獨立詞,則兩個詞同時出現(xiàn)的概率為P(A)*P(B)。如果這兩個詞不是獨立的,則兩個詞同時出現(xiàn)的條件概率會大于P(A)*P(B),即P(C)>P(A)*P(B)。
把上一步得到二元詞進行凝固度判斷,剔除小于設定閾值的商品,選擇大于設定閾值的二元詞進行下一步分析。但凝固度對稀疏數(shù)據特別敏感,通過凝固度篩選的二元詞可能會有很多噪音,影響準確性。例如,P(C)很小,但如果P(A)和P(B)也足夠小,那么C仍會被認為通過了凝固度檢驗。因此,我們需要對二元詞進行詞頻統(tǒng)計,只有大于設定閾值后,才能進行凝固度判斷。
通過了凝固度檢驗還不能判斷出該二元詞就可以成詞,還需要從整體上看這個詞的外部表現(xiàn)情況。邊界自由度是指一個字符串的鄰接集合中的鄰接字種類的數(shù)量。邊界自由度越大,表明字符串的邊界集合中字符的種類越多,即與該字符串相鄰的字符越復雜,那么該字符串成為邊界的可能性就越大,反之亦然。比如,“輩子”這個字符串,用法非常固定,除了“一輩子”、“這輩子”、“上輩子”、“下輩子”,基本上“輩子”前面不能加別的字了,即它的左臨字集合非常有限,因此,我們認為“輩子”這個字符串不能成為一個單獨的詞,而它和它的左鄰字構成的新詞才有可能構成一個真正的詞,像“這輩子”、“上輩子”。
如果一個文本片段能夠算作一個詞的話,它應該能夠靈活地出現(xiàn)在各種不同的環(huán)境中,具有非常豐富的左鄰字集合和右鄰字集合。在這里,我們由下式衡量二元詞的自由度:
P=左(右)鄰字字頻/二元詞詞頻
P越大,表示自由度越小,鄰字和二元詞更有可能構成新詞,而該二元詞不能成為新詞。對通過凝固度篩選的二元詞進行自由度判斷,如果左右鄰接字都小于設定的閾值,則認為該二元詞就是我們要找的新詞。如果左鄰接字大于閾值,則把左鄰字和二元詞構成的詞當作新詞。同理,對右鄰字也做這樣的判斷。
本文的新詞發(fā)現(xiàn)算法主要就由文本預處理,內部凝固度算法和邊界自由度算法構成,算法的總流程如下圖所示:

本文采用文言文版的西游記一書作為文本材料進行實驗,因為古漢語與現(xiàn)代漢語在成詞、結構、語序等方面都有很多不同,因此,在時間緊迫來不及獲取更多文本語料的情況下,選此作為實驗數(shù)據。
常用來判斷算法好壞的指標是準確率和召回率:
準確率=正確識別出的新詞個數(shù)/識別出的詞串總個數(shù)
召回率=正確識別出的新詞個數(shù)/語料中新詞總個數(shù)
因為無法確定語料中的新詞總個數(shù),因此只采用準確率來判斷算法好壞。通過Python實現(xiàn)上述算法(由于文章篇幅所限,并未附上代碼,如有需要可以聯(lián)系作者)后,采用不同的閾值對語料進行分析得到結果如下:

詞頻閾值凝固度閾值自由度閾值詞串個數(shù)新詞個數(shù)準確率1020000.521810045.87%2020000.5562850%1010000.530010133.67%1020000.721810045.87%
通過結果可以看出,不同閾值的選擇對輸出結果還是有很大的影響。詞頻閾值設置過大,準確率可以提升,但發(fā)現(xiàn)的新詞個數(shù)也大幅度下降;凝固度閾值過小,會造成準確率下降;而第一組和第四組的輸出結果幾乎相同,說明能作為新詞的二元詞,其在語句中都具有極高的靈活度,閾值增加到0.7幾乎不產生影響。
輸出結果的準確率都在50%左右,證明了這個算法的有效性,但如前所述,閾值不同其輸出結果也不同。同時,由于不同文本的特征不同,其對閾值的要求也會相應不同。因此,接下來的研究方向就是尋找最佳的閾值設定,同時希望能找到一種針對不同文本都具有普適性的閾值設定方法。