儘管全世界語言多達 5600 種,但大部數人類使用的語言集中在圖中的前 15 種(覆蓋全球 90% 以上人群)。其中英語為母語和第二語的人數最多,近 14 億人,是事實上的世界通用語。其次是漢語,約佔世界人口的 23%。英語和漢語相加的人數佔世界總人數的近一半,因此處理中英文兩種語言非常關鍵。
人工智慧時代,讓計算機自動化進行文字語義理解非常重要,廣泛應用於社會的方方面面,而語言本身的複雜性又給計算機技術帶來了很大的挑戰,攻克文字語義對實現 AI 全面應用有至關重要的意義。相應的自然語言處理(Natural Language Processing,NLP)技術因而被稱為是「人工智慧皇冠上的明珠」。
中國和美國作為 AI 應用的兩個世界大國,在各自語言的自動化處理方面有一些獨特之處。接下來筆者對中文和英文語言特點的角度出發,結合自己的從業經驗來歸納下兩種語言下 NLP 的異同點。(達觀資料陳運文)
一、中英文分詞方式不同
分詞是中英文 NLP 差異最廣為人知的一點。我們都知道英文的單詞之間天然存在空格來分隔,因此在進行英文文字處理時,可以非常容易的透過空格來切分單詞。例如英文句子:
DataGrand is a Chinese company
可輕鬆切分為 DataGrand / is / a / Chinese / company(文字用/表示詞彙分隔符)。
中文在每句話中間是不存在分隔符的,而是由一串連續的漢字順序連線構成了句子。現代漢語裡表達意思的基本語素是詞而不是字。例如「自然」,拆為「自」和「然」都不能單獨表意,兩個字合併組成的詞才能有準確的意義,對應英文單詞是 Nature。因此在我們使用計算機技術對中文進行自動語義分析時,通常首要操作就是中文分詞(Chinese Word Segmentation)。中文分詞是指按人理解漢語的方式,將連續的漢字串切分為能單獨表義的詞彙。例如中文句子:
「達觀資料是一家中國公司。」
讓計算機來處理,第一步需要切分為「達觀資料/是/一家/中國/公司」這樣的詞串的形式,然後再進行後續的理解和處理。
如何正確的根據語義完成中文切分是一個挑戰性的任務,一旦切詞發生失誤,會導致後續的文字處理產生連鎖問題,給正確理解語義帶來障礙。為了快速準確的切分好中文,學術界迄今有超過 50 年的研究,提出了很多方法。中文切詞常見方法裡既有經典的機械切分法(如正向/逆向最大匹配,雙向最大匹配等),也有效果更好一些的統計切分方法(如隱馬爾可夫 HMM,條件隨機場 CRF),以及近年來興起的採用深度神經網路的 RNN,LSTM 等方法。
由於漢語語法本身極為靈活,導致歧義語義時常發生,給正確完成中文分詞帶來了很多障礙。如例句「嚴守一把手機關了」所示,按照語義理解,正確切分方式為「嚴守一/把/手機/關了」,而演算法有誤時容易切分為「嚴守/一把/手機/關了」。
更困難的是,有些時候兩種切詞方法意思都對,例如「乒乓球拍賣了」,切分為「乒乓/球拍/賣了」和「乒乓球/拍賣/了」本身都可行,必須要依賴更多上下文來選擇當前正確的切分方法。類似的還有「南京市長江大橋」、「吉林省長春藥店」等等。如果把「市長」「省長」等切出來,整句話的理解就偏差很多了。常見歧義型別包括交叉歧義(Cross Ambiguity)和組合歧義(Combination Ambiguity)等,在語義消岐方面近年不斷有國內外學者提出新的解決思路,來解決漢藏語系的這個特定問題。
此處順便一提,和中文類似,日文句子內部同樣缺乏天然的分隔符,因此日文也同樣存在分詞需求。日文受漢語語法的影響很深,但同時又受表音語法的影響,明治時代還曾興起過廢漢字興拼音的運動,行文上漢字和假名混雜,好比中英文混血兒。業內比較知名的日文分詞器有 MeCab,其演算法核心是條件隨機場 CRF。事實上,如果將 MeCab 的內部訓練語料由日文更換為中文後,也同樣可以用於切分中文。
隨著深度學習技術近年來在 NLP 領域成功的應用,一些 seq2seq 學習過程可以不再使用分詞,而是直接將字作為輸入序列,讓神經網路自動學習其中的特徵,這在一些端到端的應用中(如自動摘要、機器翻譯、文字分類等)確實省略了中文分詞這一步驟,但是一方面還有很多的 NLP 應用離不開分詞的結果,如關鍵詞提取、命名實體識別、搜尋引擎等;另一方面切分所得的詞彙也可以和單字一起作為特徵輸入,用以增強效果。因此分詞仍然是工程界進行中文處理時的一項重要技術。
二、英文語素和中文偏旁的使用
英文單詞的提取雖然比中文簡單的多,透過空格就能完整的獲取單詞,但英文特有的現象是單詞存在豐富的變形變換。為了應對這些複雜的變換,英文 NLP 相比中文存在一些獨特的處理步驟,我們稱為詞形還原(Lemmatization)和詞幹提取(Stemming)。
詞形還原是因為英文單詞有豐富的單複數、主被動、時態變換(共 16 種)等情況,在語義理解時需要將單詞「恢復」到原始的形態從而讓計算機更方便的進行後續處理。例如「does,done,doing,do,did」這些單詞,需要透過詞性還原統一恢復為「do」這個詞,方便後續計算機進行語義分析。類似的:「potatoes,cities,children,teeth」這些名詞,需要透過 Lemmatization 轉為「potato,city,child,tooth」這些基本形態;同樣「were,beginning,driven」等要轉為「are,begin,drive」。請注意詞形還原通常還需要配合詞性標註(pos-tag)一起來進行,以確保還原準確度,避免歧義發生。因為英文中存在一些多義詞的情況,例如 calves 就是個多義詞,即可以作為 calf(名詞,牛犢)的複數形式,也可以是 calve(動詞,生育小牛)的第三人稱單數。所以詞形還原也有兩種選擇,需要按實際所表示的詞性來挑選合適的還原方法。
詞幹提取(Stemming)是英文中另一項獨有的處理技術。英文單詞雖然是句子中的基礎表義單元,但並非是不可再分的。英文單詞內部都是由若干個詞素構成的。詞素又分為詞根(roots)和詞綴(字首 prefix 或字尾 suffix),而詞根的原形稱為詞幹(stems)。例如單詞 disability,dis-就是表示否定意思的常用字首,-lity 是名詞常用字尾,able 是表示「能力」的詞幹,這些詞素合併在一起就構成了單詞的含義。
英文的詞素種類非常多(最常用的有 300 多個),很多源自拉丁語和希臘文。提取詞素對理解英文單詞的含義起著非常重要的作用,例如 semiannually 這個單詞,可能有的朋友並不認識,如果透過詞素來看:字首 semi-表示「一半」的意思,詞幹 annul 表示年,-ly 是副詞字尾,semiannually 這個單詞的含義是「每半年進行一次的」。Ambidextrous,heterophobia,interplanetary,extraterritorial 等這些看著很複雜的詞彙,透過拆解詞幹的方法能很方便的把握單詞含義,對人類和對計算機來說都是如此。常見 Stemming 方法包括 Porter Stemming Algorithm, Lovins Algorithm 和 Lancaster(Paice/Husk) Algorithm。目前大部分英文 NLP 系統都包括詞形還原(Lemmatization)和詞幹提取(Stemming)模組。(陳運文)
相比英文,中文裡是沒有詞幹的概念的,也無需進行詞幹提取,這是中文 NLP 中相對簡便的一塊。但在中文裡有一個相近的概念是偏旁部首。和英文中「單詞不懂看詞幹」類似,中文裡「漢字不識看偏旁」。例如「猴、狗、豬、貓、狼」這些漢字,顯然都是動物名詞。當出現漢字「狁」時,即使不認識也能透過部首「犭」猜出這是一個動物名稱,且發音類似「允」字。再比如「木,林,森」這些字都和樹木相關,數量還遞增。「鎖、錫、銀、鏡、鐵、鍬」都和金屬有關。「採」字和手抓植物有關。「囚」字和「孕」字就更直觀形象了。
借鑑英文中詞幹提取的方法,很多人自然會立刻想到:是否我們拆分中文漢字的偏旁部首,作為特徵輸入,也能更好的幫助計算機理解中文語義呢?學術界確實也有人做過此類嘗試,但是整體收益都不像英文詞幹分析那麼明顯,這背後的原因是什麼呢?筆者認為,其原因首先是常用漢字的數量遠比英文單詞要少,相比英文單詞數量動輒數萬計,加上各種前字尾和詞形變換數量更多,中文漢字最常用的才過千個。因為字少,每個漢字的意思多,這些漢字的含義透過上下文來獲取的語義描述資訊足夠充分,拆分偏旁後額外再能添補的資訊作用非常小。即便對罕見字來說偏旁確實能額外補充特徵,但因為它們在日常文字中出現頻次太少,對整體文字語義理解的作用很有限,只有在一些專業性文書的應用上可能起少量幫助。
其次是漢字經過數千年的演化,再加上簡化字的使用,很多字形和含義已經發生了巨大變化,偏旁未必能準確表達字的意思,甚至使用偏旁可能還會引入一些噪聲特徵。第三是現代漢語裡表義的基本單元是多個漢字構成的詞,而不是單字。這和英文中表義單元是單詞完全不同。因此對單個漢字的偏旁處理對整個中文 NLP 起到的作用非常輕微,並未成為中文 NLP 裡常用的做法。
三、詞性標註方法的差異
詞性是語言學的一個概念,根據上下文將每個詞根據性質劃歸為特定的型別,例如 n. 名詞 v. 動詞 adj. 形容詞 adv. 副詞等就是最常見的幾類詞性。中英文的詞性儘管整體相似,例如表達一個物品(如蘋果 Apple,火車 Train)通常是名詞,而描述一個動作(如跑步 Run,開啟 Open)一般是動詞,但在很多細節上存在差異。如果計算機能夠對每個詞彙的詞性進行正確的識別,無疑對增強語義分析的效果有幫助(注:同樣在 seq2seq 裡詞性並不必須,但是對詞性的正確理解仍然有其特定價值)。
在 NLP 裡有技術分支稱為詞性標註(Part-Of-Speech tagging, POS tagging),中英文各自有其特點。
其一是英文中有一些中文所沒有的詞性。這些詞性大量存在,給語義理解帶來了很好的指引作用。其中最典型的就是英文特有的兩個詞性:一是冠詞,二是助動詞。中文裡沒有冠詞一說,在英文中冠詞(Article,一般簡稱 art.)也是詞性最小的一類,只有三個:不定冠詞(Indefinite art.)、定冠詞(Definite art.)和零冠詞(Zero art.)。如英文中無處不在的單詞「the」就是定冠詞,the 後面通常會緊跟著出現句子的關鍵名詞+介詞短語。例如「Show me the photo of your company」,透過定冠詞 the 的指示,很容易的定位本句話的關鍵實詞是 photo。類似的,前面例句「DataGrand is a Chinese company」裡「a」這樣的不定冠詞也可以很好的指示出賓語「company」。這些大量出現的冠詞雖然是虛詞,本身並沒有明確含義,但在 NLP 中用於定位句子中的關鍵實詞,判斷實詞種類(是否可數,是否專有名詞等),進而識別出句法結構(後面還會詳細介紹)等,起到了很大的指示作用,也降低了計算機進行語義理解的難度,因而這方面英文比中文有先天優勢
助動詞(Auxiliary Verb)也是英文特有的現象,助動詞的作用是協助主要動詞構成謂語片語,如 am, is, have, do, are, will, shall, would,should, be going to 等都是常見助動詞,在英文句子中也大量存在,和冠詞用於指示主語賓語類似,助動詞對識別主要動詞(Main Verb)和謂語會起幫助。
其次,英文在詞性方面的劃分和使用更嚴謹,詞彙在變換詞性的時候會在詞尾形成豐富的變化。例如-ing、-able、-ful、-ment、-ness 等都對確認詞性給出具體的提示。名詞中還會進一步區分可數名詞、不可數名詞,在詞尾用-s、-es 來區分。動詞也同樣會存在發生時態的指示,過去式,現在時,未來時等非常明確,因此在英文語法中幾乎沒有詞性混淆不清的情況發生。
而中文的詞性則缺乏類似英文這樣的明確規範。中國著名的語言學家沈家煊先生在著作《語法六講》中就曾提出「漢語動詞和名詞不分立」的觀點,將確認漢語詞性的問題描述為「詞有定類」則「類無定職」,而「類有定職」則「詞無定類」。和英文中名詞、動詞、形容詞三大類詞彙相互獨立的「分立模式」不同,中文更類似「包含模式」,即形容詞作為一個次類包含在動詞中,動詞本身又作為次類被名詞包含,而且這個詞性的轉換過程非常微妙,缺乏表音語言中的前字尾指示。例如「他吃飯去了」中「吃飯」是動詞,只需要句式稍加變換為「他吃飯不好」,此時「吃飯」就搖身一變成名詞了。「熱愛程式設計」、「挖掘資料」中,「程式設計」、「挖掘」等詞,既可以是名詞也可以是動詞。形容詞也有類似的情況,如「活躍」是個常見的形容詞,常用句為「他表現非常活躍」。但有時也可以變身為動詞「他去活躍氣氛」,還能變為名詞「活躍是一種行為習慣」。可見漢語語境的變化給詞性帶來非常微妙的變化。(陳運文)
漢語沒有英文的屈折變化的特點,不像英語能透過靈活的詞尾變化來指示詞性變化,漢語這種一詞多性且缺乏指示的特點,給計算機詞性標註帶來了很大的困難,業界對詞性的標準以及標準測試集也很不完善。很多具體詞彙的詞性甚至讓人工來研讀都模稜兩可,讓演算法自動來識別就更難了。例如:「他很開心」、「他逗她開心」、「他開心不起來」、「他開心的很」、「開心是他很重要的特點」,這裡「開心」的詞性讓人來判斷都很難搞明白,甚至存在爭議。而反觀英語裡一個詞被標為動詞還是名詞幾乎不存在爭議。對這些模糊的情況,一些中文語料標註庫裡乾脆用「動名詞 vn」、「形名詞 an」等來標記,擱置爭議,模糊處理。
在目前中文 NLP 詞性標註中,「名動形」糊在一起的特點仍然沒有找到特別好的處理手段,也給後面的句法結構分析,詞彙重要性判斷,核心關鍵詞提取等語義理解課題帶來了干擾。
四、標點符號和字型特徵
在自然語言處理應用中,很容易被忽略的是標點和字型等資訊的利用。尤其學術界研究核心演算法時一般都會忽略這些「次要」資訊,大部分學術測試集合乾脆是沒有字型資訊的,標點也不講究。但是在實際工程應用中,這些資訊能起不小的作用。而英漢語在其使用方面也存在一些差異。標點(如?!:——。等)和字型(字母大小寫,斜體,粗體等)雖然本身沒有具體語義,但在辨識內容時起重要的引導作用。不妨讓我們想像一下,如果把我這篇文章裡所有標點、分段、標題字型等都去掉,讓人來閱讀理解本文內容,難度是不是立刻會加大很多?若是換成計算機來讀那就更麻煩了。
在英語中(尤其是書面語中),逗號和句號的使用有明確規範,一句話結尾要求必須用句號符「.」,並且下一句話的第一個單詞的首字母要求大寫。英文中從句非常多,從句之間要求用逗號「,」連線,以表示語義貫通。不僅如此,當一句話的主謂賓完整出現後,如果下一句話也同樣是一個完整句子,則兩句話中間或者需要用連詞(如 and, or, therefore, but, so, yet, for, either 等)連線,或者必須用句號「.」分割,如果中間用「,」且沒有連線詞,則屬於正式文書中的用法錯誤。如:
The algorithms and programs,which used on the website, are owned by the company called DataGrand, and are well known in China.
這裡出現的標點和大小寫字型是良好的句子語義指示符,既分割不同句子,也在句子內部分割不同語義,這些規範給英文 NLP 處理創造了較好的環境。
中文標點的使用則沒有這麼強的規範。事實上中文標點在中國古代官方文書中一直不被採用,僅扮演民間閱讀中的停頓輔助符的角色。直到 1919 年中華民國教育部在借鑑了西方各國標點規範後才第一次制定了漢語的 12 中符號和使用方法,建國後在 1951 年和 1990 年兩次修訂後逐步成型。因為歷史沿革的原因,這些對標點的使用規範更多偏向於指導意見,而不是一套強制標準。例如對逗號和句號何時使用,並不像英語中有特別嚴格的界定。漢語的分句較為模糊,意思表達完以後雖通常用句號,但用逗號繼續承接後面的句子也並不算錯,只要整篇文章不是極端的「一逗到底」,即使語文老師在批閱作文時也都不會過分對標點較真,而日常文章中標點的使用更是隨心所欲了。
與此同時,英文裡專有名詞用大寫或者斜體字型來區分,首字母大寫等用法,在中文中也不存在。NLP 處理中,中文標點和字型使用的相對隨意給句法分析也帶來了巨大的挑戰,尤其在句子級別的計算機語義理解方面中文比英文要困難很多。
除了上述不利因素,中文也有一些獨特的標點帶來有利的因素。例如書名號《》就是中文所獨有的符號,感謝這個符號!書名號能非常方便的讓計算機程式來自動識別專有名詞(如書名、電影名、電視劇、表演節目名等),這些名詞往往都是未登入詞,如果沒有書名號的指引,讓計算機程式自動識別這些中文專名的難度將加大很多,而這些專名詞彙恰恰都體現了文章的關鍵語義。例如下面這段新聞如果讓計算機來閱讀:「由於流浪地球的內容很接近好萊塢大片,因此影評人比較後認為不僅達到了 2012 的水平,而且對比星際穿越也毫不遜色。」要求計算機自動提取上面這句話的關鍵詞會非常困難,因為裡面有很多未登入詞,對「2012」的理解也會有歧義(時間詞?or 電影名?)
而正因為我們中文有書名號,迎刃而解:「由於《流浪地球》的內容很接近好萊塢大片,因此影評人比較後認為不僅達到了《2012》的水平,而且對比《星際穿越》也毫不遜色。」。除了書名號,漢語的頓號(、)也能很好的指示並列關係的內容,「達觀每天下午的水果餐很豐富,有桃子、葡萄、西瓜和梨」,這些並列的內容可以很方便的被計算機解讀。
英文則沒有書名號和頓號等,而是採用特殊字型(例如加粗、斜體、大寫,各不相同,沒有強制約定)等形式來標識出這些專有名詞。因此在處理英文時,這些字型資訊起很重要的作用,一旦丟失會帶來麻煩。
值得一提的是,在日常聊天文字中,標點符號和字母使用的含義產生了很多新的變化。例如對話文字中「。。。。。」往往表達出「無語」的情緒。「?」和「???」前者是疑問,後者更多表達震驚。還有 :) \^o^/ ORZ 等各類的符號的變換使用,給開發對話機器人的工程師們帶來了很多新的挑戰。
五、詞彙粒度的處理方法差異
詞彙粒度問題雖然在 NLP 學界被討論的不多,但的的確確 NLP 實戰應用中的一個關鍵要點,尤其在搜尋引擎進行結果召回和排序時,詞彙粒度在其中扮演關鍵角色,如果對其處理不恰當,很容易導致搜尋質量低下的問題。
我們先看中文,詞彙粒度和分詞機制有很大關係,先看個例子:「中華人民共和國」這樣一個詞,按不同粒度來切,既可大粒度切為:「中華人民,人民共和國」,也可進一步切出「中華,人民,共和國」,而「共和國」還可以進一步切為「共和,國」。一般我們把按最小粒度切分所得的詞稱為「基本粒度詞」。在這個例子中,基本粒度詞為「中華,人民,共和,國」4 個詞。甚至「中華」還能繼續切出「中/華」也有表義能力(這個後面還會詳細分析)
為什麼分詞需要有不同的粒度呢?因為各有作用。大粒度詞的表義能力更強,例如「中華人民共和國」這樣的大粒度詞,能完整準確的表達一個概念,適合作為文章關鍵詞或標籤提取出來。在搜尋引擎中直接用大粒度詞去構建倒排索引並搜尋,一般可得到相關性(準確率)更好的結果。
但從事過資訊檢索的朋友們想必清楚召回率(Recall)和準確率(Precision)永遠是天平兩端互相牽制的兩個因素。大粒度詞在搜尋時會帶來召回不足的問題。例如一篇寫有「人民共和國在中華大地上誕生了起來」的文章,如果用「中華人民共和國」這個詞去倒排索引中搜尋,是無法匹配召回的,但拆分為「中華人民 共和國」三個詞進行搜尋就能找出來。所以一個成熟的分詞器,需要因地制宜的設定不同粒度的分詞策略,並且最好還能確保在檢索詞處理(Query Analysis)和索引構建(Index Building)兩端的切分策略保持一致(陳運文)。目前學術界公開的分詞測試集合,往往都是隻有一種粒度,而且粒度劃分標準也並不一致,導致很多評測結果的高低離實際使用效果好壞有一定距離。
在中文分詞粒度裡,有一個非常令人頭疼的問題是「基本粒度詞」是否可繼續拆分的問題。就好比在化學中,通常約定原子(atom)是不可再分的基本微粒,由原子來構成各類化學物質。但如果進一步考慮原子可分,那麼整個化學的根基就會動搖。同樣在中文 NLP 領域,雖然學術界通常都預設基本粒度詞不再可分,但在實際工程界,基本詞不可再分會導致很多召回不足的問題,引入難以解決的 bad case。不要小看這個問題,這是目前限制中文語義理解的一個特別常見的難題。要解釋清楚來龍去脈,筆者還得從漢語的發展歷程說起。
中國古代漢語的表義基本單位是字而不是詞。我從《論語》中拿一句話來舉例:「己所不欲,勿施於人」。古代漢語一字一詞,這句話拿來分詞的話結果應該是「己/所/不/欲,勿/施/於/人」,可見全部切散為單字了。如果用現代白話文把這句話翻譯過來,則意思是「自己都不願意的方式,不要拿來對待別人」。現代漢語的特點是一般喜歡把單字都雙音節化,「己-->自己,欲-->願意,勿-->不要,施-->對待,人-->別人」。可以看出這些雙音節(或多音節)詞彙中部分蘊含著來源單字的意義。這種現象在現代漢語詞彙中比比皆是,例如「獅子」,「老虎」,「花兒」,「圖釘」,「水果」,「紅色」等,對應「獅,虎,花,釘,果,紅」等有意義的單字。而如果把這些雙音節詞作為不可再切分的基本粒度詞的話,當使用者搜「獅」的時候,即使文章中出現了詞彙「獅子」,也是無法被搜到的。
那麼如果將這些基本粒度詞再進一步切分呢?會切出「子,老,兒,圖,水,色」這樣存在轉義風險的詞彙(即這些單字對應的含義並未體現在原文中),帶來很多「副作用」。例如使用者搜「老」的時候,當然不希望把介紹「老虎」的文章給找出來。
與此同時,還有另一類的情況是有一些詞彙切為單字後,兩個單字都分別有表義能力,如「北歐」切為「北/歐」,對應「北部,歐洲」兩方面的意思。「俄語」切為「俄/語」,對應「俄國,語言」,「苦笑」,切為「苦/笑」,對應「痛苦,笑容」,以及「海洋」,「圖書」,「親友」,「時空」等都是可細分的。
還有第三類情況是,詞彙切分後單字都不能體現原詞含義,例如「自然」,如果切分為「自/然」,兩個字都沒有意義。類似的還有「蘿蔔」,「點心」,「巧克力」等,外來語為多。
之所以前面提到如今中文語義分析時,基本粒度問題是一個關鍵難題,原因是在現代漢語寫作時,既有現代雙音節/多音節詞彙,也夾雜很多源於古代漢語的單字,半文半白的現象很常見,這就一下給語義理解帶來很大的挑戰。不管是切分粒度的選擇,還是單字和詞彙間關聯關係的提取,標題和正文語義的匹配,當面臨文白間雜時都會遇到難關。常見的情況為:新聞標題為了精煉,經常喜歡採用源自古漢語習慣的單字簡稱或縮略語。例如「中美援非模式差異帶來效果大相徑庭」,是選擇「中美/援非」這樣的基本切分粒度,還是按單字表義切分為「中/美/援/非」,對應「中國美國援助非洲」這樣的內容,是存在各自的利弊的。計算機提取文章關鍵詞時,還需要把「援—>援助,非-->非洲」還原為詞並建立關聯才能很好的解讀處理。
目前業界並沒有一個公認的粒度標準,常見的幾個評測語料集合,如北大 pku-test,微軟亞洲研究院 msr-test,人民日報標註語料等,切分標準都有所不同。雖然一般普遍採用的雙音節詞為主的基本粒度標準,但是在應用於搜尋引擎、問答對話時都會出現大量召回不足的問題。而大量採用單字作為基本粒度詞又會引入有轉義風險的無效單字,並且還會出現運算效能等隱患。
為了解決基本粒度詞的問題,筆者曾在百度設計開發了亞粒度詞(subterm)補足的策略,緩解了召回不足的問題,工業界還有一些其他的同義詞關聯等方法來應對,但到目前為止詞彙粒度問題仍然是困擾中文 NLP 的一個「慢性病」。近年來興起的 BERT 模型,利用大量文字進行 Transform 預訓練,填補各種粒度詞彙的語義資訊,也是是一種緩解問題的辦法。
英文因為不存在切分問題,所以粒度問題只需要考慮片語(Phrase)切分的問題。例如 Harvard University,兩個單詞可以切為 Phrase 來表達一個具體機構。相比中文的從細到粗的多粒度切分要簡單很多。
六、句法結構分析方法異同
自然語言處理在詞彙級別之上是語句級別,因為語句是由一系列的詞彙排列組合後生成的。透過學習語法我們知道句子結構是由「主謂賓定狀補」這樣的句法元素構成的。例句「陳運文去達觀資料上班,」主語是「陳運文」,謂語「上班」,「達觀資料」是狀語,說明動作發生的地點。
在句子結構方面,「英語重形合,漢語重義合」的特點體現的非常明顯。英語為了充分體現句子中的各種承接、轉折、從屬、並列等關係,不厭其煩的準備了大量的連詞、助詞、介詞、冠詞等作為填充劑,來補充實詞之間的縫隙,構成了很多從句、引導句。這些包含各類結構的結構,讓計算機來進行語義角色標註 (SemanticRole Labeling, SRL) 和語義依存分析 (SemanticDependency Parsing, SDP) 相對比較容易。
因為這些形式指示詞的存在,一個大家能很直觀發現的現象就是英文寫出來的句子往往都特別長,整篇文章篇幅多。而同樣的意思用中文寫出來,篇幅往往只需要英文的一半甚至更少,漢語的句子非常精煉,尤其詩歌用短短几個字能描述出豐富的內涵——「孤帆遠影碧空盡,唯見長江天際流」,多麼洗練優美有意境。
從計算機的視角來看,恰恰因為漢語講究意合而不重形式,句子結構都比較鬆散,並沒有英文中那麼多的虛詞作為實詞間的語義粘合劑,而是依賴詞彙前後順序關係,隱含表達出句子結構,所以也給計算機處理帶來了挑戰。例如「中國人工智慧創業企業獲獎名單公佈」這句話裡,「中國,人工智慧,創業,企業,獲獎」這一連串的名詞均是主語「名單」的定語,如果用英語來寫這句話,一定會出現形如「the…of…that…which…」這樣一系列的輔助詞來把這些名詞粘接到一起,而中文並沒有它們。所以當我們訓練演算法去識別句子主語和定語的時候,必須要小心的判斷哪個名詞才是句子的真正主語所在。漢語中句子的重心往往後移,相反英語中句子主要部分前移,所以通常生成句法依存樹時中文都會自動選擇靠後的名詞。
除了句子內部的輔助詞外,在句子間關係識別時,中英文都會透過特定標識詞連線子句間關係,例如轉折關係(雖然…但是…),假設關係(如果…. 就…),遞進關係(不僅…而且…),因果關係(因為…. 所以….),英文則是 because…, Although…, If…, but also… 等。在中英文中這些標識詞經常會被自動省略,例如「車站人流量大,大家要照看好自己的行李」。這裡隱含的語義為「[因為] 車站人流量大,[所以] 大家要照看好自己的行李」,[-] 內的詞彙被自動省略了。區別在於英文一般會省略其中一個,例如「because…, so…,」這樣的句子會省掉其中一個,中文則既可以全省掉,也可以全寫出,實際進行語義理解時需要額外補充處理。
目前句法依存分析在實際工程應用中並沒有發揮很大作用,其原因一方面是上述一些現象導致了很難抽取得到特別準確的句法關係結果,另一方面是大部分 NLP 應用選擇了直接從詞彙或篇章級別來獲得結果,省去了中間句子這層。目前業界針對長程的語義上下文關係,逐步放棄傳統的 RST 方法,更多傾向於利用記憶網路(如 bi-LSTM)等技術完成提煉。在聊天對話等應用方面,用句法結構來把握語義仍然是會有價值的。
七、中文英文指代消解處理
計算機進行文章內容解讀時,經常碰到指代消解(ReferenceResolution)的問題。不論是在書面文字中進行長文章解讀,還是在對話文字中回溯前文問題,指代消解都起到非常關鍵的作用。計算機需要能像人類一樣建立起上下文間這些詞彙間的關聯關係,做到把概念串聯起來「讀懂」文章的意思。例如這句話:
「達觀資料順利入駐浦東軟體園,公司創始人陳運文表示,達觀專注於為企業提供文字智慧處理軟體系統和技術服務。他說:『文字理解任重道遠』」
這句話裡「公司」、「達觀」、「他」這些都是指代詞,「達觀資料」、「陳運文」是真正的實體,稱為先行語(antecedent),而「公司」、「達觀」、「他」是回指語(或稱為照應語,anaphor)。回指語有時是代詞(如「He」、「that」、「該公司」、「上述條款」、「前者」、「被告人」等等),有時是簡稱或縮寫(如「達觀」、「CEO」、「NLP」、「WTO」),有時採用借代方法,如「白宮的態度非常堅決」,「范冰冰們的納稅情況逐步被公佈」,「白宮」=「美國總統」,「范冰冰們」=「大陸影視演員」。人類的閱讀能力非常強,各類指代的情況人都能通暢理解,但對計算機來說並不簡單。在 NLP 領域為此專門存在技術分支稱為指代消解。指代消解通常又細分為回指、預指、共指等情形,實踐中通常稱為共指消解(CoreferenceResolution)
英文中常見指代語是專名首字母縮寫,也是表音文字特別之處。英文中專有名詞往往由多個單詞構成,篇幅長,從中抽取字母構成各類縮寫約定非常常見。縮寫一部分是行業內通用的(例如計算機領域常見的 CV,DNS,CPU,NLP 等),另一些則是在文中第一次出現專名時臨時約定的。例如一篇行業分析報告裡的句子:「High Carbon Steel (HCS) is typically producedas low carbon steel. HCS export volume in YTD 2017 reached to 6.9 millionmetric tons(MMT).」。這裡臨時性縮寫(HCS,YTD,MMT 等)大量出現。這些回指語是一個新的獨立單詞(例如例子中的 HCS),和原詞彙的關聯處理透過共指消解來完成。另一類回指語是「it、which、where、there、that」等這樣的指代詞,要透過上下文依賴關係去尋找實體。
中文的縮寫通常是從實體中抽取若干漢字新構成的詞,例如北京大學簡稱北大,復旦大學簡稱復旦,XX 銀行,通常簡寫為 X 行,XX 局長,簡寫為 X 局。(陳運文)因為漢字裡單字的表義能力比英文中單獨的字母要強的多。我們知道常用漢字有 5000 多個,而英文字母只有 26 個,所以中文縮寫詞更容易能讓人「望文生義」,讀懂含義。例如「高碳鋼」這個縮寫即使是外行也能猜出意思,但是 HCS 怕是很難直接讓人明白是啥,即漢語在縮略語的可讀性上優於英文。
正因為英文縮略語可讀性弱,且重複歧義多,所以為了讓人能讀懂,英文裡通常都會清楚標出先行語和縮寫規則。而漢語裡除非嚴格的法律文書會前置術語表,一般文字里用縮略語時比較隨意,很多時候約定俗成,並不「提前打招呼」。例如新聞:「北大學生在剛剛結束的奧數競賽中成功摘得兩枚金牌」。如果按縮略語習慣,應該寫為:「北京大學(以下簡稱北大)學生在剛剛結束的國際奧林匹克數學邀請賽(以下簡稱奧數)中成功摘得兩枚金牌。」
在共指消解中還會遇到的一類問題是因為語法結構導致的指向歧義的問題。例如「這張照片裡有陳運文和高翔的同事」、「那邊坐著三個公司的工程師」,這在前面句法結構解析時提到過,也同樣會影響中英文在處理共指消解時的結果。
在實際工程應用中,共指消解最常用到的場景是對人名、機構名、地點、條款、具體事件、關係型別等要素的指代處理。在超長文書(如證券行業的上市公司重組公告、招股說明書等)處理方面該技術也起了很大作用。日常中文的共指消解存在一定的行文規律,透過預先挖掘簡寫和指代詞表匯入演算法中可顯著提升效果。業界常見的共指消解方法既有傳統的規則啟發法,也有經典的統計學習、聚類演算法、機率圖模型等,此外深度強化學習、長短時記憶網路等新的 Meural Mention-ranking 方法也有良好的效果。
八、英漢語詞彙間關聯關係挖掘
詞彙間關係是構建語義網絡的一項基礎技術,我們知道同義詞、近義詞、相關詞是特別常見的詞彙關係,此外詞彙的上下位(例如在生物知識網路中 Sparrow 屬於 Bird,Shanghai 屬於 China)和詞向量等在 NLP 處理中都很重要。和英文單詞相比,漢字的數量少得多,常用漢字數才 2000-3000 個,其中最常用的 1000 個漢字已經能覆蓋 92% 的書面資料了。這 1000 個漢字中去掉偏旁部首類似的字,獨立語素更是不到 500 個。在表述事物時漢語中採用字組合的方式,可以非常方便的理解詞義並且研讀出詞彙之間的關聯關係。
而英文單詞動輒 2 萬-3 萬個(美國成年人平均單詞量),而且意思相似的詞彙間的字母構成差異很大,所以很多情況下如果沒見過某個單詞,很難像中文一樣大致能猜出詞彙所指的意思。請大家不查詞典猜猜 limousine、roadster、saloon 分別是什麼意思,再看看對應的中文意思,就能理解為什麼會有這麼多英文單詞了。
我們再用下面的這樣一些例子給大家直觀的展示英文在表述相近事物時的差異性:Chick, Rooster, Hen, Egg 彼此之間從字母分佈上來看很難看出有什麼關聯,但是換成中文,對應的是小雞、公雞、母雞、雞蛋,很容易就能發現其中的規律。中文詞彙是由有意思的單字組合構成的,因此透過字就很容易觀察和理解詞彙間的關係。類似的,小牛,公牛,母牛的英文單詞為 Calf,Ox,Cow,甚至公牛在英文中還區分閹割後的 steer 和沒被閹割的 bull。因此漢語 NLP 中只需要根據動物名「雞」、「牛」、「豬」、「鴨」加上相應的形容詞就可以知道意思了,而在英文中由於單詞的差異無法直接透過單詞的語素關係直接計算獲得,所以為驗證語義關係時略為複雜一些。
知識圖譜(Knowledge Graph)是理解這些詞彙間關係一種好辦法。詞彙(或稱為實體 Entity)間的關係透過挖掘大量文字、Wiki 等來構建。英文詞彙間的關係不像中文這樣能讓人能觀察到,因此構建知識圖譜對英文來說非常有價值。例如 spaghetti,penne,capellini,fusilli,lasagne,macaroni 這些實體,透過構建出知識圖譜,才能讓計算機知道他們都屬於 Pasta(義大利麵)下面的某個品類的名字。近幾年興起的基於 Skip-gram 或 CBOW 模型的 Word2Vec 方法一經提出就得到了非常廣泛的應用,在實踐中好評如潮,就是因為 embedding 技術恰好彌補了英文中詞彙之間關係不直觀的問題,對提高計算機英文語義理解的能力起到了很好的幫助作用。類似的,中文詞向量、預訓練等技術構建好後,也帶來了整體語義分析效果的大幅度進步。漢語和英語在詞彙間關係挖掘這個方面,目前整體的演算法都是相同的,區別在於漢語的詞彙間關係可以更加顯式的被人觀察到。畢竟,讓人來判斷 hepatitis 和 pneumonia,Grape 和 Raisin,January 和 March,Monday 和 Thursday 間的關係,相比分析肝炎和肺炎,葡萄和葡萄乾,一月和三月,週一和週三之間的關係,還是要困難很多的,對計算機來說也是如此。
九、中英文省略和內容補足的處理
語境是一個微妙的概念,人類在進行文字閱讀時,不只是看到文字內容本身,而是不自覺的會將語境相關的詞彙自動補充進入字裡行間,輔助語義理解。反之,人類在文字寫作時,會將一些重複內容省略掉,主語或賓語是最常被省略的物件。例如摘錄自合同文書的一段文字「本協議中約定了大橋建設工程的具體內容,其中乙方負責承接,丙方負責監督,以確保順利交付」。如果讓計算機來解讀,需要把指代語補齊(用 [-] 表示)為:「本協議中約定了大橋建設工程的具體內容,乙方負責承接 [該工程],丙方負責監督 [乙方的工作],確保 [該工程] 順利交付」。書面文字還相對規範,如果是日常對話的口語文字,那麼省略更加是無處不在,以一個電商客服問答為例:「這雙賣多少?」,「58」。「少點?」,「最低了」。「行嗎?」,「做不了哎」。如果補齊省略語,應該為:「這雙 [鞋子的價錢] 賣多少?」「[價錢] 少點 [行嗎]?」「[價錢少點] 行嗎?」
除了主謂語省略,一些非常重要的連詞也經常被省略,例如「因為…所以…,雖然…但是…,儘管…然而…」,例如:「開車不注意,親人淚兩行」,「股市有風險,投資需謹慎」,補充邏輯連詞後為「[如果] 開車不注意,[那麼] 親人淚兩行」,「[因為] 股市有風險,[所以] 投資需謹慎」。
英文的省略習慣也存在(全世界人民都愛偷懶),例如省略主語 it:「Looks as if it will snow」,省略謂語 comes:「Who next?」,省略賓語 thedishes:「Let ' s do the dishes. I ' ll wash and you ' ll dry.」, 省略連詞 that「It ' s a pity[that] she ' s leaving」。當然英文中還有一類約定俗成的獨特簡稱(很多來自拉丁語)e.g., etc., al., i.e., viz. 等。
區別在於英文書面文字中省略出現的較少,同時語義連線詞的省略有固定規範,例如「because…so…」要求只省其中一個。英文行文時單詞使用量比中文多,同樣的內容英文篇幅通常是中文的 200% 左右,也即中文 1 頁紙寫完的內容,如果用英文寫要 2 頁甚至更多。如果對比惜字如金的文言文,就更濃縮了。如「民為貴,社稷次之,君為輕」,10 個字如果改用英文寫,沒有幾十個單詞怕是說不清楚。那麼放到省略環境下看時,漢語就比較吃虧了,因為本來就濃縮,再加上語法約束不嚴導致時不時省略,對資訊的損失比較大。從 10 個漢字的短句中省略 2 個字,和從一段 20 個單詞的英文句子中省略 2 個單詞,前者對計算機處理來說要費力不少。達觀在進行文字應用實踐中,也在想辦法主動「腦補」出這些省略語,加深對文字理解的深度(陳運文)。近年興起的文字預訓練(例如大名鼎鼎的 BERT,MT-DNN 等)技術透過海量文字的預訓練,對文字進行表示學習,運用 transform 編碼器等把這些詞句中的隱語義資訊嵌入(Embedding),結合 Attention 機制,填補省略內容,在自然語言理解(NLU)的很多應用(例如 GLUE benchmark、史丹佛閱讀推理 SQuAD、SNLI、MultiNLI、SciTail)能大幅度提升效果。
十、歧義問題與子串轉義處理
雖然大部分 NLP 的演算法都具備語言無關性(Language independent),但是在具體工程任務中還是有很多語言相關的問題。在漢語中經常發生的一類情況是文字子串區域性轉義的問題。這個問題因為是漢語所獨有的,在英文中幾乎不曾出現,所以在自然語言處理的學術界並不作為主流的課題被研究(因為學術界主流還是傾向於研究語言無關性的課題和方法)。但是筆者在多年從事 NLP 以及搜尋和推薦系統技術研發工作時,深深的感受到子串轉義是一個非常困難卻也非常重要的漢語 NLP 課題。對這個課題處理水平的高低直接影響著大量的實際工程效果。下面具體闡述下該問題的定義。
前文我曾提到過漢語中單字不多(3000 個漢字可以覆蓋 99% 的中文文字了),所以漢語裡的詞彙大多是由幾個漢字順序組合來形成的。這裡潛伏著一個巨大的隱患是,因為字的排列組合形式很多,所以會導致區域性出現的一些組合所構成的意思,和整體詞的意思不同,出現歧義;或者說一個詞彙中的子串和整個詞的意思會出現很大的差異,因而也稱為子串轉義問題。這裡我用數學形式化的方法再來表述下:假設 A、B、C 分別表示三個漢字,那麼子串轉義就是指詞彙 ABC 的含義,和 AB 或者 BC 的含義完全不相同。當然 4 個漢字或者更長的短串也類似。例如 ABCD 和 ABC 或 BCD 或 AB、BC、CD 的意思可能會完全不同,這種意思「突變」的情況稱為子串轉義。
例如:「周杰倫」和其中的前兩個字構成的詞「周杰」顯然指的是完全不同的兩個人,「蕁麻疹」和「麻疹」是兩種病,「亞健康」和「健康」的意思截然相反。這會給計算機處理帶來很多困難,尤其在搜尋引擎中,當使用者搜「周杰」或「麻疹」或「健康」時,如果結果出「周杰倫上海粉絲見面會」、或「蕁麻疹治療方法」、「導致白領亞健康的主要原因」都是不太好的結果。我們在搜尋引擎中遇到的大量結果不相關的問題,很多都是由於漢語中區域性轉義現象導致的。
同樣,在進行關鍵詞提取、文字相似度計算、相關文章推薦等場景的時候,這些區域性轉義的問題同樣也會帶來很大麻煩。例如「周杰倫上海粉絲見面會」和「周杰倫現身上海電影節」兩篇文章的內容相關度,顯然遠大於「周杰上海粉絲見面會」。
很多朋友可能會覺得這些都可以視為命名實體識別(NER)問題,將這些專名直接切為一個整體,就能解決上述區域性轉義的問題了。其實沒這麼簡單,因為其實大量的中文詞彙裡,區域性片語合成的意思和整體詞彙是存在關聯的,如果不切開會帶來召回不足的問題。例如「消防隊」和「消防」,「上班族」和「上班」,「315 晚會」和「315」等,甚至前面例子裡「周杰倫」和「杰倫」也有緊密的語義關聯。當使用者搜尋詞是「消防」、「杰倫」、「315」等 query 時,相應的整體詞「周杰倫」、「315 晚會」等所在的文章也理應被搜出來。因為明明文章裡有這個詞且意思相關,如果沒被找出來是不能被使用者接受的。透過這些例子可見正確處理漢語的字片語合的確是一件很棘手的課題。再舉個例子:「不可以」這個常用詞,把「不可」單獨作為子串提取出來是非常有必要的,因為和原詞意思相同。但是把「可以」單獨提取出來就很危險,因為和原詞意思相反,單獨進行搜尋匹配會導致歧義。再如我們可以把「阿里巴巴」裡的子串「阿里」切出來,因為很多時候使用者稱呼「阿里」就是指「阿里巴巴」,但是把「裡巴」或「巴巴」切出來則是不合適的。
究竟哪些子串詞彙和原詞意思相同相近?哪些又會發生轉義?這需要計算機更智慧的進行判斷才行,目前我們已經想了一些方法去解決,例如透過字的共現頻率等進行處理,但離徹底解決漢語裡子串轉義的問題還有距離。
除了子串轉義外,漢語中其他歧義的情況也是比比皆是,例如「我去上課了」、「她看病去了」(主動和被動不明,導致無法區分老師還是學生,病人還是醫生)、「要多少有多少」(無法區分核心語義是多還是少)、「咬死了獵人的狗」、「喜歡山區的孩子」(無法區分狗或孩子是主語還是賓語)。因為中文不是靠詞彙的變形變換來體現修飾、主被動等關係,而是靠順序組合來體現,因此在中文 NLP 的各個環節,從分詞、詞性、句法、指代,到區域性子串處理等,都會帶來歧義理解的問題。
英文中也存在歧義問題,最常見的情況是英文多義詞導致的。例如「He went to the bank」既可以理解為「他去了銀行」,也可以理解為「他去了河岸邊」,「The doctor saw the Indian dance」,單詞 Indian 既可以視為形容詞「印第安人的舞蹈」,也可以是名詞「印第安人+跳舞」,還有英文中不定式導致的歧義,如「Not many books filled the shelves」,可以理解為「書架上沒有幾本書」或者「要放滿那些書架不用很多書」。
其實所有的人類語言都存在著各式各樣的歧義的問題,我們看到各個民族所流傳的笑話裡很多都是拿這些歧義語義來打趣的。不同語言處理歧義的具體方法不同,但整體思路都是將歧義句放到句子上下文裡來解讀,引入更多語境資訊來正確獲得意思。
可以說計算機進行語義理解的結果,某種程度上就是在和各種各樣的歧義做鬥爭的過程。打個比方,自然語言處理的過程就像是讓計算機拿著用上下文語境拼湊出的一張殘缺的地圖,撥開雲遮霧繞的文字迷霧,越過歧義所埋下的一個個大坑,逐步接近語義真相的過程。
中英文 NLP 差異總結
中文和英文這兩類全球使用人數最多,影響力最大的語言,有各自鮮明的語言特色,在計算機進行自然語言處理領域也有各自獨樹一幟的地方。本文從語言特點的角度出發,從 10 個方面分析了中英文在自然語言處理上的差異。隨著全球化的發展,中英文在不斷相互影響,相互滲透。例如中文中有大量的外來語來自英文,沙發、咖啡、巧克力、牛頓等這些頻繁出現的詞彙都源於英文,還有很多專業術語如 NGO、WTO、CFO 等,甚至 NLP 一詞本身也是源自英文。英文也在受中文影響,每年都有近千條外來詞彙新收錄入英文詞典,如 Kungfu(功夫),tofu(豆腐)等。
無論是中英文各自的 NLP 應用,還是兩種語言之間的相互翻譯,都面臨著非常巨大的技術挑戰,因為語言的產生和發展受人類日常交流和使用的影響,雖然有一定的語法規律,但並不完全嚴格的,另外語義理解還受上下文語境、以及領域知識的影響非常大,這些都給計算機處理帶來了很多困難。
雖然整體上 NLP 的演算法都是語言無關的,但是在細節處理上還是存在很多差異,尤其在實際工程應用中為了達到儘可能好的效果,往往要深入探究語言的特點。因此本文從兩種語言的特點出發,結合作者在計算機文字處理方面的從業經驗,分析了兩者 NLP 的異同點,雖掛一漏萬,但期望對各位讀者有所啟發,也期待未來中英文的語義理解技術都不斷創造新的突破。(陳運文 達觀資料)
關於作者:
陳運文,達觀資料創始人,復旦大學計算機博士,科技部「萬人計劃」專家,國際計算機學會(ACM)、電子電器工程師學會(IEEE)、中國計算機學會(CCF)、中國人工智慧學會(CAAI)高階會員;第九屆上海青年科技英才。在人工智慧領域擁有豐富研究成果,是復旦大學、上海財經大學聘任的校外研究生導師,在 IEEE Transactions、SIGKDD 等國際頂級學術期刊和會議上發表數十篇高水平科研成果論文,譯有人工智慧經典著作《智慧 Web 演算法》(第 2 版),並參與撰寫《資料實踐之美》等論著;曾多次摘取 ACM KDD CUP、CIKM、EMI Hackathon 等世界最頂尖的大資料競賽的冠亞軍榮譽。