深入NLP——看中文分詞如何影響你的生活點滴

中文分詞是中文自然語言處理的一個非常重要的組成部分,在學界和工業界都有比較長時間的研究歷史,也有一些比較成熟的解決方案。今天我們邀請了出門問問的兩位重磅嘉賓徐博士和Jason,和大家一起來回顧一下中文分詞的發展,著重談一談現在比較流行的一些基於機器學習的分詞方法。

嘉賓簡介

徐博士,約翰霍普金斯大學語言和語音實驗室博士。2012年畢業後加入微軟總部,先後在Bing和微軟研究院從事自然語言處理和機器學習相關的研究和產品開發,是cortana語義理解和對話系統團隊以及wordflow輸入法團隊的主要成員。

Jason,劍橋大學自然語言處理組畢業。一直從事自然語言處理方面的研究與開發工作。加入出門問問3年多,負責開發出門問問的語義分析系統、對話系統,參與的產品包括出門問問手機版、Ticwear智能語音手錶交互系統、魔法小問智能客服對話系統。

Part 1

▎什麼是分詞,為什麼要做分詞?

首先我來說說什麼是詞。「詞是最小的能夠獨立運用的語言單位」,那麼什麼是獨立運用呢?它可以解釋為「單獨做句法成分或單獨起語法作用」。在語言學語義學的角度有很多相關的研究都對詞給出了一些定義和判定標註。然很多中文詞僅由單個漢字組成,但是更多的單個漢字是無法「單獨做句法成分或單獨起語法作用」。由於國際上常用的NLP演算法,深層次的語法語義分析通常都是以詞作為基本單位,很多中文的自然語言處理的任務,也就多了一個預處理的過程來把連續的漢字分隔成更具有語言語義學上意義的詞。這個過程就叫做分詞。

這裡有一個從(Xue 2003) 中拿來的例子:

日文章魚怎麼說 =》 日文 章魚 怎麼 說 ? 日 文章 魚 怎麼 說?

我想強調的一點是,儘管在語言學語義學上,詞有著相對清晰的定義,對於計算機處理自然語言來說,分詞很多時候沒有放之四海皆準的共同標準。由於分詞本身更多的時候是作為一個預處理的過程,判斷其質量的好壞更多的時候需要結合下游的應用來進行。

比如在語音識別中,語言模型的創建通常需要經過分詞,從識別效果來看,越長的詞往往準確率越高(聲學模型區分度更高)。但是在文本挖掘中,很多時候短詞的效果會更好,特別是從召回率的角度來看(Peng et al. 2002, Gao et al. 2005)。在基於phrase的機器翻譯中,也有研究發現短詞(比中文treebank的標準短)會帶來更好的翻譯效果(Chang et al. 2008)。所以,如何衡量分詞的好壞,如何選擇分詞的方法,還是要結合自身的應用來進行。

▎分詞有哪些常見的傳統方法?

詞典匹配是分詞最傳統最常見的一種辦法。即便在後面要提到的基於統計學習的方法中,詞表匹配也通常是非常重要的信息來源(以特徵函數的形式)。匹配方式可以有正向(從左到右),逆向(從右到左)。對於匹配中遇到的多種分段可能性(segmentation ambiguity),通常會選取分隔出來詞的數目最小的。

很明顯,這種方式對詞表的依賴很大,一旦出現詞表中不存在的新詞,演算法是無法做到正確的切分的。但是詞表匹配也有它的優勢,比如簡單易懂,不依賴訓練數據,可以做到和下游的應用緊密結合 (機器翻譯中的phrase table,TTS中的詞典等等),易於糾錯等等。

還有一類方法通過語料數據中的一些統計特徵(如互信息量)去估計相鄰漢字之間的關聯性,進而實現詞的切分。這類方法不依賴詞表,具有很強的靈活性,特別是在對生詞的發掘方面,但是也經常會有精度方面的問題。

所以很多系統會結合基於詞表的方法和無詞表方法,發揮詞表方法的準確性以及在與後段應用結合上的優勢,同時利用無詞表方法在召回方面的能力。

▎機器學習在分詞領域有哪些應用?

確實,最近十多年,機器學習的發展非常迅速,新的模型,新的演算法層出不窮。中文分詞由於其重要性,以及問題的清晰性,成為很多新研究的試驗場。因為這方面的內容很多,所以我想儘可能的把主要的模型和方法分為兩大類:

一類是基於character tagging的,也就是對每一個字單獨進行分段信息的標註;

還有一類就是基於詞的,也就是對詞進行整體的標註和建模。

