編者按:計算機非常適合處理電子表格和數(shù)據(jù)庫表等結(jié)構(gòu)化數(shù)據(jù),但在日常生活中,人類通常使用的溝通工具是文字,而不是表格,這對計算機來說也許是個不幸。語言原始文本是一種非結(jié)構(gòu)化的信息,那么我們該如何讓計算機理解文本并從中提取數(shù)據(jù)呢?
自然語言處理(NLP)是人工智能的一個子領(lǐng)域,它專注于使計算機能夠理解和處理人類語言。本文會介紹NLP工作的基本機制,希望讀者能從中得到啟發(fā)。
注:本文選用的示例語言是英語。
計算機能理解語言嗎?
自計算機誕生之初,程序員們就一直在嘗試編寫能理解語言的程序。原因很簡單——人類使用語言的歷史已長達千年,如果計算機能閱讀并理解所有數(shù)據(jù),這將大有裨益。
雖然現(xiàn)在計算機還不能像人類一樣真正讀懂語言,但它們確實取得了不少進展,在某些領(lǐng)域,使用NLP可以為事物帶來神奇的改變。通過把NLP技術(shù)應(yīng)用于你自己的項目,也許你會因此節(jié)約大量時間。
更好的消息是,現(xiàn)在我們可以通過開源Python庫(如spaCy、textacy和neuralcoref)輕松訪問NLP領(lǐng)域的最新成果。只需幾行代碼,令人驚嘆的成果立馬實現(xiàn)。
從文本中提取意義很難
閱讀和理解語言是一個非常復(fù)雜的過程——它們甚至不會判斷這樣的理解是否符合邏輯和一致性。例如,下面這個新聞標(biāo)題表達了什么含義?
“Environmental regulators grill business owner over illegal coal fires.” 環(huán)境監(jiān)管機構(gòu)就非法燃煤一事___企業(yè)主。(grill:追問,炙烤)
監(jiān)管機構(gòu)是在質(zhì)疑企業(yè)存在非法燃煤情況,還是在拿企業(yè)主做飯?如你所見,用計算機解析語言會讓問題變得很復(fù)雜。
在機器學(xué)習(xí)中,解決復(fù)雜任務(wù)通常意味著建立一個pipeline。它的想法是把問題分解成若干個非常小的部分,然后用機器學(xué)習(xí)去一一破解,最后,通過將這些機器學(xué)習(xí)模型拼接在一起,我們可以用它完成復(fù)雜任務(wù)。
而這正是我們在NLP中常用的策略。我們把理解語言文本這個過程分成幾個小塊,然后獨立推敲它們的具體理解方式。
逐步構(gòu)建NLP管道
下面是維基百科中關(guān)于“倫敦”的一段文字:
London is the capital and most populous city of England and the United Kingdom. Standing on the River Thames in the south east of the island of Great Britain, London has been a major settlement for two millennia. It was founded by the Romans, who named it Londinium. 倫敦是英格蘭和英國的首府,也是英國人口最多的城市。它位于大不列顛島東南部的泰晤士河畔,2000年來一直是這一地區(qū)的主要定居點之一。倫敦最初由羅馬人建立,取名為倫蒂尼恩。
這段文字包含多個有用事實,如果計算機能從中讀懂“倫敦是一座城市”“倫敦位于英格蘭”“倫敦由羅馬人建立”,那就大功告成了。但為了實現(xiàn)這一目標(biāo),我們首先要向計算機傳授書面語言的最基本概念,然后再謀求進一步發(fā)展。
第一步:語句分割(Sentence Segmentation)
NLP pipeline的第一步是先把文本分割成單獨的句子,如下所示:
倫敦是英格蘭和英國的首府,也是英國人口最多的城市。
它位于大不列顛島東南部的泰晤士河畔,2000年來一直是這一地區(qū)主要的定居點之一。
倫敦最初由羅馬人建立,取名為倫蒂尼恩。
我們可以假設(shè)這里的每個句子都表示一種獨立的思想或想法,比起理解整個段落,編寫程序來理解單個句子確實會容易得多。
至于構(gòu)建語句分割模型,這不是一件難事,我們可以根據(jù)標(biāo)點符號確定每個句子。當(dāng)然,現(xiàn)代NLP通常會用更復(fù)雜的技術(shù),即便文檔內(nèi)容不整潔,它還是能大致區(qū)分完整句子。
第二步:單詞詞例(Word Tokenization)
有了一個個被拆分的句子,現(xiàn)在我們可以對它們進行逐一處理。讓我們從第一句開始:
London is the capital and most populous city of England and the United Kingdom.
這一步的目標(biāo)是把句子再分割成單獨的單詞或標(biāo)點符號,分割完成后,整個句子變成了這樣:
“London”, “is”, “ the”, “capital”, “and”, “most”, “populous”, “city”, “of”, “England”, “and”, “the”, “United”, “Kingdom”, “.”
英語中存在自然分界符——空格,所以對它生成詞例非常方便。只要兩個詞例之間有空格,我們就可以把它們直接分開。因為標(biāo)點符號也有意義,我們要把它們視為單獨的詞例。
第三步:預(yù)測詞例詞性
接下來,我們來關(guān)注詞例的詞性:名詞、動詞、形容詞……知道每個詞語在句子中的作用有助于我們理解句子在說什么。
要實現(xiàn)這一點,我們可以事先訓(xùn)練一個詞性分類模型,然后把每個單詞輸入其中預(yù)測詞性:
這個模型最初是在數(shù)百萬個英語句子上訓(xùn)練的,數(shù)據(jù)集中已經(jīng)標(biāo)明每個單詞的詞性,因此它可以學(xué)會這個“定義”的過程。但是注意一點,這個模型完全是基于統(tǒng)計數(shù)據(jù)的——它實際上無法像人類那樣理解單詞含義,而是只能根據(jù)“看”到過的類似句子進行猜測。
處理完整句后,我們會得到這樣的結(jié)果:
有了這些信息,我們就可以開始收集一些非?;镜暮x,比如句子中的名詞包括“倫敦”“首府”,所以這句話有大概率是在談?wù)搨惗亍?/p>
第四步:文本詞形還原(Text Lemmatization)
在英語中,單詞是有不同形式的,比如:
I had a pony.
I had two ponies.
兩個句子都涉及名詞pony(小馬),但一個是單數(shù)形式,一個是復(fù)數(shù)形式。當(dāng)計算機在處理文本時,如果沒有說明,它會把“pony”和“ponies”看成完全不同的對象,因此了解每個單詞的基本形式很有幫助,只有這樣,計算機才知道兩個句子在談?wù)撏粋€概念。
在NLP中,我們把這種將一個任何形式的語言詞匯還原為一般形式的過程稱為詞形還原,它能找出句子中每個單詞的最基本形式。
同樣的,這也適用于英語動詞。我們可以用詞形還原找出單詞詞根,這之后,“I had two ponies”就變成了“I [have] two [pony]”。
詞形還原是通過檢索詞匯生成表格實現(xiàn)的,它也有可能具有一些自定義規(guī)則,可以處理人們從未見過的單詞。
以下是經(jīng)還原的例句,我們做的唯一改變是把“is”變成“be”:
第五步:識別停用詞(Identifying Stop Words)
然后就是衡量句子中每個單詞的重要性。英語中有很多填充詞,比如經(jīng)常出現(xiàn)的“and”“the”和“a”。在對文本進行統(tǒng)計時,這些詞會引入很多噪音,因為它們出現(xiàn)的頻率很高。一些NLP pipeline會將它們標(biāo)記為停用詞 ——也就是說,在進行任何統(tǒng)計分析之前,我們可能會希望過濾掉這些詞。
下面是標(biāo)灰停用詞的例句:
停用詞檢測也有一個事先準(zhǔn)備好的列表,但它和詞形還原有區(qū)別,我們沒有適用于任何問題的標(biāo)準(zhǔn)停用詞列表,它需要具體問題具體分析。比方說,如果我們要構(gòu)建一個有關(guān)搖滾樂隊的搜索引擎,那“The”這個詞千萬不能被忽略,因為它會出現(xiàn)在很多樂隊的名字里,20世紀(jì)80年代還有一支著名的樂隊叫“The The”。
第六步:依存句法分析(Dependency Parsing)
下一步是弄清楚句子中的所有單詞是如何相互關(guān)聯(lián)的,也就是依存句法分析。
我們的目標(biāo)是構(gòu)建一棵依存樹,其中樹根處是占據(jù)支配地位的主要動詞,簡稱主詞,處于依存地位的是從詞:
但我們可以更進一步。除了識別每個單詞的主詞外,我們還可以預(yù)測這兩個單詞之間的依存關(guān)系類型:
這棵依存樹告訴我們句子的主語是“London”,它和“capital”存在一個“be”的關(guān)系。據(jù)此我們得到了一條有用信息——London is a capital。在這個基礎(chǔ)上,如果我們繼續(xù)往后看,可以發(fā)現(xiàn),其實London is the capital of the United Kingdom。
就像我們之前使用機器學(xué)習(xí)模型預(yù)測詞性一樣,依存句法分析也可以用一個模型來實現(xiàn)。不同的是,解析單詞依存特別復(fù)雜,需要結(jié)合整篇文章詳細解釋。如果你感興趣,Matthew Honnibal的“用500行Python代碼解析英語”是個不錯的教程。
雖然2015年的時候,作者表示這種方法已經(jīng)成為標(biāo)準(zhǔn),但放到現(xiàn)在來看,它還是有點過時,很多研究人員都已經(jīng)不再用它了。2016年,Google發(fā)布了一個名為Parsey McParseface的新依存解析器,它基于深度學(xué)習(xí),在性能上明顯超出已有基準(zhǔn),因此一經(jīng)發(fā)布就被廣泛傳播。一年后,他們又發(fā)布了更新版本ParseySaurus,進一步做了提升。簡而言之,依存句法分析現(xiàn)在還是一個活躍的研究領(lǐng)域,并且在不斷變化和改進。
此外,許多英語句子存在意義含糊不清的問題,往往難以解析。在這些情況下,模型會基于句子的各個解析版本猜測一個可能性最高的選擇,但它并不完美,有時模型會出現(xiàn)令人尷尬的錯誤。但隨著時間的推移,我們的NLP模型會逐漸走向合理。
第6b步:尋找名詞短語
到目前為止,我們已經(jīng)把句子中的每個單詞視為一個單獨的實體,但有時這些表示單個想法或事物的詞組合在一起會更有意義。利用依存樹,我們可以自動整合信息,把討論同一個事物的單詞組合在一起。
比起下圖這個形式:
我們可以對名詞短語進行分組以生成:
是否要采取這一步驟取決于我們的最終目標(biāo)。但是,如果我們不需要了解句子的額外細節(jié),比如哪些詞是形容詞,而是更多地關(guān)注提取完整想法,那么這通常是簡化句子的一個便捷方法。
第七步:命名實體識別(NER)
完成上述步驟后,我們就可以擺脫初級語法,開始真正著手提取意義。
在示例句子中,我們有以下名詞:
這些名詞中包含一些現(xiàn)實存在的東西,比如“倫敦”“英格蘭”“英國”表示地圖上的某個地理位置。有了這些信息,我們就可以使用NLP自動提取文檔中提到的真實世界的位置列表。
命名實體識別(NER)的目標(biāo)是檢測這些表示現(xiàn)實世界食物的詞,并對它們進行標(biāo)記。下圖把各個詞例輸入NER模型后,示例句子的變化情況:
雖然直觀上看不出,但NER絕不是簡單地查詞典、打標(biāo)簽,它包含一個單詞在上下文中位置的統(tǒng)計模型,可以預(yù)測不同單詞分別代表哪種類型的名詞。舉個例子,一個好的NER模型可以區(qū)分“Brooklyn”是表示人名Brooklyn Decker,還是地名布魯克林。
以下是典型NER系統(tǒng)可以標(biāo)記的一些對象:
人的名字
公司名稱
地理位置(地緣和政治)
產(chǎn)品名稱
日期和時間
金額
事件名稱
NER有很多用途,因為它可以輕易從文本中獲取結(jié)構(gòu)化數(shù)據(jù),這是快速從NLP pipeline中獲取有價值信息的最簡單的方法之一。
第八步:共指消解
截至目前,我們已經(jīng)有了許多和句子相關(guān)的有用表征。我們知道每個單詞的詞性、單詞間的依存關(guān)系,以及那些詞表示命名實體。
但我們還有一個棘手的問題,就是英語中包含大量代詞,比如“he”“she”“it”,這些詞頻繁出現(xiàn)在句子里,是我們?yōu)榱吮苊庵貜?fù)提及某個名稱而使用的簡稱。人類可以根據(jù)上下文理解這些代詞的含義,但NLP模型不行,因為到目前為止,它只是一句一句地檢測。
讓我們來看示例的第三句:
“It was founded by the Romans, who named it Londinium.”
根據(jù)NLP pipeline,我們的模型只知道“it”是羅馬人造的,還不知道“it”是什么。但這個問題想必難不倒任何讀得動這段話的人,我們知道這里的“it”就是第一句里的“London”。
以下是在我們的文檔中為“倫敦”一詞運行共識解析的結(jié)果:
通過將共指消解與依存樹、命名實體信息相結(jié)合,我們可以從該文檔中提取大量信息!事實上,這也是現(xiàn)在NLP領(lǐng)域的一大難點,它的難度遠高于單個句子解析。雖然近年來基于深度學(xué)習(xí)最新進展的某些成果已經(jīng)取得了一定突破,但它們都不完美。
以上是關(guān)于NLP的一些基礎(chǔ)知識,如果你對這個內(nèi)容感興趣,以后我們還會討論NLP的更多內(nèi)容,如文本分類、智能助理解析問題等具體應(yīng)用。
-
計算機
+關(guān)注
關(guān)注
19文章
7534瀏覽量
88502 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8438瀏覽量
132970 -
nlp
+關(guān)注
關(guān)注
1文章
489瀏覽量
22085
原文標(biāo)題:自然語言處理,其樂無窮!
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論