成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

自然語(yǔ)言處理是如何工作的?一步步教你構(gòu)建NLP流水線

開發(fā) 開發(fā)工具 前端 自然語(yǔ)言處理
本文以簡(jiǎn)單的例子一步步向我們展示了自然語(yǔ)言處理流水線的每個(gè)階段的工作過程,也就是將語(yǔ)言結(jié)構(gòu)化的過程,從句子分割、詞匯標(biāo)記化、...、到共指解析。作者的解釋很直觀、好理解,對(duì)于剛?cè)腴T NLP 的小伙伴是不可多得的好文。

計(jì)算機(jī)更擅長(zhǎng)理解結(jié)構(gòu)化數(shù)據(jù),讓計(jì)算機(jī)去理解主要以文化習(xí)慣沉淀下來的人類語(yǔ)言實(shí)在是太為難它們了。那自然語(yǔ)言處理獲得的成功又是如何成就的呢?那就是,把人類語(yǔ)言(盡可能)結(jié)構(gòu)化。本文以簡(jiǎn)單的例子一步步向我們展示了自然語(yǔ)言處理流水線的每個(gè)階段的工作過程,也就是將語(yǔ)言結(jié)構(gòu)化的過程,從句子分割、詞匯標(biāo)記化、...、到共指解析。作者的解釋很直觀、好理解,對(duì)于剛?cè)腴T NLP 的小伙伴是不可多得的好文。

計(jì)算機(jī)是如何理解人類語(yǔ)言的。

計(jì)算機(jī)非常擅長(zhǎng)使用結(jié)構(gòu)化數(shù)據(jù),例如電子表格和數(shù)據(jù)庫(kù)表。但是我們?nèi)祟愅ǔS梦淖纸涣?,而不是使用電子表格來交流。這對(duì)計(jì)算機(jī)來說不是一件好事。

遺憾的是,在歷史的進(jìn)程中我們從未生活在一個(gè)充滿結(jié)構(gòu)化數(shù)據(jù)的世界里。

世界上很多信息是非結(jié)構(gòu)化的——例如英語(yǔ)或其他人類語(yǔ)言中的原始文本。那我們要如何讓計(jì)算機(jī)了解非結(jié)構(gòu)化文本并從中提取數(shù)據(jù)呢?

自然語(yǔ)言處理,或簡(jiǎn)稱為 NLP,是 AI 的子領(lǐng)域,重點(diǎn)放在使計(jì)算機(jī)能夠理解和處理人類語(yǔ)言。接下來讓我們看看 NLP 是如何工作,并學(xué)習(xí)如何使用 Python 編程來從原始文本中提取信息。

注意:如果你不關(guān)心 NLP 是如何工作的,只想復(fù)制和粘貼一些代碼,請(qǐng)?zhí)^到「在 Python 中實(shí)現(xiàn) NLP 流水線」的部分。

一、計(jì)算機(jī)能理解語(yǔ)言嗎?

只要計(jì)算機(jī)一直存在,程序員就一直在嘗試編寫出能理解像英語(yǔ)這樣的語(yǔ)言的程序。原因很明顯——人類已經(jīng)書寫下了幾千年的信息,如果計(jì)算機(jī)能夠讀取和理解所有的這些數(shù)據(jù),這將是非常有幫助的。

盡管計(jì)算機(jī)還不能像人類那樣真正地理解英語(yǔ)——但是已經(jīng)可以做很多事情了!在某些特定的領(lǐng)域,你可以用 NLP 技術(shù)去做一些看起來很神奇的事情,也可以在自己的項(xiàng)目中應(yīng)用 NLP 技術(shù)來節(jié)省大量的時(shí)間。

更為便利的是,目前最新的 NLP 技術(shù)進(jìn)展都可以通過開源的 Python 庫(kù)(例如 spaCy、textacy、neuralcoref 等)來調(diào)用,僅僅需要幾行 Python 代碼即可實(shí)現(xiàn) NLP 技術(shù)。

二、從文本中提取含義并不容易

閱讀和理解英語(yǔ)的過程是非常復(fù)雜的,這個(gè)過程甚至沒有包括考慮到英語(yǔ)有時(shí)并不遵循邏輯和一致的規(guī)則。例如,這條新聞標(biāo)題是什么意思?

「Environmental regulators grill business owner over illegal coal fires.」

