自然語(yǔ)言處理
自然語(yǔ)言處理廣納了眾多技術(shù),對(duì)自然或人類語(yǔ)言進(jìn)行自動(dòng)生成,處理與分析。雖然大部分 NLP 技術(shù)繼承自語(yǔ)言學(xué)和人工智能,但同樣受到諸如機(jī)器學(xué)習(xí),計(jì)算統(tǒng)計(jì)學(xué)和認(rèn)知科學(xué)這些相對(duì)新興的學(xué)科影響。
在展示 NLP 技術(shù)的例子前,有必要介紹些非常基礎(chǔ)的術(shù)語(yǔ)。請(qǐng)注意:為了讓文章通俗易懂,這些定義在語(yǔ)言上就不一定考究。
詞例(Token):對(duì)輸入文本做任何實(shí)際處理前,都需要將其分割成諸如詞、標(biāo)點(diǎn)符號(hào)、數(shù)字或純字母數(shù)字(alphanumerics)等語(yǔ)言單元(linguistic units)。這些單元被稱為詞例。
句子:由有序的詞例序列組成。
詞例還原(Tokenization):將句子還原成所組成的詞例。以分割型語(yǔ)言(segmented languages)英語(yǔ)為例,空格的存在使詞例還原變得相對(duì)容易同時(shí)也索然無(wú)味。然而,對(duì)于漢語(yǔ)和阿拉伯語(yǔ),因?yàn)闆](méi)有清晰的邊界,這項(xiàng)工作就稍顯困難。另外,在某些非分割型語(yǔ)言(non-segmented languages)中,幾乎所有的字符(characters)都能以單字(one-character)存在,但同樣也可以組合在一起形成多字(multi-characterwords)形式。
語(yǔ)料庫(kù):通常是由豐富句子組成的海量文本。
詞性標(biāo)簽(Part-of-speech (POS) Tag):任一單詞都能被歸入到至少一類詞匯集(set of lexical)或詞性條目(part-of-speech categories)中,例如:名詞、動(dòng)詞、形容詞和冠詞等。詞性標(biāo)簽用符號(hào)來(lái)代表一種詞匯條目——NN(名詞)、VB(動(dòng)詞)、JJ(形容詞)和 AT(冠詞)。Brown Corpus 是最悠久,也是最常用的標(biāo)注集之一。詳情且聽(tīng)下回分解。
剖析樹(shù)(Parse Tree):利用形式語(yǔ)法(formal grammar)的定義,可以用樹(shù)狀圖來(lái)表示給定句子的句法(syntactic)結(jié)構(gòu)。
認(rèn)識(shí)了基本的術(shù)語(yǔ),下面讓我們了解 NLP 常見(jiàn)的任務(wù):
詞性標(biāo)注(POS Tagging):給定一個(gè)句子和組詞性標(biāo)簽,常見(jiàn)的語(yǔ)言處理就是對(duì)句子中的每個(gè)詞進(jìn)行標(biāo)注。舉個(gè)例子,The ball is red,詞性標(biāo)注后將變成 The/AT ball/NN is/VB red/JJ。最先進(jìn)的詞性標(biāo)注器[9]準(zhǔn)確率高達(dá) 96%。文本的詞性標(biāo)注對(duì)于更復(fù)雜的 NLP 問(wèn)題,例如我們后面會(huì)討論到的句法分析(parsing)和機(jī)器翻譯(machine translation)非常必要。
計(jì)算形態(tài)學(xué)(Computational Morphology):大量建立在“語(yǔ)素”(morphemes/stems)基礎(chǔ)上的詞組成了自然語(yǔ)言,語(yǔ)素雖然是最小的語(yǔ)言單元,卻富含意義。計(jì)算形態(tài)學(xué)所關(guān)心的是用計(jì)算機(jī)發(fā)掘和分析詞的內(nèi)部結(jié)構(gòu)。
句法分析(Parsing):在語(yǔ)法分析的問(wèn)題中,句法分析器(parser)將給定句子構(gòu)造成剖析樹(shù)。為了分析語(yǔ)法,某些分析器假定一系列語(yǔ)法規(guī)則存在,但目前的解析器已經(jīng)足夠機(jī)智地借助復(fù)雜的統(tǒng)計(jì)模型[1]直接推斷分析樹(shù)。多數(shù)分析器能夠在監(jiān)督式設(shè)置(supervised setting)下操作并且句子已經(jīng)被詞性標(biāo)注過(guò)了。統(tǒng)計(jì)句法分析是自然語(yǔ)言處理中非?;钴S的研究領(lǐng)域。
機(jī)器翻譯(Machine Translation(MT)):機(jī)器翻譯的目的是讓計(jì)算機(jī)在沒(méi)有人工干預(yù)的情況下,將給定某種語(yǔ)言的文本流暢地翻譯成另一種語(yǔ)言文本。這是自然語(yǔ)言處理中最艱巨的任務(wù)之一,這些年來(lái)已經(jīng)用許多不同的方式解決。幾乎所有的機(jī)器翻譯方法都依賴了詞性標(biāo)注和句法分析作為預(yù)處理。
Python
Python 是一種動(dòng)態(tài)類型(dynamically-typed),面向?qū)ο蟮慕忉屖剑╥nterpreted)編程語(yǔ)言。雖然它的主要優(yōu)勢(shì)在于允許編程人員快速開(kāi)發(fā)項(xiàng)目,但是大量的標(biāo)準(zhǔn)庫(kù)使它依然能適應(yīng)大規(guī)模產(chǎn)品級(jí)工程項(xiàng)目。Python 的學(xué)習(xí)曲線非常陡峭并且有許多優(yōu)秀的在線學(xué)習(xí)資源[
NLTK自然語(yǔ)言處理工具包
NLTK簡(jiǎn)介
NLTK是構(gòu)建Python程序與人類語(yǔ)言數(shù)據(jù)工作的主要平臺(tái)。它提供了易于使用的界面,以超過(guò)50語(yǔ)料庫(kù)和詞匯資源,如WordNet的,連同一套文字處理庫(kù)進(jìn)行分類,標(biāo)記化,詞干,標(biāo)記,分析和語(yǔ)義推理,和活躍的論壇。
得益于動(dòng)手指南介紹編程基礎(chǔ)在旁邊計(jì)算語(yǔ)言學(xué)課題,NLTK適合語(yǔ)言學(xué)家,工程師,學(xué)生,教育工作者,研究人員和行業(yè)用戶的一致好評(píng)。 NLTK可用于Windows,Mac OS X和Linux。最重要的是,NLTK是一個(gè)免費(fèi),開(kāi)源,社區(qū)驅(qū)動(dòng)的項(xiàng)目。
使用 NLTK
NLTK 官網(wǎng)提供了很棒的說(shuō)明文件和教程進(jìn)行學(xué)習(xí)指導(dǎo)[13]。單純復(fù)述那些作者們的文字對(duì)于他們和本文都不公平。因此我會(huì)通過(guò)處理四個(gè)難度系數(shù)依次上升的 NLP 任務(wù)來(lái)介紹 NLTK。這些任務(wù)都來(lái)自于 NLTK 教程中沒(méi)有給出答案的練習(xí)或者變化過(guò)。所以每個(gè)任務(wù)的解決辦法和分析都是本文原創(chuàng)的。
NLTK 語(yǔ)料庫(kù)
正如前文所說(shuō),NLTK 囊括數(shù)個(gè)在 NLP 研究圈里廣泛使用的實(shí)用語(yǔ)料庫(kù)。在本節(jié)中,我們來(lái)看看三個(gè)下文會(huì)用到的語(yǔ)料庫(kù):
布朗語(yǔ)料庫(kù)(Brown Corpus):Brown Corpus of Standard American English 被認(rèn)為是第一個(gè)可以在計(jì)算語(yǔ)言學(xué)處理[6]中使用的通用英語(yǔ)語(yǔ)料庫(kù)。它包含了一百萬(wàn)字 1961 年出版的美語(yǔ)文本。它代表了通用英語(yǔ)的樣本,采樣自小說(shuō),新聞和宗教文本。隨后,在大量的人工標(biāo)注后,誕生了詞性標(biāo)注過(guò)的版本。
古登堡語(yǔ)料庫(kù)(Gutenberg Corpus):古登堡語(yǔ)料庫(kù)從最大的在線免費(fèi)電子書(shū)[5]平臺(tái) 古登堡計(jì)劃(Gutenberg Project) 中選擇了 14 個(gè)文本,整個(gè)語(yǔ)料庫(kù)包含了一百七十萬(wàn)字。
Stopwords Corpus:除了常規(guī)的文本文字,另一類諸如介詞,補(bǔ)語(yǔ),限定詞等含有重要的語(yǔ)法功能,自身卻沒(méi)有什么含義的詞被稱為停用詞(stop words)。NLTK 所收集的停用詞語(yǔ)料庫(kù)(Stopwords Corpus)包含了 來(lái)自 11 種不同語(yǔ)言(包括英語(yǔ))的 2400 個(gè)停用詞。
NLTK 命名約定
在開(kāi)始利用 NLTK 處理我們的任務(wù)以前,我們先來(lái)熟悉一下它的命名約定(naming conventions)。最頂層的包(package)是 nltk,我們通過(guò)使用完全限定(fully qualified)的加點(diǎn)名稱例如:nltk.corpus and nltk.utilities 來(lái)引用它的內(nèi)置模塊。任何模塊都能利用 Python 的標(biāo)準(zhǔn)結(jié)構(gòu) from 。 。 。 import 。 。 。 來(lái)導(dǎo)入頂層的命名空間。
windows下NLTK環(huán)境搭建
python安裝
選擇 2.7x版本進(jìn)行下載,不建議下載3.X版本,因?yàn)楝F(xiàn)在很多python代碼庫(kù)還是基于舊的版本編寫(xiě)的,所以不建議使用3.X版本。安裝完成后,使用打開(kāi)自帶的IDLE,結(jié)果如下:
Note:
推薦編寫(xiě)python代碼好用的IDE:pycharm,上手比較簡(jiǎn)單,文檔較齊全
下載地址:http://www.jetbrains.com/pycharm/
附幾個(gè)PyCharm4注冊(cè)碼:
name :newasp
=====LICENSE BEGIN =====
09086-12042010
00001EBwqd8wkmP2FM34Z05iXch1Ak
KI0bAod8jkIffywp2WalWZejIQ6AAu
AVVPbzHZpOvqvdJFHEBbvbXW2t1jQI
=====LICENSE END =====
name :newasp
=====LICENSE BEGIN =====
58877-12042010
00002h9ii68IdWfbdJz2UraWcsVxFY
??!w1WD9cwRDMoW2pOUeC0WBqLAMo5PX
lQ7cE8qMukEYuWY6!EnjYWn!2EDTio
=====LICENSE END =====
name :newasp
=====LICENSE BEGIN =====
46753-12042010
000013xjAPHl95oQRCb“KnLsrXfWYa
L3aYClCOtBVysdtzBBPU5XCB3QUjLC
T1yMRB7YNC0d15A2cbwXTwXCwCjJEP
=====LICENSE END =====
name :newasp
=====LICENSE BEGIN =====
62458-12042010
00002r53OfrSCVqjsI0zdG5E4pMM5Z
dBAGbxVOX!OPwIkBqunfKf2zQDgECf
XrLosbjBEp!2JfFuydkblmqWPevvB0
===== LICENSE END =====
NLTK 安裝
下載NLTK及安裝
官方網(wǎng)站:http://www.nltk.org/ 下載網(wǎng)址:https://pypi.python.org/pypi/nltk
由于是在windows環(huán)境下安裝nltk,選擇:
下載完成后,正常安裝,在python安裝目錄下的能找到相應(yīng)的NLTK庫(kù),作者機(jī)器路徑如下:
C:Python27Libsite-packages ltk
測(cè)試
安裝完成后,進(jìn)行測(cè)試:
下載NLTK數(shù)據(jù)源
輸入import nltk如果沒(méi)有出現(xiàn)異常,則表明nltk已經(jīng)安裝正確,但還需要下載相應(yīng)的訓(xùn)練數(shù)據(jù)源,使用nltk.download()進(jìn)行下載:
得到結(jié)果如圖:
選擇all,等待下載結(jié)束即可。
Note:
可能出現(xiàn)的問(wèn)題:ImportError:No module named yaml
該問(wèn)題是由于沒(méi)有安裝pyyaml,下載地址:http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe
下載安裝即可。
NLTK自帶方法進(jìn)行自然語(yǔ)言處理
NLTK進(jìn)行分句
函數(shù):
sent_tokenize(text,language=‘english’)
text : 將要被分割的語(yǔ)句文本
language:Punkt分句程序指定模型名字,可忽略
返回值:
list類型:使用NTLK推薦分句程序得到的結(jié)果
示例:
NLTK進(jìn)行分詞
函數(shù):
word_tokenize(text,language=‘english’)
參數(shù):
text:將要進(jìn)行分詞的句子文本
language:Punkt分詞程序指定模型名字,可忽略
返回值:
list類型,使用NTLK推薦分詞程序得到的結(jié)果
示例:
NLTK詞性標(biāo)注
詞性標(biāo)注的結(jié)果含義可參照作者的另一篇博文:(自然語(yǔ)言處理文檔系列)Penn Treebank詞性標(biāo)記集
函數(shù):
pos_tag(tokens,tagset=None)
參數(shù):
tokens:list(str)類型,將要被標(biāo)注單詞的序列
tagset:可忽略
返回值:
list(tuple(str,str)),進(jìn)行詞性標(biāo)注后的結(jié)果
示例:
NLTK命名實(shí)體識(shí)別(NER)
函數(shù):
ne_chunk(tagged_tokens,binary=False)
使用推薦的NER工具包進(jìn)行處理,處理之前需要利用詞性標(biāo)注的結(jié)果
參數(shù):
tagged_tokens:list(tuple(str,str)),NLTK進(jìn)行詞性標(biāo)注的結(jié)果
binary:
返回值:
示例:
句法分析
nltk沒(méi)有好的parser,推薦使用stanfordparser,但是nltk有很好的樹(shù)類,該類用list實(shí)現(xiàn)??梢岳胹tanfordparser的輸出構(gòu)建一棵python的句法樹(shù)。關(guān)于stanfordparser在第3章中有詳細(xì)介紹。
自然語(yǔ)言處理是非常熱門的研究領(lǐng)域因此每年吸引了非常多研究生。它集合了多個(gè)學(xué)科諸如語(yǔ)言學(xué),心理學(xué),計(jì)算科學(xué)和數(shù)學(xué)的優(yōu)勢(shì)來(lái)研究人類語(yǔ)言。另外選擇 NLP 作為研究生生涯更重要的原因是大量有意思的難題都沒(méi)有固定的解決辦法。舉個(gè)例子,機(jī)器翻譯初始問(wèn)題(original problem)的存在推動(dòng)了該領(lǐng)域的發(fā)展,即使經(jīng)過(guò)二十年誘人而又活躍的研究以后,這個(gè)難題依舊尚待解決。還有另外幾個(gè)前沿的 NLP 問(wèn)題目前已經(jīng)有大量的研究工作,其中一些列舉如下:
基于句法的機(jī)器翻譯:從過(guò)去的數(shù)十年到現(xiàn)在,絕大部分的機(jī)器翻譯都聚焦在使用統(tǒng)計(jì)方法通過(guò)大量語(yǔ)料庫(kù)來(lái)學(xué)習(xí)詞和短語(yǔ)的翻譯。然而,越來(lái)越多的研究者開(kāi)始在研究中加入句法[10]。
多文本摘要:目前大量工作都是利用計(jì)算機(jī)從相近的文檔集合[8]中自動(dòng)生成高度相關(guān)的摘要。這個(gè)任務(wù)被視為比單文本的摘要困難,因?yàn)槎辔谋局腥哂?a target="_blank">信息更多。
計(jì)算句法分析:雖然使用概率模型自動(dòng)生成給定文本的句法結(jié)構(gòu)由來(lái)已久,但進(jìn)步空間還很大。最大的挑戰(zhàn)是準(zhǔn)確的分析,當(dāng)英語(yǔ)拿來(lái)和中文[7]、阿拉伯語(yǔ)比較的時(shí)候,語(yǔ)言特性差異很大。
Python 和 NLTK 使每個(gè)編程人員不需要花費(fèi)大量時(shí)間在獲取資源上,直接可以接觸 NLP 任務(wù)。文本意在給任何對(duì)學(xué)習(xí) NLP 感興趣的人提供解決這些簡(jiǎn)單的任務(wù)例子和參考。
評(píng)論