伊克拉木·伊力哈木,艾山·吾買爾,王路路,麥麥提依明·巴吾頓
(1.新疆大學信息科學與工程學院,烏魯木齊830046;2.新疆大學新疆多語種信息技術實驗室,烏魯木齊830046;3.中科軟科技股份有限公司信息工程八部,天津300384)
隨著網絡社交媒體的發展、經濟全球化進程的推進以及國際安全局勢的變化,我國的網絡輿情分析顯得尤為重要,各類社交媒體和網絡論壇等載體是用戶發表觀點、表達情緒的主要平臺。而這些網絡文本大部分都是短文本,其語言種類又呈現了多樣化的趨勢且文本的語種判別也易混淆。除了作為國家通用語言的中文文本數據之外,還存在少數民族語言或者周邊國家語言的文本數據,如此大量混雜的多語種文本信息給傳統的自然語言處理帶來了挑戰。
語種識別的研究經歷了長期的演變,1994 年Cavnar 等人提出了基于N-Gram 的詞頻排序算法[1],此方法的準確率在針對400 字以上的長文本語種識別任務中可達到99.8%,但對于大部分社交媒體限制的140字以內的短文本識別上的效果差強人意。2003 年Frank基于此方法設計實現了名為Textcat 的語種識別工具[2]。2007 年Hammarstrom 使用詞綴表擴充詞典[3]。2009 年Ceylan 等人使用決策樹對文本語言種類進行分類[4]。2010 年Vantanen 等結合N-Gram 語言模型和樸素貝葉斯分類器設計識別語言種類[5],該方法主要針對5-21 個字符的文本。2013 年Carter 等人針對推特上的交互信息提出了基于用戶歷史消息和消息中內嵌連接的內容識別語種[6]。2011 年Tromp 等人提出了基于NGram 的圖結構的方法進行語種識別[7],該方法有效利用詞本身的信息以及詞與詞之間的信息,提升了短文本上語種識別的效率。Vogel 等人在此算法上進行了改進[8]。2012 年Lui 等人結合了N-Gram 與多項式樸素貝葉斯分類器設計了Langid 語種識別工具包[9]。2013 年Brown 提出基于N-Gram 字符特征權重的空間向量模型[10]。2018 年HAO Ming 等人提出了基于Cavnar、Tromp 和Vogel 設計的模型的改進方法,可自適應學習特征的權重,以提高模型在不同數據集上的魯棒性[11]。目前,許多研究工作嘗試將深度學習技術應用到語種識別中,但在短文本上,基于統計的語種識別方法更為高效[12-13]。中科院聲學研究所于2019 年構建了一個維哈口語風格的短文本語料庫,通過設計多種特征,構建最大熵分類器以區分維吾爾語(以下簡稱維語)和哈薩克語(以下簡稱哈語)兩個相似語種的短文本數據,最終取得了95.6%的整體精確度[14]。
基于以上工作的啟發,本文提出了基于多種策略結合的文本語種識別方法,核心思想在于將不同書寫形式的同一個語言當作不同語種進行區分。對維語、哈語和烏語的兩種編碼分別進行了研究,同時在中文和日文上驗證了此方法的有效性,并針對上述五種語種的八種編碼構建了語種識別系統,可進行快速有效的網絡文本語種識別處理。
N-Gram 模型是一種統計語言模型,設有一個基元(基元可以是單詞、字母、音節等)個數為i 的句子s=w1w2w3…wi,基于文獻[15]中的研究結論,對于中文和日文文本,為了盡可能多地保留詞匯完整性,本文采用字符級別的4-gram 語言模型(四元文法)。而對于其他語種的判別,都采用bigram 語言模型(二元文法)。根據貝葉斯公式,我們可將語種識別任務定義為特定的文本分類任務進行處理。 其公式為:P(語種類別|特征)=現假設有文本序列s=w1w2w3…wm和語種標簽集合L,即可將數據 s 看作 m 維特征集合,表示為s=(w1,w2,w3,…,wm),語種類別集合L 中共有n 個類別,表示為L=(l1,l2,l3,…,ln)。根據樸素貝葉斯分類算法可計算得到的語種類別如式(1)所示:

在實際運用中,分母位置的P(s)是與輸入數據常量相關的,因此可忽略不進行計算。樸素貝葉斯公式即可表示為式(2):

此時,分類器的準則表達公式就改變為式(3):