是監(jiān)管者質(zhì)疑企業(yè)所有者非法燃燒煤炭嗎?還是監(jiān)管者真的在架起企業(yè)所有者并用煤炭燒烤?正如你所看到的,用計(jì)算機(jī)解析英語(yǔ)將會(huì)變得非常復(fù)雜。

在機(jī)器學(xué)習(xí)中做任何復(fù)雜的事情通常意味著需要建立一條流水線 (pipeline)。這個(gè)想法是把你的問題分解成非常小的部分,然后用機(jī)器學(xué)習(xí)來分別解決每個(gè)部分,最后通過把幾個(gè)互相饋送結(jié)果的機(jī)器學(xué)習(xí)模型連接起來,這樣你就可以解決非常復(fù)雜的問題。

這正是我們要運(yùn)用在 NLP 上的策略。我們將把理解英語(yǔ)的過程分解成小塊,然后看看每個(gè)小塊是如何工作的。

三、一步一步建立 NLP 流水線

讓我們來看看來自維基百科的一段文字:

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.

(倫敦是英格蘭的首都同時(shí)也是英國(guó)人口最大的城市,是大不列顛東南部的泰晤士河流域兩千年來的主要人類定居點(diǎn),由羅馬人建立,取名為倫蒂尼恩 (Londinium)。

這一段話包含了一些有用的事實(shí)。如果一臺(tái)電腦能閱讀這篇文章,理解到倫敦是一座城市,倫敦位于英國(guó),倫敦由羅馬人定居,那就太好了。但是為了達(dá)到這個(gè)目的,我們首先必須教會(huì)計(jì)算機(jī)最基本的書面語(yǔ)言概念,然后基于此再逐步進(jìn)行完善。

步驟 1:句子分割

流水線的第一步是把文本拆分成單獨(dú)的句子,像這樣:

  • 「?jìng)惗厥怯⒏裉m的首都同時(shí)也是英國(guó)人口最多的城市。」
  • 「位于大不列顛島東南部的泰晤士河流域的倫敦是兩千年以來的主要人類定居點(diǎn)?!?/li>
  • 「由羅馬人建立,取名為倫蒂尼恩 (Londinium)?!?/li>

我們可以假設(shè)英語(yǔ)中的每個(gè)句子都表達(dá)了一個(gè)獨(dú)立的思想或想法。編寫一個(gè)程序來理解一個(gè)句子比理解整個(gè)段落要容易得多。

編碼一個(gè)句子分割模型可以很簡(jiǎn)單地在任何看到標(biāo)點(diǎn)符號(hào)的時(shí)候拆分句子。但是,現(xiàn)代 NLP 流水線通常使用更為復(fù)雜的技術(shù),以應(yīng)對(duì)那些沒有被格式化干凈的文件。

步驟 2:詞匯標(biāo)記化

現(xiàn)在我們已經(jīng)把文檔分割成句子,我們可以一次處理一個(gè)。讓我們從文檔中的第一句話開始:

「London is the capital and most populous city of England and the United Kingdom.」

我們的下一步是把這個(gè)句子分成不同的單詞或標(biāo)記,這叫做標(biāo)記化,下面是標(biāo)記化后的結(jié)果:

「London」,「is」,「the」,「capital」,「and」,「most」,「populous」,「city」,「of」,「England」,「and」,「the」,「United」,「Kingdom」,「.」

英語(yǔ)中的標(biāo)記化是很容易做到的。只要它們之間有空格,我們就把它們分開。我們也將標(biāo)點(diǎn)符號(hào)當(dāng)作單獨(dú)的記號(hào)來對(duì)待,因?yàn)闃?biāo)點(diǎn)也是有意義的。

步驟 3:預(yù)測(cè)每個(gè)標(biāo)記的詞性

接下來,我們來看看每一個(gè)標(biāo)記,并嘗試猜測(cè)它的詞類:名詞,動(dòng)詞,形容詞等等。知道每個(gè)單詞在句子中的作用將幫助我們弄清楚句子的意思。

我們可以把每個(gè)單詞(和它周圍的一些額外的單詞用于上下文)輸入預(yù)先訓(xùn)練的詞性分類模型:

分類模型

詞性模型最初是通過給它提供數(shù)以百萬(wàn)計(jì)的英語(yǔ)句子來訓(xùn)練的,每一個(gè)單詞的詞性都已經(jīng)標(biāo)注出來,并讓它學(xué)會(huì)復(fù)制這種行為。

