數據與智能 出版了暢銷書「構建企業級推薦系統:算法、工程實現與案例分析」。每周輸出7篇推薦系統、數據分析、大數據、AI原創文章。「數據與智能」(同名視頻号、知乎、頭條、B站、快手、抖音、小紅書等自媒體平台号) 社區,聚焦數據、智能領域的知識分享與傳播。
來源 | Natural Language Processing with PyTorch
作者 | Rao,McMahan
譯者 | Liangchu
校對 | gongyouliu
編輯 | auroral-L
全文共4243字,預計閱讀時間35分鐘。
第二章 快速回顧傳統 NLP 應用
1. 語料庫,标記和類型
2. 一元組,二元組,三元組,... ,N元組
3. 詞形和詞幹
4. 分類句子和文檔
5. 分類單詞:詞性标注
6. 分類短語:分塊和命名實體識别
7. 句子結構
8. 單詞意義和情感
9. 總結
❤ 參考資料
自然語言處理(NLP)和計算語言學(computational linguistics,CL)是人類語言計算研究的兩個領域。NLP 旨在研究解決涉及語言的實際問題的方法,如信息提取(information extraction)、自動語音識别(automatic speech recognition)、機器翻譯(machine translation)、情感分析(sentiment analysis)、問答(question answering)和總結(summarization)。另一方面,CL 使用計算方法來理解人類語言特性。那麼我們何以理解語言?我們何以産生語言?我們何以學習語言?不同語言之間又有什麼關聯呢?
在文獻中,我們經常看到從 CL 到 NLP領域中研究方法和研究人員的交叉,反之亦然。來自CL關于語言的教訓和經驗可以用于作為NLP的先驗内容,而來自NLP的統計和機器學習方法可以用來回答 CL 想要回答的問題。實際上,這些問題中的一部分已經擴展成它們自己的學科,如音位學(phonology)、形态學(morphology)、句法學(syntax)、語義學(semantics)和語用學(pragmatics)。
在本書中,我們隻關注 NLP,但我們也經常會根據需要從 CL 中借鑒思想。在将自己完全投身于 NLP 的神經網絡方法之前,還有必要回顧一下一些傳統的 NLP 概念和方法,這就是本章的學習目标。
如果你有 NLP 相關的的背景知識則可以跳過這一章,但你也可以再看一遍回憶一下,也便于為未來建立一個共享的詞彙表。
1. 語料庫,标記和類型所有的 NLP 方法,無論是經典的還是現代的,都以文本數據集開始,也稱為語料庫(corpora)。語料庫通常包括原始文本(ASCII 或 UTF-8 格式)和與文本相關的所有元數據。原始文本是一個字符(字節)序列,但大多數情況下将字符分組成稱為标記(token,也可以理解為詞元 )的連續單元是有用的。在英語中,标記token對應于由空格字符或标點分隔的單詞和數字序列。
元數據可以是任何與文本相關聯的輔助信息,例如标識符,标簽和時間戳。在機器學習術語中,文本及其元數據稱為實例(instance)或數據點(data point)。下圖(2-1)的語料庫是一組實例,也稱為一個數據集(dataset)。鑒于本書重點關注機器學習,我們可以自由地将語料庫和數據集這兩個術語交替使用。
将文本分解為标記token的過程稱為分詞(tokenization)。例如,世界語句子:Maria frapis la verda sorĉistino有六個token。分詞可能比簡單地基于非字母數字字符拆分文本更加複雜,如下圖(2-2)所示。對于像土耳其語這樣的粘合語言來說,僅僅分隔空格和标點符号可能是不夠的,因此可能需要更專業的技術。你将在第四章和第六章中看到,通過将文本表示為字節流,我們能夠在某些神經網絡模型中完全規避分詞問題,這對于粘合語言來說是很重要的。
最後,考慮一下下面這條推文:
将推文進行分詞的過程涉及到保存話題标簽和@handle,以及将表情符号(如:-))和URL按單元分隔的問題。#MakeAMovieCold标簽應該是 1 個還是 4 個token呢?雖然大多數論文并不太關注這一問題,但是實際上,有關分詞的決策可能十分随意,然而這些決策在實踐中對于準确性的影響要比公認的大得多。分詞通常被認為是預處理的一項繁瑣工作,大多數開源 NLP 包為分詞提供了合理支持。下例(2-1)展示了來自 NLTK 和 SpaCy 的示例,它們都是用于文本處理的常用包。
示例 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())])
Output[0]:
['mary', ',', 'do', "n't", 'slap', 'the', 'green', 'witch', '.']
Input[1]:
from nltk.tokenize import TweetTokenizer
tweet=u"Snow White and the Seven Degrees
#MakeAMovieCold@midnight:-)"
tokenizer = TweetTokenizer()
print(tokenizer.tokenize(tweet.lower()))
Output[1]:
['snow', 'white', 'and', 'the', 'seven', 'degrees', '#makeamoviecold', '@midnight', ':-)']
類型(type)是語料庫中唯一的标記。語料庫中所有類型的集合就是它的詞彙表(vocabulary)或詞典(lexicon)。詞可以區分為内容詞(content words)和停用詞(stopwords)。像冠詞和介詞這樣的限定詞主要是為了語法正确性,就像承載着内容詞的填充物一樣。
特征工程
這種理解語言的語言學并将其應用于解決NLP問題的過程稱為特征工程(feature engineering)。為了模型在不同語言之間的方便和可移植性,我們将其保持在最低限度。但是在構建和部署真實的生産系統時,特性工程是必不可少的,盡管最近也有說法與此相悖。一般來說,要了解特征工程,可以閱讀 Zheng和Casari(2016)的書。
N 元組(N-grams)是文本中出現的固定長度(n)的連續token序列。二元組(bigram)有兩個token,一元組(unigram)隻有一個token。如下例(2-2)所示,從文本生成 N 元組非常容易,SpaCy 和 NLTK 等包提供了方便的方法。
示例 2-2:生成 N 元組
Input[0]:
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))
Output[0]:
[['mary', ',', "n't"],
[',', "n't", 'slap'],
["n't", 'slap', 'green'],
['slap', 'green', 'witch'],
['green', 'witch', '.']]
對于子詞(subword)信息本身攜帶有用信息的某些情況,可能需要生成字符 N 元組。例如,methanol中的後綴-ol表示它是一種醇,如果任務涉及對有機化合物名稱的分類,那麼你能知道 N 元組捕獲的子詞(subword)信息是很有用的。在這種情況下,你可以重用代碼,将每個字符 N 元組視為token。
3. 詞形和詞幹詞形(lemma)是單詞的詞根形式。考慮動詞fly。它可以引申為許多不同單詞——flow、flew、flies、flown、flowing等等——而fly是所有這些看似不同單詞的詞形。有時,為了保持向量表示的低維度,可以将token縮減為到它們的詞形。這種簡化稱為詞形還原(lemmatization),你可以在下例(2-3)中看到它的作用:
示例 2-3:詞形還原
Input[0]
import spacy
nlp = spacy.load('en')
doc = nlp(u"he was running late")
for token in doc:
print('{} --> {}'.format(token, token.lemma_))
Output[0]
he --> he
was --> be
running --> run
late --> late
例如,SpaCy 使用一個預定義的字典 WordNet 來提取詞形,但是詞形還原可以構建為一個需要理解語言形态學的機器學習問題。
詞幹化(Stemming)是最常見的詞形還原,它涉及使用人為制定的規則來去掉單詞的結尾,從而将之簡化為一種叫做詞幹的常見形式。通常在開源包中所實現的比較流行的詞幹分析器是 Porter 詞幹提取器和 Snowball 詞幹提取器。至于調用 SpaCy/NLTK API進行詞幹提取,就留給你自己去尋找和發現了。
4. 分類句子和文檔對文檔進行歸類或分類可能是 NLP 最早的應用之一。我們在第一章中描述的TF表示和TF-IDF表示對于對較長的文本塊(如文檔或句子)進行分類是非常有用的。主題标簽的分配、評論情感的預測、垃圾郵件的過濾、語言識别和郵件分類等問題都可以被定義為受監督的文檔分類問題。(對于半監督版本,其中隻使用了一個小的标簽數據集,非常有用,但不在本書涉及範圍之内。)
5. 分類單詞:詞性标注我們可以将标簽的概念從文檔擴展到單個單詞或token。分類單詞的一個常見示例是詞性标注(categorizing words is part-of-speech,POS tagging),如下例(2-4)所示:
示例 2-4:詞性标注
Input[0]
import spacy
nlp = spacy.load('en')
doc = nlp(u"Mary slapped the green witch.")
for token in doc:
print('{} - {}'.format(token, token.pos_))
Output[0]
Mary - PROPN
slapped - VERB
the - DET
green - ADJ
witch - NOUN
. - PUNCT
我們通常需要标記文本的範圍,也即一個連續的多标記邊界,例如句子Mary slapped the green witch.,我們可能需要識别其中的名詞短語(noun phrase,NP)和動詞短語(verb phrase,VP),如下所示:
[NP Mary] [VP slapped] [the green witch].
該操作稱為分塊(chunking)或淺層句法分析(shallow parsing)。淺層句法分析旨在推導出由名詞、動詞、形容詞等語法原子組成的高階單位。如果沒有用于訓練淺層句法分析模型的數據,可以在詞性标注上編寫正則表達式來近似淺層句法分析。幸運的是,對于英語等最廣泛使用的語言來說,這樣的數據和預訓練模型是存在的。下例(2-5) 給出了一個使用 SpaCy 的淺層句法分析示例:
示例 2-5:NP分塊
Input[0]:
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_)
Output[0]:
Mary - NP
the green witch - NP
另一種有用的範圍類型是命名實體(named entity)。命名實體是一個包括真實世界概念的字符串,如人員、位置、組織、藥品名稱等等。下面是例子:
7. 句子結構
淺層句法分析的作用是識别短語單元,而識别它們之間關系的任務稱為解析(parsing)。你可能記得在上英語初級課程時有見過如下圖(2-3)所示的圖表來表示句子:
解析樹(parse tree)表示句子中不同的語法單元在層次上是如何相關聯的。上圖(2-3)中的解析樹顯示了所謂的成分分析(constituent parse)。另一種可能更有用的用于顯示關系的方法是使用依存句法分析(dependency parsing),如下圖(2-4)所示:
要了解更多關于傳統句子解析的信息,請參閱本章末尾的“參考資料”部分。
8. 單詞意義和情感單詞是有意義的,而且通常不止一個意義。一個詞的不同含義稱為它的意義(senses)。WordNet 是一個長久運行的詞彙資源項目,它來自普林斯頓大學,旨在對所有(絕大部分)英文單詞的含義以及其他詞彙關系進行分類。例如,考慮像plane這樣的單詞。下圖(2-5)展示了plane一詞的不同用法:
即使是在有現代流行方法的情況下,為像 WordNet 這樣的項目付出數十年的努力也是值得的。本書後面的章節給出了在神經網絡和深度學習方法的背景下使用現有語言資源的例子。
詞的意義也可以從上下文中歸納總結出來——從文本中自動發現詞義實際上是半監督學習在NLP中的第一個應用,盡管我們在本書中并不介紹相關内容,但我們還是鼓勵你閱讀 Jurasky and Martin(2014),第十七章,以及Manning and Schutze(1999),第七章。
9. 總結在這一章中,我們回顧了 NLP 中一些基本的術語和思想,這些對于學習後續章節很有用。本章隻涉及了有關傳統 NLP 的部分内容,并忽略了傳統NLP一些重要方面,因為我們想将本書的大部分筆墨用于 NLP 的深度學習。然而你得知道,其實存在大量不使用神經網絡的 NLP 研究工作,并且仍然具有很大影響力(即,廣泛用于構建生産系統)。在許多情況下,基于神經網絡的方法應當被看作是傳統方法的補充而非替代。有經驗的實踐者經常結合使用這兩個方法的優點來構建最先進的系統。為了深入了解NLP傳統方法,我們推薦以下參考資料。
❤參考資料1.Manning, Christopher D., and Hinrich Schütze. (1999). Foundations of Statistical Natural Language Processing. MIT press.
2.Bird, Steven, Ewan Klein, and Edward Loper. (2009). Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit. O'Reilly.
3.Smith, Noah A. (2011). Linguistic Structure prediction. Morgan and Clypool.
4.Jurafsky, Dan, and James H. Martin. (2014). Speech and Language Processing. Vol. 3. London: Pearson.
5.Russell, Stuart J., and Peter Norvig. (2016). Artificial Intelligence: A Modern Approach. Pearson.
6.Zheng, Alice, and Casari, Amanda. (2018). Feature Engineering for Machine Learning: Principles and Techniques for Data Scientists. O'Reilly.
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!