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

機(jī)器視覺是干什么的_機(jī)器視覺的應(yīng)用有哪些
計(jì)算機(jī)是如何理解世界的

自然語言理解問答對話文本數(shù)據(jù),賦予計(jì)算機(jī)智能交流的能力
計(jì)算機(jī)究竟是如何理解并執(zhí)行我們所寫的代碼的呢?

計(jì)算機(jī)視覺:AI如何識別與理解圖像

評論