用Python構建NLP Pipeline,從思路到具體代碼,這篇文章一次性都講到了

面向用戶:對NLP感興趣,想學習處理問題思路並通過實例代碼練手

閱讀時長:全文大約 2000 字,讀完可能需要下面這首歌的時間

授人以魚不如授人以漁,今天的文章由作者Adam Geitgey授權在人工智能頭條翻譯發佈。不僅給出了具體代碼,還一步步詳細解析了實現原理和思路。正所謂有了思路,無論是做英語、漢語的語言處理,纔算的上有了指導意義。

Adam Geitgey畢業於佐治亞理工學院,曾在團購網站Groupon擔任軟件工程師總監。目前是軟件工程和機器學習顧問,課程作者,Linkedin Learning的合作講師。

計算機是如何理解人類語言的?

讓機器理解人類語言,是一件非常困難的事情。計算機的專長在處理結構化數據,但人類語言是非常複雜的,碎片化,鬆散,甚至不合邏輯、心口不一。

既然直男不能明白爲什麼女朋友會生氣,那計算機當然無法理解A叫B爲孫子的時候,是在喊親戚、罵街,或只是朋友間的玩笑。

面對人類,計算機相當於是金剛隕石直男。

正是由於人工智能技術的發展,不斷讓我們相信,計算機總有一天可以聽懂人類表達,甚至像真人一樣和人溝通。那麼,就讓我們開始這算美好的教程吧。


創建一個NLP Pipeline

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. 倫敦,是英國的首都,人口居全國之首。位於大不列顛島東南方泰晤士河流域,在此後兩個世紀內爲這一地區最重要的定居點之一。它於公元50年由羅馬人建立,取名爲倫蒂尼恩。 -- 維基百科

Step 1:斷句(句子切分)

上面介紹倫敦的一段話,可以切分成3個句子:

  1. 倫敦是大不列顛的首都,人口居全國之首(London is the capital and most populous city of England and the United Kingdom)
  2. 位於泰晤士河流域(Standing on the River Thames in the south east of the island of Great Britain, London has been a major settlement for two millennia)
  3. 它於公元50年由羅馬人建立,取名爲倫蒂尼恩(It was founded by the Romans, who named it Londinium)

Step 2:分詞

由於中文的分詞邏輯和英文有所不同,所以這裏就直接使用原文了。接下來我們一句一句的處理。首先第一句:

“London”, “is”, “ the”, “capital”, “and”, “most”, “populous”, “city”, “of”, “England”, “and”, “the”, “United”, “Kingdom”, “.”

英文的分詞相對簡單一些,兩個空格之間可以看做一個詞(word),標點符號也有含義,所以把標點符號也看做一個詞。

Step 3:區分單詞的角色

我們需要區分出一個詞在句子中的角色,是名詞?動詞?還是介詞。我們使用一個預先經過幾百萬英文句子訓練、被調教好的詞性標註(POS: Part Of Speech)分類模型:

這裏有一點一定要記住:模型只是基於統計結果給詞打上標籤,它並不瞭解一個詞的真實含義,這一點和人類對詞語的理解方式是完全不同的。

處理結果:

可以看到。我們等到的信息中,名詞有兩個,分別是倫敦首都。倫敦是個獨特的名稱,首都是個通用的稱謂,因此我們就可以判斷,這句話很可能是在圍繞倫敦這個詞說事兒。

Step 4: 文本詞形還原

很多基於字母拼寫的語言,像英語、法語、德語等,都會有一些詞形的變化,比如單複數變化、時態變化等。比如:

  1. I had a pony(我有過一匹矮馬)
  2. I have two ponies (我有兩匹矮馬)

其實兩個句子的關鍵點都是矮馬pony。Ponies和pony、had和have只是同一個詞的不同詞形,計算機因爲並不知道其中的含義,所以在它眼裏都是完全不一樣的東西,

讓計算機明白這個道理的過程,就叫做詞形還原。對之前有關倫敦介紹的第一句話進行詞形還原後,得到下圖

Step 5:識別停用詞

停用詞:在信息檢索中,爲節省存儲空間和提高搜索效率,在處理自然語言數據(或文本)之前或之後會自動過濾掉某些字或詞,這些字或詞即被稱爲Stop Words(停用詞)。這些停用詞都是人工輸入、非自動化生成的,生成後的停用詞會形成一個停用詞表。但是,並沒有一個明確的停用詞表能夠適用於所有的工具。甚至有一些工具是明確地避免使用停用詞來支持短語搜索的。 -- 維基百科