基於單個字方法的核心就是對每一個字在其所屬詞中的位置進行一個標註。對於任何一個字來說,它可以是一個詞的開始(Beginning), 一個詞的中間(Inside), 一個詞的結尾(End),或者本身就是一個單字的詞(Singleton),這也就是在序列標註中常用的BIES的分類。這種標註空間(模型狀態空間)的劃分在其他任務上(如NER)也很常用,也會有一些類似的變種,比如NER中常用的BIO。

說到這類方法,就要說到MEMM (Maximum Entropy Markov Model) 和CRF (Conditional Random Field) 。這兩個都是discriminative的模型,和generative的模型(比如naive bayes, HMM)相比,在特徵函數的定義方面有很大的靈活性。

(第二個是MEMM,第三個是CRF,X是句子,Y是位置的標註。)

MEMM是一個locally normalized的模型。也就是說在每一個字的位置,其對應的概率分布需要進行歸一化,這個模型有一個很有名的label bias的問題,也就是當前的tag完全由前一個tag決定,而完全忽略當前的字本身。

CRF則通過全局歸一化(global normalization)的方式很好的解決了這個問題。這兩個模型都被拿來在分詞上試驗過(Xue et al. 2003, Peng et al. 2004, Tseng et al. 2005, etc), 取得了不錯的效果。

這類基於單個字的模型,正如它的名字所暗示,無法直接的去model相鄰詞之間的相關性,也無法直接看到當前整個詞所對應的字元串。具體到MEMM和CRF中特徵函數的定義,在當前位置,模型無法抓去到「當前的詞」,「兩邊的詞」這樣重要的特徵,而只能通過基於字的特徵去代替。這個往往會造成建模效果與效率的損失。

基於詞的模型就很好的解決了這個問題。

這一塊的很多工作會去用類似transition based parsing的辦法去解決分詞的問題。Transition based parsing是一種漸進式的(incremental),自下而上(bottom-up)的語法分析辦法。它一般以從左向右的方式處理逐字處理文本的輸入,並在運行過程中通過一個堆棧去保存到當前為止得到的不完整的分詞結果,並且通過機器學習的方法去決定如何整合當前的分析結果,或是接收下一個輸入去拓展當前的分析結果。

具體到分詞這個任務上,每一個字輸入進來,演算法會去決定這個字是去拓展堆棧上已經保存的詞,還是開始一個新詞。這個演算法的一個問題就是堆棧上的保存的到當前位置的分析結果的數量會非常大(到當前為止所有可能的分詞結果),所以必須要做pruning保證搜索空間在可控範圍內。

基於詞的模型還有一個方法這裡簡單提一下(Andrew, 2006),它和剛才說的transition parsing的方法還是很類似的,這個模型就是Semi CRF (Sarawagi & Cohen 2004)。這個模型運用也很多,微軟內部很多NER就是用這個模型。它在本質上是一個高階的CRF,通過擴展state space的方法去模擬segment level的關聯性,用到分詞上也就是相鄰詞之間的關聯性。和之前的方法要做pruning一樣,Semi-CRF在實際應用中也需要限制segment的長度,以控制搜尋最優解的複雜度。

▎深度學習在分詞中的應用?

當然。最近幾年深度學習發展非常快,影響力很大,所以這一塊要專門拿出來說一說。

和大多數自然語言處理中的任務一樣,深度學習也不出意外地被用在了分詞上,最近幾年也有非常多的相關的論文。和之前說過方法相比,深度學習帶來的變化主要是特徵的定義與抽取。無論是基於單字的,還是基於詞的,最近幾年都有這方面的工作。

基於單字的,運用deep learning的方法進行NLP領域的序列的標註,其實早在2008年就有人做過(Collobert & Weston 2008)主要的方法是通過神經網路在每一個位置去自動提取特徵,並且預測當前位置的標註,最後也可以加一個tag transition模型與神經網路輸出的emission模型合併,通過viterbi抽取最佳標註序列。最近幾年的進展主要是通過更強大的神經網路去提取更有效的信息,從而實現分詞準確率的提高 (Zheng et al. 2013, Pei et al. 2014, Chen et al. 2015, Yao et al.2016, etc)。

這個是collobert 2008年的基本版本,最近的工作結構上沒有太大偏差。全局歸一化的CRF模型也可以通過神經網路去自動提取特徵(DNN,CNN,RNN,LSTM,etc),這個在NER上已經有了廣泛的應用,也完全可以用在分詞這個任務上,這裡就不贅述了。

之前提到的基於詞的transition based的分詞最近也有了deep learning領域的拓展,原有的基於線性模型的action模型(延續當前詞還是開始新詞)也可以通過神經網路去實現,簡化了特徵的定義,提高了準確率。

▎除了深度學習之外,分詞領域還有那些新的發展方向?

Deep learning當然是最近幾年最新的,非常重要的發展方向。除此之外,Joint modeling(聯合建模)的方法也值得一提。

