當前位置:
首頁 > 新聞 > 從「London」出發,8步搞定自然語言處理

從「London」出發,8步搞定自然語言處理

新智元推薦

來源:Medium

作者:Adam Geitgey

編譯:Bot、三石

【新智元導讀】自然語言處理是AI的一個子領域,從人們日常溝通所用的非結構化文本信息中提取結構化數據,以便計算機理解。本文用通俗易懂的語言深入淺出的介紹了自然語言處理,並用Python實現了幾個非常有趣的實例。

自然語言處理(NLP)是人工智慧的一個子領域,它專註於使計算機能夠理解和處理人類語言。本文會介紹NLP工作的基本機制,希望讀者能從中得到啟發。

註:本文選用的示例語言是英語。

計算機能理解語言嗎?

自計算機誕生之初,程序員們就一直在嘗試編寫能理解語言的程序。原因很簡單——人類使用語言的歷史已長達千年,如果計算機能閱讀並理解所有數據,這將大有裨益。

雖然現在計算機還不能像人類一樣真正讀懂語言,但它們確實取得了不少進展,在某些領域,使用NLP可以為事物帶來神奇的改變。通過把NLP技術應用於你自己的項目,也許你會因此節約大量時間。

更好的消息是,現在我們可以通過開源Python庫(如spaCy、textacy和neuralcoref)輕鬆訪問NLP領域的最新成果。只需幾行代碼,令人驚嘆的成果立馬實現。

從文本中提取意義很難

閱讀和理解語言是一個非常複雜的過程——它們甚至不會判斷這樣的理解是否符合邏輯和一致性。例如,下面這個新聞標題表達了什麼含義?

「Environmental regulators grill business owner over illegal coal fires.」 環境監管機構就非法燃煤一事___企業主。(grill:追問,炙烤)

監管機構是在質疑企業存在非法燃煤情況,還是在拿企業主做飯?如你所見,用計算機解析語言會讓問題變得很複雜。

在機器學習中,解決複雜任務通常意味著建立一個pipeline。它的想法是把問題分解成若干個非常小的部分,然後用機器學習去一一破解,最後,通過將這些機器學習模型拼接在一起,我們可以用它完成複雜任務。

而這正是我們在NLP中常用的策略。我們把理解語言文本這個過程分成幾個小塊,然後獨立推敲它們的具體理解方式。

逐步構建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. 倫敦是英格蘭和英國的首府,也是英國人口最多的城市。它位於大不列顛島東南部的泰晤士河畔,2000年來一直是這一地區的主要定居點之一。倫敦最初由羅馬人建立,取名為倫蒂尼恩。

這段文字包含多個有用事實,如果計算機能從中讀懂「倫敦是一座城市」「倫敦位於英格蘭」「倫敦由羅馬人建立」,那就大功告成了。但為了實現這一目標,我們首先要向計算機傳授書面語言的最基本概念,然後再謀求進一步發展。

第一步:語句分割(Sentence Segmentation)

NLP pipeline的第一步是先把文本分割成單獨的句子,如下所示:

倫敦是英格蘭和英國的首府,也是英國人口最多的城市。

它位於大不列顛島東南部的泰晤士河畔,2000年來一直是這一地區主要的定居點之一。

倫敦最初由羅馬人建立,取名為倫蒂尼恩。

我們可以假設這裡的每個句子都表示一種獨立的思想或想法,比起理解整個段落,編寫程序來理解單個句子確實會容易得多。

至於構建語句分割模型,這不是一件難事,我們可以根據標點符號確定每個句子。當然,現代NLP通常會用更複雜的技術,即便文檔內容不整潔,它還是能大致區分完整句子。

第二步:單詞詞例(Word Tokenization)

有了一個個被拆分的句子,現在我們可以對它們進行逐一處理。讓我們從第一句開始:

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

這一步的目標是把句子再分割成單獨的單詞或標點符號,分割完成後,整個句子變成了這樣:

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

英語中存在自然分界符——空格,所以對它生成詞例非常方便。只要兩個詞例之間有空格,我們就可以把它們直接分開。因為標點符號也有意義,我們要把它們視為單獨的詞例。

第三步:預測詞例詞性

接下來,我們來關注詞例的詞性:名詞、動詞、形容詞……知道每個詞語在句子中的作用有助於我們理解句子在說什麼。

要實現這一點,我們可以事先訓練一個詞性分類模型,然後把每個單詞輸入其中預測詞性:

這個模型最初是在數百萬個英語句子上訓練的,數據集中已經標明每個單詞的詞性,因此它可以學會這個「定義」的過程。但是注意一點,這個模型完全是基於統計數據的——它實際上無法像人類那樣理解單詞含義,而是只能根據「看」到過的類似句子進行猜測。