需要注意的是,這個(gè)模型完全是基于統(tǒng)計(jì)數(shù)據(jù)的,它并沒有真正理解單詞的意思(如人類所思考的一樣)。它只知道如何根據(jù)相似的句子和單詞來猜測(cè)詞性。

在處理完整個(gè)句子之后,我們將得到這樣的結(jié)果:

分類模型

有了這些信息,我們就可以開始獲取一些非?;镜囊馑剂?。例如,我們可以看到句子中的名詞包括「?jìng)惗亍购汀甘锥肌?,所以這個(gè)句子很可能說的的是關(guān)于倫敦。

步驟 4:文本詞形還原

在英語(yǔ)(和大多數(shù)語(yǔ)言)中,單詞以不同的形式出現(xiàn)??催@兩個(gè)句子:

  • I had a pony.
  • I had two ponies.

兩個(gè)句子都是在討論一個(gè)名詞 - 小馬(pony),但它們分別使用了不同的詞形變化 (一個(gè)單數(shù)形式,一個(gè)復(fù)數(shù)形式)。當(dāng)在計(jì)算機(jī)中處理文本時(shí),了解每個(gè)單詞的基本形式是有幫助的,這樣你才知道這兩個(gè)句子都在討論同一個(gè)概念。否則,對(duì)計(jì)算機(jī)來說字串「pony」和「ponies」看起來就像兩個(gè)完全不同的詞匯。

在 NLP 中,我們把這個(gè)過程稱為詞形還原——找出句子中每個(gè)單詞的最基本的形式或詞條。

同樣也適用于動(dòng)詞。我們也可以通過找到它們的詞根,通過詞形還原來將動(dòng)詞轉(zhuǎn)換成非結(jié)合格式。所以「I had two ponies.」變成「I [have] two [pony].」

詞形還原通常是通過基于詞性的詞條形式的查找表來完成的,并且可能通過一些自定義規(guī)則來處理一些你從未見過的單詞。

下面是詞形還原加上動(dòng)詞的詞根形式后,我們的句子變成如下:

我們唯一的改變是把「is」變成「be」。

步驟 5:識(shí)別停止詞

接下來,我們要考慮句子中每個(gè)詞的重要性。英語(yǔ)有很多填充詞,它們經(jīng)常出現(xiàn),如「and」、「the」和「a」。當(dāng)對(duì)文本進(jìn)行統(tǒng)計(jì)時(shí),這些詞引入了大量的噪聲,因?yàn)樗鼈儽绕渌~更頻繁地出現(xiàn)。一些 NLP 流水線將它們標(biāo)記為「停止詞」,也就是說,在進(jìn)行任何統(tǒng)計(jì)分析之前,這可能是你想要過濾掉的單詞。

下面是我們將停止詞變成灰色后的句子:

停止詞通常通過檢查已知的停止詞的硬編碼列表來識(shí)別。但是沒有適用于所有應(yīng)用程序的停止詞的標(biāo)準(zhǔn)列表。要忽略的單詞列表可以根據(jù)應(yīng)用程序而變化。

例如,如果你正在建造一個(gè)搖滾樂隊(duì)搜索引擎,你要確保你不忽略「The」這個(gè)詞。因?yàn)檫@個(gè)詞出現(xiàn)在很多樂隊(duì)的名字中,還有一個(gè)著名的 1980 搖滾樂隊(duì)叫做「The The」!

步驟 6a:依賴解析

下一步是弄清楚我們句子中的所有單詞是如何相互關(guān)聯(lián)的,這叫做依賴解析。

我們的目標(biāo)是構(gòu)建一棵樹,它給句子中的每個(gè)單詞分配一個(gè)單一的父詞。樹的根結(jié)點(diǎn)是句子中的主要?jiǎng)釉~。下面是我們的句子的解析樹一開始的樣子:

依賴解析

但我們可以更進(jìn)一步。除了識(shí)別每個(gè)單詞的父詞外,我們還可以預(yù)測(cè)兩個(gè)詞之間存在的關(guān)系類型:

依賴解析

這棵解析樹告訴我們,句子的主語(yǔ)是名詞「London」,它與「capital」有「be」關(guān)系。我們終于知道了一些有用的東西——倫敦是一個(gè)首都!如果我們遵循完整的解析樹的句子(除上方所示),我們甚至?xí)l(fā)現(xiàn),倫敦是英國(guó)的首都。