算法描述如下:有一段文本“東京都渋谷區神宮前3 丁目1 番30 號”,該句子中出現較多漢字,假設字與字之間獨立進行判別,難以區分該文本屬于中文或是日文。單個字符的語種判別計算為:
P(東京都渋谷區神宮前3丁目1番30號|語種)=P(東|語種)P(京|語種)…P(號|語種)
在中、日文上采用4-gram 拆分,計算結果為:
P(東京都渋谷區神宮前3丁目1番30號|語種)=P(東京都渋|語種)P(京都渋谷|語種)…P(丁目番號|語種)此種情況下,“東京都渋”、“丁目番號”等組合詞串在日文文本中出現的概率遠大于在中文文本中該出現的概率。
針對五種語言的八種編碼,按編碼區間將其兩兩配對進行比對,因此共有4 個分類器。根據公式(3)分別進行對應的分類器設計。其中P(lk)可由訓練數據進行估計,根據大數定律,當訓練集包含重組的獨立同分布樣本時,可根據各類樣本出現的頻率進行估計。而本文使用的各種類數據數量一致。因此,只需對所有樣本計算即可。
由于處理的數據對象為離散型數據。本文中使用多項式樸素貝葉斯分類器,對訓練數據建立N-Gram語言模型后,建立頻率表,表內數據為每個n 元組在某類文本中出現的頻次,以此來計算類條件概率。最后為了避免某個元組未曾出現過導致整體概率為0,使用拉普拉斯平滑處理。
mixlangidnb 算法偽代碼:


本文系統中,Web 服務器使用的是uWSGI,Web 框架使用的是Django,為了提高系統并發性能和安全性,采用Nginx 作為反向代理服務器進行負載均衡。
uWSGI 實現了多種協議,包括uWSGI、WSGI 和HTTP 等。其作用是通過將客戶端發送的請求轉發給Web 框架進行邏輯處理,并將處理后的結果返回給客戶端。其中WSGI 是Web 服務器和Web 框架的通信協議,同時也是一種解耦的規范,實現了多個Web 服務器和多個Web 框架之間的任意組合搭配。而uWS?GI 是一種傳輸協議,用于定義傳輸信息的類型,使uWSGI 服務器能與其他Web 服務器進行通信。
Nginx 同樣是一種Web 服務器,相比uWSGI 功能更加強大,可以做反向代理服務器并通過輪詢算法將客戶端請求分配至多臺Web 服務器上實現負載均衡,大幅度提高系統并發性能。并且Nginx 處理靜態文件的性能和解析HTTP 請求的效率遠高于uWSGI,因此在uWSGI 和Django 之上添加Nginx 能使系統響應時間大幅度縮短。
以系統角度而言,整體流程分為接收過程和返回過程。
在接收過程中,當客戶端發送HTTP 請求至反向代理服務器,反向代理服務器解析HTTP 請求,并通過uWSGI 協議轉發給uWSGI 服務器。uWSGI 服務器將請求內容轉換為WSGI 支持的格式,再通過WSGI 發送至對應的web 框架中的應用。Web 框架中的應用根據請求內容進行相應的邏輯處理。
在返回過程中,Web 框架將應用處理后的結果返回WSGI,WSGI 將其處理為uWSGI 支持的格式后,打包發送至uWSGI 服務器,經由uWSGI 轉發至Nginx后,最終返回至客戶端。整體流程如圖1 所示。

圖1 語種識別系統流程圖
在上述流程中的請求當中包含系統用戶的認證ID,系統任務代碼,原始文本三個參數。三個參數都封裝為JSON 格式,參數的詳細說明如表1 所示。

表1 JSON 格式數據輸入項
本系統中語種識別的處理流程如下:
預處理,去除各類HTML 標簽等清洗工作。對于剩下的網絡文本數據系統預先設定將其分為文字、符號和數字三種類別。分別判斷除去符號集合和數字集合后數據的長度。若僅包含文字則轉入語種判別子流程;若僅包含符號集合內的數據,則輸出“punc”;若僅包含數字集合內的數據,則輸出“num”;若同時包含符號和數字集合內數據,則輸出“mixnumpunc”;若在預處理后數據長度為0,即不包含任何文字、符號和數字,則返回“null”;若不滿足上述任何情況,轉到語種識別子流程。總系統流程如圖2 所示。
語種識別子流程第一層處理,即編碼區間判別,將文本分入對應的編碼區間,每個編碼區間包含兩個語種。
語種識別子流程第二層處理,即特征字符匹配,此步驟可解決大部分識別問題。
若上述過程仍無法判定語種,則使用基于N-Gram的樸素貝葉斯模型進行識別,判斷是否屬于單一語種,最后輸出判別結果。
語種識別子流程如圖3 所示。