還是來看第一句話:

其中灰色的字,僅僅是起到銜接和輔助表述的作用。他們的存在,對計算機來說更多是噪音。所以我們需要把這些詞識別出來。

正如維基所說,現在雖然停用詞列表很多,但一定要根據實際情況進行配置。比如英語的the,通常情況是停用詞,但很多樂隊名字裏有the這個詞,The Doors, The Who,甚至有個樂隊直接就叫The The!這個時候就不能看做是停用詞了。

Step 6:解析依賴關係

解析句子中每個詞之間的依賴關係,最終建立起一個關係依賴樹。這個數的root是關鍵動詞,從這個關鍵動詞開始,把整個句子中的詞都聯繫起來。

從這個關係樹來看,主語是London,它和capital被be聯繫起來。然後計算機就知道,London is a capital。如此類推,我們的計算機就被訓練的掌握越來越多的信息。

但因爲人類語言的歧義性,這個模型依然無法適應所有場景。但是隨着我們給他更多的訓練,我們的NLP模型會不斷提高準確性。Demo地址

https://explosion.ai/demos/displacy?utm_source=AiHl0

我們還可以選擇把相關的詞進行合併分組,例如把名詞以及修飾它的形容詞合併成一個詞組短語。不過這一步工作不是必須要有的,視具體情況而定。

Step 7:命名實體識別

經過以上的工作,接下來我們就可以直接使用現有的命名實體識別(NER: Named Entity Recognition)系統,來給名詞打標籤。比如我們可以把第一句話當中的地理名稱識別出來:

大家也可以通過下面的鏈接,在線體驗一下。隨便複製粘貼一段英文,他會自動識別出裏面包含哪些類別的名詞:

https://explosion.ai/demos/displacy-ent?utm_source=AiHl0

Step 8:共指消解

人類的語言很複雜,但在使用過程中卻是傾向於簡化和省略的。比如他,它,這個,那個,前者,後者…這種指代的詞,再比如縮寫簡稱,北京大學通常稱爲北大,中華人民共和國通常就叫中國。這種現象,被稱爲共指現象。

在特定語境下人類可以毫不費力的區別出它這個字,到底指的是牛,還是手機。但是計算機需要通過共指消解才能知道下面這句話

它於公元50年由羅馬人建立,取名爲倫蒂尼恩

中的它,指的是倫敦,而不是羅馬,不是羅紋,更不是蘿蔔。

共指消解相對而言是我們此次創建NLP Pipeline所有環節中,最難的部分。

Coding

好了。思路終於講完了。接下來就是Coding的部分。首先我們理一下思路

提示:上述步驟只是標準流程,實際工作中需要根據項目具體的需求和條件,合理安排順序。

安裝spaCy

我們默認你已經安裝了Python 3。如果沒有的話,你知道該怎麼做。接下來是安裝spaCy:

安裝好以後,使用下面代碼

結果如下

  1. GPE:地理位置、地名
  2. FAC:設施、建築
  3. DATE:日期
  4. NORP:國家、地區
  5. PERSON:人名

我們看到,因爲Londinium這個地名不夠常見,所以spaCy就做了一個大膽的猜測,猜這可能是個人名。

我們接下來進一步,構建一個數據清理器。假設你拿到了一份全國酒店入住人員登記表,你想把裏面的人名找出來替換掉,而不改動酒店名、地名等名詞,可以這樣做:

把所有標註爲[PERSON]的詞都替換成REDACTED。最終結果

提取詳細信息

利用spaCy識別並定位的名詞,然後利用textacy就可以把一整篇文章的信息都提取出來。我們在wiki上覆制整篇介紹倫敦的內容到以下代碼

你會得到如下結果

我們獲得了這麼多有用的信息,就可以應用在很多場景下。比如,搜索結果的相關推薦:

我們可以通過下面這種方法實現上圖的效果


因爲公衆號的限制,我們把代碼做成了圖片。如果你想看純文本的代碼,複製下面鏈接到瀏覽器打開

http://t.cn/RgCITGj?utm_source=AiHl0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章