就像我們先前使用機(jī)器學(xué)習(xí)模型預(yù)測(cè)詞性一樣,依賴解析也可以通過將單詞輸入機(jī)器學(xué)習(xí)模型并輸出結(jié)果來工作。但是解析單詞的依賴項(xiàng)是一項(xiàng)特別復(fù)雜的任務(wù),需要一篇完整的文章來詳細(xì)說明。如果你想知道它是如何工作的,一個(gè)很好的開始閱讀的地方是 Matthew Honnibal 的優(yōu)秀文章「Parsing English in 500 Lines of Python」。

但是,盡管作者在 2015 的一篇文章中說這種方法在現(xiàn)在是標(biāo)準(zhǔn)的,但它實(shí)際上已經(jīng)過時(shí)了,甚至不再被作者使用。在 2016,谷歌發(fā)布了一個(gè)新的依賴性分析器,稱為 Parsey McParseface,它使用了一種新的深度學(xué)習(xí)方法并超越了以前的基準(zhǔn),它迅速地遍及整個(gè)行業(yè)。一年后,他們發(fā)布了一種新的叫做 ParseySaurus 的模型,它改進(jìn)了更多的東西。換句話說,解析技術(shù)仍然是一個(gè)活躍的研究領(lǐng)域,在不斷地變化和改進(jìn)。

同樣需要記住的是,很多英語(yǔ)句子都是模棱兩可的,難以解析的。在這種情況下,模型將根據(jù)該句子的解析版本進(jìn)行猜測(cè),但它并不完美,有時(shí)該模型將導(dǎo)致令人尷尬的錯(cuò)誤。但隨著時(shí)間的推移,我們的 NLP 模型將繼續(xù)以更好的方式解析文本。

步驟 6b:尋找名詞短語(yǔ)

到目前為止,我們把句子中的每個(gè)詞都看作是獨(dú)立的實(shí)體。但是有時(shí)候把代表一個(gè)想法或事物的單詞組合在一起更有意義。我們可以使用依賴解析樹中的相關(guān)信息自動(dòng)將所有討論同一事物的單詞組合在一起。

例如:

我們可以將名詞短語(yǔ)組合以產(chǎn)生下方的形式:

將名詞短語(yǔ)組合以產(chǎn)生下方的形式

我們是否做這一步取決于我們的最終目標(biāo)。如果我們不需要更多的細(xì)節(jié)來描述哪些詞是形容詞,而是想更多地關(guān)注提取完整的想法,那么這是一種快速而簡(jiǎn)單的方法。

步驟 7:命名實(shí)體識(shí)別(NER)

現(xiàn)在我們已經(jīng)完成所有困難的工作,終于可以超越小學(xué)語(yǔ)法,開始真正地提取想法。

在我們的句子中,我們有下列名詞:

這些名詞中有一些是真實(shí)存在的。例如,「London 倫敦」、「England 英格蘭」和「United Kingdom 英國(guó)」代表地圖上的物理位置。很高興能檢測(cè)到這一點(diǎn)!利用這些信息,我們可以使用 NLP 自動(dòng)提取到文檔中提到的真實(shí)世界地名的列表。

命名實(shí)體識(shí)別(NER)的目標(biāo)是用它們所代表的真實(shí)世界的概念來檢測(cè)和標(biāo)記這些名詞。以下是我們?cè)谑褂?NER 標(biāo)簽?zāi)P瓦\(yùn)行每個(gè)標(biāo)簽之后的句子:

但是 NER 系統(tǒng)不僅僅是簡(jiǎn)單的字典查找。相反,他們使用的是一個(gè)單詞如何出現(xiàn)在句子中的上下文和一個(gè)統(tǒng)計(jì)模型來猜測(cè)單詞代表的是哪種類型的名詞。一個(gè)好的 NER 系統(tǒng)可以通過上下文線索來區(qū)分「Brooklyn Decker」這個(gè)人名和「Brooklyn」這個(gè)位置。

下面是一些典型的 NER 系統(tǒng)可以標(biāo)記的對(duì)象類型:

  • 人名
  • 公司名稱
  • 地理位置(物理和政治)
  • 產(chǎn)品名稱
  • 日期與時(shí)間
  • 金錢數(shù)量
  • 事件名稱