圖2 語種識別總體流程圖

圖3 語種識別詳細流程圖
輸入的JSON 格式的數據為:
{"key":"user","task":"langid","text":"東京都渋谷區神宮前3 丁目1 番30 號"}
返回的json 格式的數據為:
{"code":200,"data":"jp"}
code 值為狀態碼,200 表示此次請求成功,0 為失敗。
為了驗證語種識別系統的性能,從識別準確率、運行時間等方面設置了多組實驗對該系統進行測試。在實驗中,zh-CN 表示中文,JP 表示日文,ug-CN 表示基于現行字符編碼維語,ug-LA 表示拉丁字符編碼維語,kz 表示基于現行字符編碼哈語,kk 表示基于西里爾字符編碼哈語,uz-LA 表示基于拉丁字符編碼烏語,uz-Cyr 表示基于西里爾字符編碼烏語,MSLIS 表示多策略語種識別系統。
實驗使用的系統硬件環境是CPU Intel Xeon E5-2690 v4@2.60GHz,512G 內存,2T 硬盤。使用的軟件環境如下:操作系統為CentOS 7.3、Web 框架django(2.1.5),負載均衡nginx(1.12.1),uwsg(i2.0.15)。
本文采用準確率P,召回率R,F1 值作為語種識別的評測指標。其計算公式如下:

上述式中,TP 表示預測為該語種的結果,FN 表示預測為其他語種的結果,FP 為其他語種預測為該語種的結果。在實驗中,為測試對短文本的識別效果,本文按照句子的字符長度進行劃分,每個長度區間內按語種標簽各包含5000 條測試數據,其長度區間分別是[1,10],[11,25],[26,50],[51,75],[76,100]。由于編碼區間的不同,本文將中日、現行維語哈語、拉丁維語烏語、西里爾哈語烏語4 組語種視為易混淆語種。對于每組易混淆語種分別進行比對,因Langid 工具包無法識別拉丁維語、拉丁烏語、現行哈語和西里爾烏語,因此與Langid 的對比測試僅包含中日字符編碼集和現行字符編碼集維語,其余語種進行系統內的測試。

表2 中日字符編碼識別性能對比(%)

表3 現行字符編碼識別性能對比(%)

表4 拉丁字符編碼識別性能對比(%)

表5 拉丁字符編碼識別性能對比(%)
以上實驗結果表明,本文提出的基于多策略的方法以及設計的系統,在100 字符內短文本語種識別中整體性能高于Langid 工具包。對于各組易混淆文本,在1 至10 字符長度內的測試數據上表現略顯不足,在11 至25 字符長度內的測試數據上表現一般,而對于26 至100 字符長度內的測試數據上表現非常優異。綜合各個長度區間中的表現,對于各組易混淆文本的語種識別能力整體呈現較佳水平。
運行性能測試分為單線程langid 對比測試和系統多并發測試。
測試數據為各語種5000 條,無并發,與langid 的對比測試結果如表6 所示。

表6 langid 對比測試結果表
實驗結果表明,使用了結合了編碼區域識別、特征字符匹配和基于N-Gram 的樸素貝葉斯分類3 種策略之后,語種識別速度較langid.py 工具有顯著提升。
語種識別系統的并發測試使用不區分語種的5000條文本數據和10000 條文本數據,分別對100、200、300并發量情況下進行測試,最終結果如表7 所示。

表7 語種識別速度結果表
通過上述實驗可知,首先基于Nginx、uWSGI 和Django 組合的架構在大量并發下仍能保持穩定運行。其次隨著并發量的增加,系統響應速度也會加快。
針對網絡文本語種識別問題,本文構造了中文、日文、維語、哈語、烏語的特征字符匹配字典,并提出了非局限于語言學知識或編碼范圍判別等某一特定方面,而是結合編碼區域識別、特征字符匹配和基于N-Gram的樸素貝葉斯分類的多策略結合語種識別方法,給出了解決目前互聯網上語言文字表達形式多樣化,語種信息易混淆、難以識別問題的新思路和新方向,尤其是針對具有多種文字書寫形式的語言效果顯著。最終設計并實現了高并發語種識別系統。該系統比較語種識別任務中通用的Langid 語種識別工具包,在維語、哈語和烏語的兩種不同寫法的識別性能上有較大的提升,并且該系統在識別速度上有較大優勢,高并發下系統表現極其穩定。結合以上兩點可以驗證該系統完全符合工業環境中的應用。