處理完整句後,我們會得到這樣的結果:

有了這些信息,我們就可以開始收集一些非常基本的含義,比如句子中的名詞包括「倫敦」「首府」,所以這句話有大概率是在談論倫敦。

第四步:文本詞形還原(Text Lemmatization)

在英語中,單詞是有不同形式的,比如:

I had a pony.

I had two ponies.

兩個句子都涉及名詞pony(小馬),但一個是單數形式,一個是複數形式。當計算機在處理文本時,如果沒有說明,它會把「pony」和「ponies」看成完全不同的對象,因此了解每個單詞的基本形式很有幫助,只有這樣,計算機才知道兩個句子在談論同一個概念。

在NLP中,我們把這種將一個任何形式的語言辭彙還原為一般形式的過程稱為詞形還原,它能找出句子中每個單詞的最基本形式。

同樣的,這也適用於英語動詞。我們可以用詞形還原找出單詞詞根,這之後,「I had two ponies」就變成了「I [have] two [pony]」。

詞形還原是通過檢索辭彙生成表格實現的,它也有可能具有一些自定義規則,可以處理人們從未見過的單詞。

以下是經還原的例句,我們做的唯一改變是把「is」變成「be」:

第五步:識別停用詞(Identifying Stop Words)

然後就是衡量句子中每個單詞的重要性。英語中有很多填充詞,比如經常出現的「and」「the」和「a」。在對文本進行統計時,這些詞會引入很多噪音,因為它們出現的頻率很高。一些NLP pipeline會將它們標記為停用詞 ——也就是說,在進行任何統計分析之前,我們可能會希望過濾掉這些詞。

下面是標灰停用詞的例句:

停用詞檢測也有一個事先準備好的列表,但它和詞形還原有區別,我們沒有適用於任何問題的標準停用詞列表,它需要具體問題具體分析。比方說,如果我們要構建一個有關搖滾樂隊的搜索引擎,那「The」這個詞千萬不能被忽略,因為它會出現在很多樂隊的名字里,20世紀80年代還有一支著名的樂隊叫「The The」。

第六步(a):依存句法分析(Dependency Parsing)

下一步是弄清楚句子中的所有單詞是如何相互關聯的,也就是依存句法分析。

我們的目標是構建一棵依存樹,其中樹根處是佔據支配地位的主要動詞,簡稱主詞,處於依存地位的是從詞:

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

這棵依存樹告訴我們句子的主語是「London」,它和「capital」存在一個「be」的關係。據此我們得到了一條有用信息——London is a capital。在這個基礎上,如果我們繼續往後看,可以發現,其實London is the capital of the United Kingdom。

就像我們之前使用機器學習模型預測詞性一樣,依存句法分析也可以用一個模型來實現。不同的是,解析單詞依存特別複雜,需要結合整篇文章詳細解釋。如果你感興趣,Matthew Honnibal的「用500行Python代碼解析英語」是個不錯的教程。

雖然2015年的時候,作者表示這種方法已經成為標準,但放到現在來看,它還是有點過時,很多研究人員都已經不再用它了。2016年,Google發布了一個名為Parsey McParseface的新依存解析器,它基於深度學習,在性能上明顯超出已有基準,因此一經發布就被廣泛傳播。一年後,他們又發布了更新版本ParseySaurus,進一步做了提升。簡而言之,依存句法分析現在還是一個活躍的研究領域,並且在不斷變化和改進。

此外,許多英語句子存在意義含糊不清的問題,往往難以解析。在這些情況下,模型會基於句子的各個解析版本猜測一個可能性最高的選擇,但它並不完美,有時模型會出現令人尷尬的錯誤。但隨著時間的推移,我們的NLP模型會逐漸走向合理。

第六步(b):尋找名詞短語

到目前為止,我們已經把句子中的每個單詞視為一個單獨的實體,但有時這些表示單個想法或事物的片語合在一起會更有意義。利用依存樹,我們可以自動整合信息,把討論同一個事物的單片語合在一起。

比起下圖這個形式:

我們可以對名詞短語進行分組以生成:

是否要採取這一步驟取決於我們的最終目標。但是,如果我們不需要了解句子的額外細節,比如哪些詞是形容詞,而是更多地關注提取完整想法,那麼這通常是簡化句子的一個便捷方法。

第七步:命名實體識別(NER)

完成上述步驟後,我們就可以擺脫初級語法,開始真正著手提取意義。

在示例句子中,我們有以下名詞:

這些名詞中包含一些現實存在的東西,比如「倫敦」「英格蘭」「英國」表示地圖上的某個地理位置。有了這些信息,我們就可以使用NLP自動提取文檔中提到的真實世界的位置列表。