NER 有大量的用途,因?yàn)樗梢院苋菀椎貜奈谋局蝎@取結(jié)構(gòu)化數(shù)據(jù)。這是從 NLP 流水線中快速獲取有價(jià)值信息的最簡(jiǎn)單方法之一。

步驟 8:共指解析

到此,我們對(duì)句子已經(jīng)有了一個(gè)很好的表述。我們知道每個(gè)單詞的詞性、單詞如何相互關(guān)聯(lián)、哪些詞在談?wù)撁麑?shí)體。

然而,我們還有一個(gè)大問題。英語(yǔ)里充滿了人稱代詞,比如他、她,還有它。這些是我們使用的快捷表述方法,而不需要在每個(gè)句子中一遍又一遍地寫名字。人類可以根據(jù)上下文來記錄這些詞所代表的內(nèi)容。但是我們的 NLP 模型不知道人稱代詞是什么意思,因?yàn)樗淮沃粰z查一個(gè)句子。

讓我們看看文檔中的第三句話:

「It was founded by the Romans, who named it Londinium.」

如果我們用 NLP 流水線來解析這個(gè)句子,我們就會(huì)知道「it」是由羅馬人建立的。但知道「London」是由羅馬人建立的則更為有用。

人類閱讀這個(gè)句子時(shí),可以很容易地理解「it」的意思是「London」。共指解析的目的是通過追蹤句子中的代詞來找出相同的映射。我們想找出所有提到同一個(gè)實(shí)體的單詞。

下面是我們的文檔中對(duì)「London」一詞的共指解析的結(jié)果:

利用共指信息與解析樹和命名實(shí)體信息相結(jié)合,我們可以從文檔中提取大量信息。

共指解析是 NLP 流水線實(shí)現(xiàn)中最困難的步驟之一。這比句子分析更困難。深度學(xué)習(xí)的最新進(jìn)展研究出了更精確的新方法,但還不完善。如果您想了解更多關(guān)于它是如何工作的,請(qǐng)查看:https://explosion.ai/demos/displacy-ent。

四、NLP 流水線的 PYTHON 實(shí)現(xiàn)

下面是我們完整的 NLP 流水線的概述:

完整的 NLP 流水線的概述

共指解析是一個(gè)不一定要完成的可選步驟。

喲,看起來有好多步驟!

注意:在我們繼續(xù)之前,值得一提的是,這些是典型的 NLP 流水線中的步驟,但是您可以將跳過某些步驟或重新排序步驟,這取決于您想做什么以及如何實(shí)現(xiàn) NLP 庫(kù)。例如,像 spaCy 這樣的一些庫(kù)是在使用依賴性解析的結(jié)果后才在流水線中進(jìn)行句子分割。

那么,我們應(yīng)該如何對(duì)這個(gè)流水線進(jìn)行編碼呢?感謝像 spaCy 這樣神奇的 Python 庫(kù),它已經(jīng)完成了!這些步驟都是編碼過的,可以隨時(shí)使用。

首先,假設(shè)已經(jīng)安裝了 Python 3,可以這樣安裝 spaCy:

  1. # Install spaCy  
  2. pip3 install -U spacy 
  3.  
  4. # Download the large English model for spaCy 
  5. python3 -m spacy download en_core_web_lg 
  6.  
  7. # Install textacy which will also be useful 
  8. pip3 install -U textacy 

然后,在一段文本上運(yùn)行 NLP 流水線的代碼看起來如下:

  1. import spacy 
  2.  
  3. # Load the large English NLP model 
  4. nlp = spacy.load('en_core_web_lg') 
  5.  
  6. # The text we want to examine 
  7. text = """London is the capital and most populous city of England and  
  8. the United Kingdom.  Standing on the River Thames in the south east  
  9. of the island of Great Britain, London has been a major settlement  
  10. for two millennia. It was founded by the Romans, who named it Londinium. 
  11. """ 
  12.  
  13. # Parse the text with spaCy. This runs the entire pipeline. 
  14. doc = nlp(text) 
  15.  
  16. # 'doc' now contains a parsed version of text. We can use it to do anything we want! 
  17. # For example, this will print out all the named entities that were detected: 
  18. for entity in doc.ents: 
  19.     print(f"{entity.text} ({entity.label_})") 

