NLP是如何工作的:把自然語言(儘可能)結構化

1)計算機非常擅長使用結構化資料,例如電子表格和資料庫表。世界上很多資訊是非結構化的——例如英語或其他人類語言中的原始文字。

2)閱讀和理解英語的過程是非常複雜的,這個過程甚至沒有包括考慮到英語有時並不遵循邏輯和一致的規則。在機器學習中做任何複雜的事情通常意味著需要建立一條流水線 (pipeline)。這個想法是把你的問題分解成非常小的部分,然後用機器學習來分別解決每個部分,最後透過把幾個互相饋送結果的機器學習模型連線起來,這樣你就可以解決非常複雜的問題。這正是我們要運用在 NLP 上的策略。我們將把理解英語的過程分解成小塊,然後看看每個小塊是如何工作的。

3)建立NLP流水線

step 1:句子分割。假設英語中的每個句子都表達了一個獨立的思想或想法。編寫一個程式來理解一個句子比理解整個段落要容易得多。編碼一個句子分割模型可以很簡單地在任何看到標點符號的時候拆分句子。但是,現代 NLP 流水線通常使用更為複雜的技術,以應對那些沒有被格式化乾淨的檔案。

step 2:詞彙標記化。把文件分割成句子,再把這個句子分成不同的單詞或標記(標記化)。英語中的標記化是很容易做到的。只要它們之間有空格,我們就把它們分開。我們也將標點符號當作單獨的記號來對待,因為標點也是有意義的。

step 3:預測每個標記的詞性。看每一個標記,並嘗試猜測它的詞類:名詞,動詞,形容詞等等。知道每個單詞在句子中的作用將幫助我們弄清楚句子的意思。把每個單詞(和它周圍的一些額外的單詞用於上下文)輸入預先訓練的詞性分類模型:

NLP是如何工作的:把自然語言(儘可能)結構化

詞性模型最初是透過給它提供數以百萬計的英語句子來訓練的,每一個單詞的詞性都已經標註出來,並讓它學會複製這種行為。需要注意的是,這個模型完全是基於統計資料的,它並沒有真正理解單詞的意思(如人類所思考的一樣)。它只知道如何根據相似的句子和單詞來猜測詞性。在處理完整個句子之後,我們將得到這樣的結果:

NLP是如何工作的:把自然語言(儘可能)結構化

step 4:文字詞形還原。當在計算機中處理文字時,瞭解每個單詞的基本形式是有幫助的,這樣你才知道這兩個句子都在討論同一個概念。否則,對計算機來說字串「pony」和「ponies」看起來就像兩個完全不同的詞彙。在 NLP 中,我們把這個過程稱為詞形還原——找出句子中每個單詞的最基本的形式或詞條。同樣也適用於動詞。我們也可以透過找到它們的詞根,透過詞形還原來將動詞轉換成非結合格式。所以「I had two ponies。」變成「I [have] two [pony]。」詞形還原通常是透過基於詞性的詞條形式的查詢表來完成的,並且可能透過一些自定義規則來處理一些你從未見過的單詞。

step 5:識別停止詞。考慮句子中每個詞的重要性。英語有很多填充詞,它們經常出現,如「and」、「the」和「a」。當對文字進行統計時,這些詞引入了大量的噪聲,因為它們比其他詞更頻繁地出現。一些 NLP 流水線將它們標記為「停止詞」,也就是說,在進行任何統計分析之前,這可能是你想要過濾掉的單詞。下面是我們將停止詞變成灰色後的句子:

NLP是如何工作的:把自然語言(儘可能)結構化

停止詞通常透過檢查已知的停止詞的硬編碼列表來識別。但是沒有適用於所有應用程式的停止詞的標準列表。要忽略的單詞列表可以根據應用程式而變化。例如,如果你正在建造一個搖滾樂隊搜尋引擎,你要確保你不忽略「The」這個詞。因為這個詞出現在很多樂隊的名字中,還有一個著名的 1980 搖滾樂隊叫做「The The」!

step 6a:依賴分析。弄清楚我們句子中的所有單詞是如何相互關聯的,這叫做依賴解析。目標是構建一棵樹,它給句子中的每個單詞分配一個單一的父詞。樹的根結點是句子中的主要動詞。下面是我們的句子的解析樹一開始的樣子:

NLP是如何工作的:把自然語言(儘可能)結構化

更進一步。除了識別每個單詞的父詞外,我們還可以預測兩個詞之間存在的關係型別:

NLP是如何工作的:把自然語言(儘可能)結構化