傳統的中文自然語言處理通常會把分詞作為一個預處理的過程,所以系統是pipeline形式的,這樣帶來的一個問題就是error propagation。也就是分詞的錯誤會影響到後面更深層次的語言語義分析,比如POS tagging, chunking, parsing等等。所以在學術界也有很多joint modeling(聯合建模)方面的工作,主要目的就是把分詞和其他更複雜的分析任務一起進行(Zhang & Clark 2010, Hatori et al. 2012, Qian & Liu 2012, Zhang et al. 2014, Lyu et al. 2016, etc)。

最近幾年由於神經網路的迅速發展,其強大的特徵學習能力也大大簡化了對多個任務進行聯合建模時在特徵選取方面所要做的工作。聯合建模的一大好處是分詞與其他任務可以共享有用的信息,分詞的時候也會考慮到其他任務的要求,其他任務也會考慮各種分詞的可能性,全局上可以取得最優解。

但是隨之而來問題是搜索的複雜度往往會顯著提高:需要更有效的pruning機制在控制複雜度的同時,不對搜索的結果產生顯著影響。

Part 2

▎中文分詞在語義分析中的應用?

好的!謝謝徐博士這麼詳盡的介紹了中文分詞的各種演算法。因為,就像徐博士說了,中文分詞是大部分下游應用的基礎,這些下游應用小到POS詞性標註、NER命名實體識別,大到文本分類、語言模型、機器翻譯。所以我舉幾個基本的例子來回答在中文分詞的基礎上,怎麼進行之後的語義分析應用。當然,需要事先強調的一點是,這裡談的一些演算法(包括學術界很多主流的演算法)都是語言無關的,並且都是以詞作為最小單位的。

那麼對於中文來說,只要做好分詞(並且現在的分詞準確率還相當不錯,能達到96%左右的F-score Zhang et.al 2016),就可以跟對接現在比較主流的英文NLP演算法。

先來談談詞性標註。

所謂詞性標註,簡單來說,就是在分詞的結果上,判斷某個詞是名詞、動詞、形容詞等等。這一般是被當做一個序列標註問題來做,因為 : 判斷的依據可以是詞本身給出(比如「打開」這個詞大部分情況不用看上下文都可以猜測是一個動詞)也可以由上一個詞的詞性來給出(比如「打開 XX」,雖然不知道XX是什麼詞,但是跟在動詞「打開」後面,很可能是名詞)。

又比如,命名實體識別。

在得到分詞結果,並且知道了每個詞的詞性之後,我們可以在此基礎上做命名實體識別(Named Entity Recoginition)。學術上,所謂的命名實體一般指的是人名(PERSON)、地名(LOCATION)、機構名(ORGANIZATION) 等等。當然,在實際商業產品中,根據不同的業務場景需求,命名實體的類別會更加細分得多。比如地名可能會區分省、市、縣,或者餐館、酒店、電影院等等。

在得到分詞結果和詞性之後,我們還可以建立一棵語法樹。

輸出的結果,包含了整句句子的語法結構信息,比如名詞短語、介詞結構等等。如上圖所示。最後,推薦大家可以去Stanford NLP網站親自試試:nlp.stanford.edu:8080/p 裡面。

這個Demo,演示了從一句句子開始,如何做分詞、POS tagging、Syntactic Parsing,以及依存分析、指代消解等等各種基本NLP應用。自己親手試試可以對分詞等一系列基礎NLP方法有比較直觀的了解哦。

▎在實際的應用中遇的一些困難?

很多學術界的NLP演算法,放到真實應用場景裡面來,面對千變萬化的人類自然語言,都會遇到各種各樣的困難。我就分享一下我們出門問問這幾年來做中文分詞的一些經驗和遇到的困難吧。先做個小廣告,群內可能有朋友不是很熟悉我們出門問問。出門問問成立於2012年,是一家以語音搜索為核心的人工智慧創業公司。我們做了4年語音搜索,從手機版App、做到手錶、車載,載體可能不同,但是核心都是我們的語音+語義的這一套語音搜索系統。

比如上圖中所示,用戶通過語音輸入一句語音:「交大附近的南京大排檔」。這段語音經過語音識別轉換成一句自然語言文本,然後交由我們的語義分析系統進行處理。我們的語義分析系統會經過一系列的分詞、詞性標註、命名實體識別,然後能夠判斷出來這句query的詢問主題是什麼(訂餐廳、導航、天氣 etc.),並把相應關鍵字提取出來,交給後面的搜索團隊進行結果搜索和展示。

因為出門問問是專註於生活信息類查詢,因此正確識別出query中的實體名(POI、電影名、人名、音樂名 etc.)非常重要。出門問問的NLP系統也是以分詞作為整個NLP系統的基礎的:正確識別實體名的前提是整個實體名稱正確並且完整地被分詞開來。

