第2章 傳統NLP的快速瀏覽 自然語言處理用PyTorch實現
自然語言處理 (NLP)( Natural language processing)和 計算語言學*(CL computational linguistics)是人類語言計算研究的兩個領域。NLP旨在開發解決涉及語言的實際問題的方法,例如資訊提取,自動語音識別,機器翻譯,情感分析,問題回答和總結。另一方面,CL使用計算方法來理解人類語言的屬性。我們如何理解語言?我們如何製作語言?我們如何學習語言?語言之間有什麼關係?
在文獻中,通常會看到NLP和CL的交叉使用,從CL到NLP,反之亦然。CL中關於語言的經驗教訓可用於通知NLP中的先驗,NLP的統計和機器學習方法可用於回答CL尋求回答的問題。實際上,其中一些問題已經發展成了自己的學科,如音韻學(phonology),形態學(morphology),語法(syntax),語義學(semantics)和語用學(pragmatics)。
在本書中,我們只關注NLP,但我們會根據需要從CL中借用想法。在我們完全投入NLP的神經網路方法之前 - 本書其餘部分的重點 - 值得回顧一些傳統的NLP概念和方法。這是本章的目標。
如果你有一些NLP的背景知識,你可以跳過這一章,但你也可以留意懷舊並建立未來的共享詞彙。
語料庫,分詞和型別
所有經典或現代的NLP方法,都從文字資料集開始,也稱為 語料庫 (corpus複數: 語料庫 )。語料庫通常是原始文字(ASCII或UTF-8)以及與文字相關聯的任何元資料。原始文字是一系列字元(位元組),但大多數情況下將字元分組為稱為 標記的 連續單元很有用。在英語中,分詞依據空格字元或標點符號分隔的單詞和數字序列。
元資料可以是與文字相關聯的任何輔助資訊,例如識別符號,標籤和時間戳。在機器學習術語中,文字及其元資料稱為 例項 或 資料點 。語料庫(圖2-1)是一組例項,也稱為 資料集 。鑑於本書重點關注機器學習,我們可以自由地交換術語語料庫和資料集。

圖2-1 NLP任務的語料庫
將文字分解為標記的過程稱為 標記化 。在世界語句子中,“ Maria frapis la verda sorĉistino
,有六個token。標記化可能比簡單地基於非字母數字字元分割文字,或者更復雜,如圖2-2所示。對於像土耳其語這樣的語言,存在白色空格和標點符號。其他更專業的技術在第4和第6章中將介紹。

Figure 2-2土耳其語token
最後,請考慮以下推文:

圖2-3
標記推文涉及保留主題標籤和@handles,將表情符號 :-)
和URL 等分割為一個單元。標籤#MakeAMovieCold應該是一個分詞還是4個單詞?儘管大多數研究論文都沒有對這個問題給予太多關注,事實上,許多標記化決策往往是隨意的,但這些決策在實踐中的準確性會比公認的更大。這就是預處理的繁重工作,幸運的是大多數開源NLP包為標記化提供了合理的支援,以幫助您入門。例2-1顯示了來自 ofollow,noindex">NLTK 和 SpaCy的 示例,這兩個常用的文字處理包。
Example 2-1. 文字分詞
Input[0] import spacy nlp = spacy.load(‘en’) text = “Mary, don’t slap the green witch” print([str(token) for token in nlp(text.lower())])
from nltk.tokenize import TweetTokenizer tweet=u"Snow White and the Seven Degrees #MakeAMovieCold@midnight:-)" tokenizer = TweetTokenizer() print(tokenizer.tokenize(tweet.lower()))
型別是語料庫中存在的唯一令牌。語料庫中所有型別的集合是其詞彙或詞彙。可以在內容詞和停用詞之間區分單詞。諸如文章和介詞之類的替代詞主要用於語法目的,就像持有內容詞的填充者一樣。
Unigrams, Bigrams, Trigrams, …, Ngrams
Ngrams是文字中出現的固定長度( n )連續標記序列。一個二元組有兩個令牌,一個是unigram。從文字生成ngrams非常簡單,如例2-2所示,但是像SpaCy和NLTK這樣的包提供了方便的方法。
def n_grams(text, n): ''' takes tokens or text, returns a list of n grams ''' return [text[i:i+n] for i in range(len(text)-n+1)] cleaned = ['mary', ',', "n't", 'slap', green', 'witch', '.'] print(n_grams(cleaned, 3))
對於子字資訊本身攜帶有用資訊的某些情況,可能想要生成字元ngram。例如,“甲醇”中的字尾“-ol”表示它是一種醇; 如果您的任務涉及對有機化合物名稱進行分類,您可以看到ngrams捕獲的子詞資訊如何有用。在這種情況下,您可以重複使用相同的程式碼,除了將每個字元ngram視為一個標記。
Lemmas和Stems
詞彙 是詞語的根形式。考慮動詞 fly
。它可以 活用 成許多不同的words- flow
, flew
, flies
, flown
, flowing
,等和fly是引理所有這些看似不同的詞。有時,將標記減少到它們的引理可能是有用的,以保持向量表示的維度較低。這種縮減稱為 詞形還原 ,您可以在示例2-3中看到它的實際效果。
import spacy nlp = spacy.load(‘en’) doc = nlp(u"he was running late") for token in doc: print('{} --> {}'.format(token, token.lemma_))
例如,SpaCy使用稱為WordNet的預定義字典來提取單詞,但是詞形還原可以被構造為需要理解語言形態的機器學習問題。 詞幹 是詞形還原。它涉及使用手工製作的規則來刪除單詞的結尾,以將它們縮減為稱為 詞幹 的常見形式。通常在開源軟體包中實現的流行詞幹分析器是Porter的Stemmer和Snowball Stemmer。你可以自己查詢適合的SpaCy / NLTK API來執行詞幹提取操作。
對句子和檔案進行分類
對文件進行分類或分類可能是NLP最早的應用之一。我們在第1章中描述的表示(Term-Frequency [TF]和Term-Frequency-Inverse-Document-Frequency [TF-IDF])可以立即用於對文字或句子等較長的文字塊進行分類和分類。諸如分配主題標籤,預測評論情緒,過濾垃圾郵件,語言識別和電子郵件分類等問題可以被視為監督文件分類問題。(半監督版本,其中只使用了一個小的標記資料集,非常有用,但超出了本書的範圍。)
分類單詞:POS標記
我們可以將標籤的概念從文件擴充套件到單個單詞或標記。分類單詞的一個常見例子是詞性標註,如例2-4所示。
import spacy nlp = spacy.load(‘en’) doc = nlp(u"Mary slapped the green witch.") for token in doc: print('{} - {}'.format(token, token.pos_)) Mary - PROPN slapped - VERB the - DET green - ADJ witch - NOUN . - PUNCT
分類跨度:分塊和命名實體識別
通常,我們需要標記一段文字; 也就是說,一個連續的多語邊界。例如,考慮句子“ Mary slapped the green witch。”我們可能想要識別其中的名詞短語(NP)和動詞短語(VP),如下所示:

或* Shallow Parse*。 Shallow Parsi旨在匯出由諸如名詞,動詞,形容詞等語法原子組成的高階單元。如果您沒有資料來訓練 Shallow Parsi解析模型,則可以在詞性標記上編寫正則表示式來近似 Shallow Parse。幸運的是,對於英語和最廣泛使用的語言,存在這樣的資料和預訓練模型。例2-5給出了使用SpaCy進行 Shallow Parse的示例。
import spacy nlp = spacy.load(‘en’) doc= nlp(u"Mary slapped the green witch.") for chunk in doc.noun_chunks: print '{} - {}'.format(chunk, chunk.label_) Mary - NP the green witch - NP
另一種有用的是命名實體。命名實體是一個字串提及現實世界的概念,如人,地點,組織,藥物名稱等。這是一個例子:

命名實體
句子結構
淺層解析識別短語單元,識別它們之間關係的任務稱為 解析 。你可能還記得,從小學英語課,圖表句子,如圖2-6所示。

Mary slapped the green witch.句子結構
解析樹表示句子中不同語法單位的層次關係。圖2-6中的解析樹顯示了所謂的 組成解析 。顯示關係的另一種可能更有用的方法是使用 依賴解析 ,如圖2-7所示。

圖2-7。句子的依賴性解析
詞語感和語義學
詞語有意義,通常不止一個。一個詞的不同含義稱為它的語感。WordNet是普林斯頓大學長期執行的詞彙資源專案之一,其目的是將所有單詞(嗯,大多數)的英語語言感知與其他詞彙關係一起記錄下來。例如,考慮像“平面”這樣的詞。圖2-8顯示了可以使用“平面”一詞的不同含義。

圖2-8 “plane”這個詞語感
即使在現代方法的存在下,像WordNet這樣的專案幾十年的努力值得自己利用。本書後面的章節介紹了在神經網路和深度學習方法的背景下使用現有語言資源的例子。詞義也可以從語境中誘匯出來。從文字中自動發現單詞感覺實際上是第一個將半監督學習應用於NLP的地方。儘管我們在本書中沒有涉及到這一點,但我們鼓勵您閱讀Jurasky和Martin(2014),第17章,以及Manning和Schutze(1999),第7章。
摘要
在本章中,我們回顧了NLP中的一些基本術語和想法,這些術語和想法在以後的章節中應該會很方便。本章僅涉及傳統NLP所提供的一些內容。我們省略了傳統NLP的重要方面,因為我們希望將本書的大部分內容分配給NLP的深度學習。然而,重要的是要知道有大量的NLP研究工作不使用神經網路,並且具有很強的影響力(即廣泛用於建築生產系統)。在許多情況下,應該考慮基於神經網路的方法作為補充而不是傳統方法的替代。經驗豐富的從業者經常利用兩全其美的優勢來構建最先進的系統。要了解有關NLP的傳統方法的更多資訊,