命名實體識別(NER)的目標是檢測這些表示現實世界食物的詞,並對它們進行標記。下圖把各個詞例輸入NER模型後,示例句子的變化情況:

雖然直觀上看不出,但NER絕不是簡單地查詞典、打標籤,它包含一個單詞在上下文中位置的統計模型,可以預測不同單詞分別代表哪種類型的名詞。舉個例子,一個好的NER模型可以區分「Brooklyn」是表示人名Brooklyn Decker,還是地名布魯克林。

以下是典型NER系統可以標記的一些對象:

人的名字

公司名稱

地理位置(地緣和政治)

產品名稱

日期和時間

金額

事件名稱

NER有很多用途,因為它可以輕易從文本中獲取結構化數據,這是快速從NLP pipeline中獲取有價值信息的最簡單的方法之一。

第八步:共指消解

截至目前,我們已經有了許多和句子相關的有用表徵。我們知道每個單詞的詞性、單詞間的依存關係,以及那些詞表示命名實體。

但我們還有一個棘手的問題,就是英語中包含大量代詞,比如「he」「she」「it」,這些詞頻繁出現在句子里,是我們為了避免重複提及某個名稱而使用的簡稱。人類可以根據上下文理解這些代詞的含義,但NLP模型不行,因為到目前為止,它只是一句一句地檢測。

讓我們來看示例的第三句:

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

根據NLP pipeline,我們的模型只知道「it」是羅馬人造的,還不知道「it」是什麼。但這個問題想必難不倒任何讀得動這段話的人,我們知道這裡的「it」就是第一句里的「London」。

以下是在我們的文檔中為「倫敦」一詞運行共識解析的結果:

通過將共指消解與依存樹、命名實體信息相結合,我們可以從該文檔中提取大量信息!事實上,這也是現在NLP領域的一大難點,它的難度遠高於單個句子解析。雖然近年來基於深度學習最新進展的某些成果已經取得了一定突破,但它們都不完美。

以上是關於NLP的一些基礎知識,如果你對這個內容感興趣,以後我們還會討論NLP的更多內容,如文本分類、智能助理解析問題等具體應用。

在Python中編寫NLP Pipeline

下圖是完整的NLP Pipeline概述:

Coreference resolution是一個可選的步驟

首先,假設你已經安裝了Python3,那麼按著下面的代碼可以安裝spaCy:

# Install spaCy

pip3 install -U spacy

# Download the large English model for spaCy

python3 -m spacy download en_core_web_lg

# Install textacy which will also be useful

pip3 install -U textacy

然後編寫如下代碼來運行NLP Pipeline:

importspacy

# Load the large English NLP model

nlp = spacy.load("en_core_web_lg")

# The text we want to examine

text ="""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.

"""

# Parse the text with spaCy. This runs the entire pipeline.

doc = nlp(text)

# "doc" now contains a parsed version of text. We can use it to do anything we want!

# For example, this will print out all the named entities that were detected:

forentityindoc.ents:

print(f"()")

運行過後,你將得到從文檔中檢測到的命名實體和實體類型的列表:

London (GPE)

England (GPE)

the United Kingdom (GPE)

the River Thames (FAC)

Great Britain (GPE)

London (GPE)

two millennia (DATE)

Romans (NORP)

Londinium (PERSON)

值得注意的是,在「Londinium」上出現了一個錯誤,認為它是一個人的名字,而不是一個地方。這可能是因為在訓練數據集中沒有類似的東西,它做出了最好的猜測。命名實體檢測(Named Entity Detection)通常需要進行一些模型微調。

此處,讓我們考慮一下檢測實體,並將其扭轉以構建數據清理器。對數千個文檔手動編輯其名稱可能需要好幾年的時間,但對於NLP來說,這簡直就是小菜一碟。如下是一個簡單的數據清理器,它可以刪除檢測到的所有名稱:

importspacy

# Load the large English NLP model

nlp = spacy.load("en_core_web_lg")

# Replace a token with "REDACTED" if it is a name

defreplace_name_with_placeholder(token):

iftoken.ent_iob !=andtoken.ent_type_ =="PERSON":

return"[REDACTED] "

else:

returntoken.string

# Loop through all the entities in a document and check if they are names

defscrub(text):

doc = nlp(text)

forentindoc.ents:

ent.merge()

tokens = map(replace_name_with_placeholder, doc)

return"".join(tokens)

s ="""

In 1950, Alan Turing published his famous article "Computing Machinery and Intelligence". In 1957, Noam Chomsky』s

Syntactic Structures revolutionized Linguistics with "universal grammar", a rule based system of syntactic structures.

"""

print(scrub(s))

其運行結果如下:

In1950, [REDACTED] published his famous article"Computing Machinery and Intelligence". In1957, [REDACTED]

Syntactic Structures revolutionized Linguisticswith"universal grammar", a rule based system of syntactic structures.

Fact提取

有一個名為textacy的python庫,它在spaCy的基礎上實現了幾種常見的數據提取演算法。它實現的一個演算法叫做半結構化語句提取( Semi-structured Statement Extraction)。我們可以用它來對簡單的語句搜索解析樹,其中主語是「London」,而動詞是「be」的一種形式。這有助於我們找到有關倫敦的fact。如下所示:

其運行結果如下:

Here are the things I know about London:

- the capitalandmost populous city of Englandandthe United Kingdom.

- a major settlementfortwo millennia.

這看起來可能很簡單,但如果你在整個倫敦維基百科的文章文本上運行同樣的代碼(而不是僅僅用三句話),你會得到令人印象深刻的結果,如下所示:

Here are the things I know about London:

- the capitalandmost populous city of Englandandthe United Kingdom

- a major settlementfortwo millennia

- the world"s most populous city from around 1831 to 1925

- beyond all comparison the largest town in England

- still very compact

- the world"s largest cityfromabout1831to1925

- the seat of the Government of the United Kingdom

- vulnerable to flooding

-"one of the World"s Greenest Cities"withmore than40percent green spaceoropen water

- the most populous cityandmetropolitan area of the European Unionandthe second most populousinEurope

- the19th largest cityandthe18th largest metropolitan regioninthe world

- Christian,andhas a large number of churches, particularlyinthe City of London

- also home to sizeable Muslim, Hindu, Sikh,andJewish communities

- also home to42Hindu temples

- the world"s most expensive office market for the last three years according to world property journal (2015) report

- one of the pre-eminent financial centres of the world as the most important location for international finance

- the world top city destination as ranked by TripAdvisor users

- a major international air transport hub with the busiest city airspace in the world

- the centre of the National Rail network, with 70 percent of rail journeys starting or ending in London

- a major global centre of higher education teaching and research and has the largest concentration of higher education institutes in Europe

- home to designers Vivienne Westwood, Galliano, Stella McCartney, Manolo Blahnik, and Jimmy Choo, among others

- the setting for many works of literature

- a major centre for television production, with studios including BBC Television Centre, The Fountain Studios and The London Studios

- also a centre for urban music

- the "greenest city" in Europe with 35,000 acres of public parks, woodlands and gardens

- not the capital of England, as England does not have its own government

還可以做什麼?

通過spaCy文檔和textacy文檔,你將看到大量使用解析文本的示例。接下來看一下另外一個實例:假設你在搭建一個網站,如果你的網站中有搜索欄目,你肯定是希望能夠像谷歌那樣自動完成常見搜索查詢,如下圖所示:

谷歌對「London」一詞的文本查詢自動補全

若要做到這點,我們需要一個列表來為用戶提供建議。可以使用NLP快速生成這些數據。下面是一種從文檔中提取經常提到的名詞塊的方法:

importspacy

importtextacy.extract

# Load the large English NLP model

nlp = spacy.load("en_core_web_lg")

# The text we want to examine

text ="""London is [.. shortened for space ..]"""

# Parse the document with spaCy

doc = nlp(text)

# Extract noun chunks that appear

noun_chunks = textacy.extract.noun_chunks(doc, min_freq=3)

# Convert noun chunks to lowercase strings

noun_chunks = map(str, noun_chunks)

noun_chunks = map(str.lower, noun_chunks)

# Print out any nouns that are at least 2 words long

fornoun_chunkinset(noun_chunks):

iflen(noun_chunk.split(" ")) >1:

print(noun_chunk)

如果你在London的維基百科中運行這個代碼,將得到如下結果:

westminster abbey

natural history museum

west end

east end

st paul"s cathedral

royal albert hall

london underground

great fire

british museum

london eye

.... etc ....

新智元AI WORLD 2018大會【早鳥票】

開售!

新智元將於9月20日在北京國家會議中心舉辦AI WORLD 2018 大會,邀請機器學習教父、CMU教授 Tom Mitchell,邁克思·泰格馬克,周志華,陶大程,陳怡然等AI領袖一起關注機器智能與人類命運。

大會官網:

即日起到8月19日,新智元限量發售若干早鳥票,與全球AI領袖近距離交流,見證全球人工智慧產業跨越發展。

活動行購票鏈接:

http://www.huodongxing.com/event/6449053775000

活動行購票二維碼:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

7000字長文讀懂《生命3.0》:AI未來就是一部西部世界
來看一場 AI 重建的 3D 全息世界盃比賽!

TAG:新智元 |