這棵解析樹告訴我們,句子的主語是名詞「London」,它與「capital」有「be」關係。我們終於知道了一些有用的東西——倫敦是一個首都!如果我們遵循完整的解析樹的句子(除上方所示),我們甚至會發現,倫敦是英國的首都。

就像我們先前使用機器學習模型預測詞性一樣,依賴解析也可以透過將單詞輸入機器學習模型並輸出結果來工作。但是解析單詞的依賴項是一項特別複雜的任務,需要一篇完整的文章來詳細說明。如果你想知道它是如何工作的,一個很好的開始閱讀的地方是 Matthew Honnibal 的優秀文章「Parsing English in 500 Lines of Python」。

但是,儘管作者在 2015 的一篇文章中說這種方法在現在是標準的,但它實際上已經過時了,甚至不再被作者使用。在 2016,谷歌釋出了一個新的依賴性分析器,稱為 Parsey McParseface,它使用了一種新的深度學習方法並超越了以前的基準,它迅速地遍及整個行業。一年後,他們釋出了一種新的叫做 ParseySaurus 的模型,它改進了更多的東西。換句話說,解析技術仍然是一個活躍的研究領域,在不斷地變化和改進。

同樣需要記住的是,很多英語句子都是模稜兩可的,難以解析的。在這種情況下,模型將根據該句子的解析版本進行猜測,但它並不完美,有時該模型將導致令人尷尬的錯誤。但隨著時間的推移,我們的 NLP 模型將繼續以更好的方式解析文字。

step 6b:尋找名詞短語。到目前為止,我們把句子中的每個詞都看作是獨立的實體。但是有時候把代表一個想法或事物的單詞組合在一起更有意義。我們可以使用依賴解析樹中的相關資訊自動將所有討論同一事物的單詞組合在一起。

NLP是如何工作的:把自然語言(儘可能)結構化

我們可以將名詞短語組合以產生下方的形式:

NLP是如何工作的:把自然語言(儘可能)結構化

我們是否做這一步取決於我們的最終目標。如果我們不需要更多的細節來描述哪些詞是形容詞,而是想更多地關注提取完整的想法,那麼這是一種快速而簡單的方法。

step 7:命名實體識別(NER)。它的目標是用它們所代表的真實世界的概念來檢測和標記這些名詞。NER 系統不僅僅是簡單的字典查詢。相反,他們使用的是一個單詞如何出現在句子中的上下文和一個統計模型來猜測單詞代表的是哪種型別的名詞。一個好的 NER 系統可以透過上下文線索來區分「Brooklyn Decker」這個人名和「Brooklyn」這個位置。下面是一些典型的 NER 系統可以標記的物件型別:人名,公司名稱,地理位置(物理和政治),產品名稱,日期與時間,金錢數量,事件名稱。NER 有大量的用途,因為它可以很容易地從文字中獲取結構化資料。這是從 NLP 流水線中快速獲取有價值資訊的最簡單方法之一。

step 8:共指解析。到此,我們對句子已經有了一個很好的表述。我們知道每個單詞的詞性、單詞如何相互關聯、哪些詞在談論命名實體。然而,我們還有一個大問題。英語裡充滿了人稱代詞,比如他、她,還有它。這些是我們使用的快捷表述方法,而不需要在每個句子中一遍又一遍地寫名字。人類可以根據上下文來記錄這些詞所代表的內容。但是我們的 NLP 模型不知道人稱代詞是什麼意思,因為它一次只檢查一個句子。「It was founded by the Romans, who named it Londinium。」如果我們用 NLP 流水線來解析這個句子,我們就會知道「it」是由羅馬人建立的。但知道「London」是由羅馬人建立的則更為有用。人類閱讀這個句子時,可以很容易地理解「it」的意思是「London」。共指解析的目的是透過追蹤句子中的代詞來找出相同的對映。我們想找出所有提到同一個實體的單詞。下面是我們的文件中對「London」一詞的共指解析的結果:

NLP是如何工作的:把自然語言(儘可能)結構化

利用共指資訊與解析樹和命名實體資訊相結合,我們可以從文件中提取大量資訊。共指解析是 NLP 流水線實現中最困難的步驟之一。這比句子分析更困難。深度學習的最新進展研究出了更精確的新方法,但還不完善。

4)NLP流水線的PYTHON實現

一個完整的NLP流水線概述:

NLP是如何工作的:把自然語言(儘可能)結構化

共指解析是一個不一定要完成的步驟。

python庫:spaCy(對流水線編碼)