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