因此,我們的分詞是需要偏向於實體名的。就像徐博士之前提到的,分詞沒有一個「放之四海而皆準」的標準;那麼在出門問問NLP裡面,我們應用分詞的一個很重要標準就是能夠正確切出這些實體名稱。

我們的分詞相當依賴實體詞表,但在實際中遇到了非常大的困難。

一是實體詞表數據量大。比如光是POI點(信息點)就是千萬級別,而且總有新開的餐館、酒店無法覆蓋到。

二是噪音很大。什麼「我愛你」、「天氣不錯」,都是我們在真實詞表中發現的餐館名,更別說千奇百怪的歌名了。

這些真實世界的問題對統計系統的分詞造成了很大的困難。所以我們針對這些問題,做過一些努力。

1) 建立完善的新詞發現機制,定期補充我們的POI詞,儘可能建立更多更全的實體詞表庫。但是更多的實體詞表也帶來了更多的噪音,會對分詞和後續語義識別造成問題。

2)我們會利用機器學習的方法,來剔除實體詞表中的噪音詞。所謂的噪音詞,就是餐館詞表裡面那些一般人看起來不是「餐館」的詞(比如「我愛你」「天氣不錯」),或者歌曲名裡面一般來說不會被認為是歌曲的詞(比如「附近」),等等。我們的演算法會自動篩選出這種低置信度的實體詞,避免造成噪音。

3)我們還嘗試過連接Knowledge Graph,用更豐富的信息來幫助正確分詞。舉一個真實的例子,「高第街56號」,一般的分詞程序都會分為「高第街/56/號」,但是群裡面如果有濟南的朋友可能會一眼認出來,這是濟南一家非常著名的連鎖餐館的名稱。結合我們的Knowledge Grahp (KG),如果用戶的當前地址在濟南,那麼即使我們的除噪音的演算法認為「高第街56號」不太可能是一家餐館,但是我們會綜合考慮KG給出的信息,將其正確識別成為一家餐館。

同時,我們也在積極的嘗試一些新的方法,比如接受多種存在歧義的分詞,但是採用對最終搜索結果的評估來排序選出最佳答案。當然啦,整體的中文分詞的效果還是可以接受的。經過我們抽樣錯誤分析,分詞造成的語義分析錯,佔得比例還是比較低的,長期來講我們仍然會一直信任當前的分詞系統提供的結果。

小結:

中文分詞是NLP難題中的一道必然工序,最近因為深度學習的到來,很多人開始希冀這個新的機器學習演算法可以為它帶來一些全新的東西。本文出門問問的兩個資深研究人員從什麼是中文分詞、中文分詞的傳統方法、中文分詞結合深度學習以及中文分詞在語義分析中的應用,在他們產品實際應用中遇到的問題,為我們由淺入深、從理論到應用做了一堂生動地科普,向我們展示了中文分詞和商業產品真正結合時的美妙碰撞。

附:徐博士參考文獻。

Peng et al. 2002, Investigating the relationship between word segmentation performance and retrieval performance in Chinese IR

Gao et al. 2005, Chinese word segmentation and named entity recognition: A pragmatic approach

Chang et al. 2008, Optimizing Chinese Word Segmentation for Machine Translation Performance

Zhang & Clark 2007, Chinese Segmentation with a Word-Based Perceptron Algorithm

Sarawagi & Cohen 2004, Semi-Markov Conditional Random Fields for Information Extraction

Andrew 2006, A hybrid markov/semi-markov conditional random field for sequence segmentation

Collobert & Weston 2008, A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning

Zheng et al. 2013, Deep learning for Chinese word segmentation and POS tagging

Pei et al 2014, Maxmargin tensor neural network for chinese word segmentation

Chen et al. 2015, Gated recursive neural network for chinese word segmentation

Chen et al. 2015, Long short-term memory neural networks for chinese word segmentation

Yao et al. 2016, Bi-directional LSTM Recurrent Neural Network for Chinese Word Segmentation

Zhang et al. 2016, Transition-Based Neural Word Segmentation

Zhang & Clark 2010, A fast decoder for joint word segmentation and pos-tagging using a single discriminative model

Hatori et al. 2012, Incremental joint approach to word segmentation, pos tagging, and dependency parsing in chinese

Qian & Liu 2012, Joint Chinese Word Segmentation, POS Tagging and Parsing

Zhang et al. 2014, Character-Level Chinese Dependency Parsing

Lyu et al. 2016, Joint Word Segmentation, POS-Tagging and Syntactic Chunking

推薦閱讀:

什麼是自編碼?
SeqGAN & IRGAN | 實錄·Guru Talk #12
word2vec 相關paper/blog推薦
對話系統概述

TAG:自然语言处理 | 中文分词 |