如果你運(yùn)行到 z 這里,你將得到一個(gè)在我們的文檔中檢測(cè)到的命名實(shí)體和實(shí)體類型的列表:

  1. London (GPE) 
  2. England (GPE) 
  3. the United Kingdom (GPE) 
  4. the River Thames (FAC) 
  5. Great Britain (GPE) 
  6. London (GPE) 
  7. two millennia (DATE) 
  8. Romans (NORP) 
  9. Londinium (PERSON) 

您可以在這里查找這些代碼:https://spacy.io/usage/linguistic-features#entity-types。

注意它在「Londinium」上犯了一個(gè)錯(cuò)誤,認(rèn)為它是一個(gè)人的名字而不是一個(gè)地方。這可能是因?yàn)樵谟?xùn)練數(shù)據(jù)集中沒有類似的東西,所以它做了最好的猜測(cè)。命名實(shí)體檢測(cè)通常需要一小段模型微調(diào)(https://spacy.io/usage/training#section-ner),如果您正在解析具有獨(dú)特或?qū)S眯g(shù)語(yǔ)的文本。

讓我們來檢測(cè)實(shí)體并使用它來建立一個(gè)數(shù)據(jù)洗滌器。假設(shè)你正試圖遵守新的 GDPR 隱私規(guī)則

(https://medium.com/@ageitgey/understand-the-gdpr-in-10-minutes-407f4b54111f),并且你發(fā)現(xiàn)你有數(shù)以千計(jì)的文件,其中包含有個(gè)人可識(shí)別的信息,比如人的名字。你接到了移除文檔中所有名字的任務(wù)。

通過數(shù)以千計(jì)的文件去搜尋并刪除所有的名字,人工可能需要幾年。但是使用 NLP,這是很容易實(shí)現(xiàn)的。這里有一個(gè)簡(jiǎn)單的洗滌器,去除它檢測(cè)到的所有名字:

  1. import spacy 
  2.  
  3. # Load the large English NLP model 
  4. nlp = spacy.load('en_core_web_lg') 
  5.  
  6. # Replace a token with "REDACTED" if it is a name 
  7. def replace_name_with_placeholder(token): 
  8.     if token.ent_iob != 0 and token.ent_type_ == "PERSON": 
  9.         return "[REDACTED] " 
  10.     else: 
  11.         return token.string 
  12.  
  13. # Loop through all the entities in a document and check if they are names 
  14. def scrub(text): 
  15.     doc = nlp(text) 
  16.     for ent in doc.ents: 
  17.         ent.merge() 
  18.     tokens = map(replace_name_with_placeholder, doc) 
  19.     return "".join(tokens) 
  20.  
  21. s = ""
  22. In 1950, Alan Turing published his famous article "Computing Machinery and Intelligence". In 1957, Noam Chomsky’s  
  23. Syntactic Structures revolutionized Linguistics with 'universal grammar', a rule based system of syntactic structures. 
  24. """ 
  25.  
  26. print(scrub(s)) 

如果你運(yùn)行它,你會(huì)發(fā)現(xiàn)它的結(jié)果是符合你的預(yù)期的:

  1. In 1950, [REDACTED] published his famous article "Computing Machinery and Intelligence". In 1957, [REDACTED]  
  2. Syntactic Structures revolutionized Linguistics with 'universal grammar', a rule based system of syntactic structures. 

五、提取事實(shí)

你能用 spaCy 做的事情是非常多的。但是,您也可以使用 spaCy 解析的輸出作為更復(fù)雜的數(shù)據(jù)提取算法的輸入。有一個(gè) Python 庫(kù)叫做 textacy,它在 spaCy 之上實(shí)現(xiàn)了幾種常見的數(shù)據(jù)抽取算法。這是一個(gè)很好的起點(diǎn)。

它實(shí)現(xiàn)的一種算法被稱為半結(jié)構(gòu)化語(yǔ)句提取。我們可以用它來搜索解析樹,用于簡(jiǎn)單的語(yǔ)句,其中主語(yǔ)是「London」,動(dòng)詞是「be」的形式。這將有助于我們找到有關(guān)倫敦的事實(shí)。

以下是它的代碼實(shí)現(xiàn):

  1. import spacy 
  2. import textacy.extract 
  3.  
  4. # Load the large English NLP model 
  5. nlp = spacy.load('en_core_web_lg') 
  6.  
  7. # The text we want to examine 
  8. text = """London is the capital and most populous city of England and  the United Kingdom.   
  9. Standing on the River Thames in the south east of the island of Great Britain,  
  10. London has been a major settlement  for two millennia.  It was founded by the Romans,  
  11. who named it Londinium. 
  12. """ 
  13.  
  14. # Parse the document with spaCy 
  15. doc = nlp(text) 
  16.  
  17. # Extract semi-structured statements 
  18. statements = textacy.extract.semistructured_statements(doc, "London") 
  19.  
  20. # Print the results 
  21. print("Here are the things I know about London:") 
  22.  
  23. for statement in statements: 
  24.     subject, verb, fact = statement 
  25.     print(f" - {fact}") 

結(jié)果如下:

  1. Here are the things I know about London: 
  2.  - the capital and most populous city of England and the United Kingdom. 
  3. - a major settlement for two millennia. 

也許這不太令人印象深刻。但是如果你在整個(gè)倫敦維基百科的文章文本上運(yùn)行相同的代碼而不僅僅是三個(gè)句子,你會(huì)得到更令人印象深刻的結(jié)果:

  1. Here are the things I know about London: 
  2.  - the capital and most populous city of England and the United Kingdom 
  3.  - a major settlement for two millennia 
  4.  - the world's most populous city from around 1831 to 1925 
  5.  - beyond all comparison the largest town in England 
  6.  - still very compact 
  7.  - the world's largest city from about 1831 to 1925 
  8.  - the seat of the Government of the United Kingdom 
  9.  - vulnerable to flooding 
  10.  - "one of the World's Greenest Cities" with more than 40 percent green space or open water 
  11.  - the most populous city and metropolitan area of the European Union and the second most populous in Europe 
  12.  - the 19th largest city and the 18th largest metropolitan region in the world 
  13.  - Christian, and has a large number of churches, particularly in the City of London 
  14.  - also home to sizeable Muslim, Hindu, Sikh, and Jewish communities 
  15.  - also home to 42 Hindu temples 
  16.  - the world's most expensive office market for the last three years according to world property journal (2015) report 
  17.  - one of the pre-eminent financial centres of the world as the most important location for international finance 
  18.  - the world top city destination as ranked by TripAdvisor users 
  19.  - a major international air transport hub with the busiest city airspace in the world 
  20.  - the centre of the National Rail network, with 70 percent of rail journeys starting or ending in London 
  21.  - a major global centre of higher education teaching and research and has the largest concentration of higher education institutes in Europe 
  22.  - home to designers Vivienne Westwood, Galliano, Stella McCartney, Manolo Blahnik, and Jimmy Choo, among others 
  23.  - the setting for many works of literature 
  24.  - a major centre for television production, with studios including BBC Television Centre, The Fountain Studios and The London Studios 
  25.  - also a centre for urban music 
  26.  - the "greenest city" in Europe with 35,000 acres of public parks, woodlands and gardens 
  27.  - not the capital of England, as England does not have its own government 

現(xiàn)在事情正在變得更加趣了!這是我們自動(dòng)收集的大量信息。

要獲得額外的支持,請(qǐng)嘗試安裝 neuralcoref 庫(kù),并將 Coreference 解析添加到流水線中。這會(huì)讓你得到更多的事實(shí),因?yàn)樗鼤?huì)抓住談?wù)摗竔t」而不是直接提及「London」的句子。

六、我們還能做些什么呢?

通過瀏覽 spaCy 文檔和 textacy 文檔,你可以看到許多可以用解析文本處理的示例。到目前為止,我們看到的只是一個(gè)小型示例。

下面是另一個(gè)實(shí)際例子:假設(shè)你正在構(gòu)建一個(gè)網(wǎng)站,讓用戶使用最后一個(gè)例子中提取的信息查看世界上每一個(gè)城市的信息。

如果你在網(wǎng)站上有一個(gè)搜索功能,那么可以自動(dòng)完成像谷歌這樣的普通搜索查詢:

Google‘s autocomplete suggestions for「London」

谷歌對(duì)「London」的自我完善的建議

但是要做到這一點(diǎn),我們需要一個(gè)可能的完善建議的列表來向用戶提出建議。我們可以使用 NLP 來快速生成這些數(shù)據(jù)。

下面是從文檔中提取頻繁提到的名詞塊的一種方法:

  1. import spacy 
  2. import textacy.extract 
  3.  
  4. # Load the large English NLP model 
  5. nlp = spacy.load('en_core_web_lg') 
  6.  
  7. # The text we want to examine 
  8. text = """London is [.. shortened for space ..]""" 
  9.  
  10. # Parse the document with spaCy 
  11. doc = nlp(text) 
  12.  
  13. # Extract noun chunks that appear 
  14. noun_chunks = textacy.extract.noun_chunks(doc, min_freq=3
  15.  
  16. # Convert noun chunks to lowercase strings 
  17. noun_chunks = map(str, noun_chunks) 
  18. noun_chunks = map(str.lower, noun_chunks) 
  19.  
  20. # Print out any nouns that are at least 2 words long 
  21. for noun_chunk in set(noun_chunks): 
  22.     if len(noun_chunk.split(" ")) > 1: 
  23.         print(noun_chunk) 

如果你在倫敦維基百科的文章上運(yùn)行,你會(huì)得到這樣的輸出:

  1. westminster abbey 
  2. natural history museum 
  3. west end 
  4. east end 
  5. st paul's cathedral 
  6. royal albert hall 
  7. london underground 
  8. great fire 
  9. british museum 
  10. london eye 
  11. .... etc .... 

七、深入探討

這只是一個(gè)微小的嘗試,讓你去理解可以用 NLP 做什么。在以后的文章中,我們將討論 NLP 的其他應(yīng)用,如文本分類以及 Amazon Alexa 等系統(tǒng)如何解析問題。

但在此之前,先安裝 spaCy(https://spacy.io/)并開始去使用它!可能你不是一個(gè) Python 用戶,也可能你最終使用是一個(gè)不同的 NLP 庫(kù),但這些想法都應(yīng)該是大致相同。

原文鏈接:

https://medium.com/@ageitgey/natural-language-processing-is-fun-9a0bff37854e

【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)文章,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-01-19 21:08:33

iOS路由構(gòu)建

2017-12-25 11:50:57

LinuxArch Linux

2019-04-01 10:15:02

2018-07-13 15:36:52

2018-06-11 15:30:12

2024-08-30 08:30:29

CPU操作系統(tǒng)寄存器

2024-09-30 09:56:59

2024-08-06 09:29:54

程序機(jī)器指令字符串

2009-12-18 16:35:56

如何查找局域網(wǎng)發(fā)生的故

2019-03-05 14:09:27

Docker存儲(chǔ)容器

2019-07-09 15:23:22

Docker存儲(chǔ)驅(qū)動(dòng)

2018-12-24 10:04:06

Docker存儲(chǔ)驅(qū)動(dòng)

2025-04-03 01:45:00

2025-03-28 09:39:15

CPU指令信號(hào)

2010-08-10 11:31:36

路由器配置NAT

2009-04-15 09:29:07

2009-08-14 11:35:01

Scala Actor

2010-08-12 10:02:16

路由器NAT

2025-04-30 04:20:00

操作系統(tǒng)虛擬內(nèi)存

2010-03-04 16:28:17

Android核心代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩欧美视频在线 | 欧美日韩精品影院 | 国产精品久久久久久久久久三级 | 亚洲欧美日韩精品久久亚洲区 | 伊人久久一区二区 | 亚洲精品国产成人 | 美女视频.| 国产高清在线精品 | 91爱爱·com | 精品久久久久一区 | 黄色片免费在线观看 | 欧美激情精品久久久久久变态 | 日韩中文字幕在线不卡 | 欧美乱淫视频 | 色综合久 | 欧美精品v国产精品v日韩精品 | 一级毛片观看 | 成人午夜高清 | 亚洲成人免费视频 | 亚洲一区二区电影在线观看 | caoporn国产| 久久伊人一区二区 | 先锋资源在线 | 成人精品鲁一区一区二区 | 青青久在线视频 | 国产午夜精品视频 | 成人黄色av网站 | 一本色道精品久久一区二区三区 | 91精品久久久 | 久久一二区 | 成人中文字幕在线观看 | 午夜精品久久久久久久久久久久久 | 国产中文字幕网 | 亚洲永久入口 | 91亚洲国产成人久久精品网站 | 99reav| 一区二区在线不卡 | 国产乱码精品1区2区3区 | 天天天操 | 国产乱码精品1区2区3区 | 欧美一区二区三区四区在线 |