Python編程使用NLTK進行自然語言處理詳解
自然語言處理是計算機科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個重要方向。自然語言工具箱(NLTK,NaturalLanguageToolkit)是一個基于Python語言的類庫,它也是當(dāng)前最為流行的自然語言編程與開發(fā)工具。在進行自然語言處理研究和應(yīng)用時,恰當(dāng)利用NLTK中提供的函數(shù)可以大幅度地提高效率。本文就將通過一些實例來向讀者介紹NLTK的使用。
NLTK
NaturalLanguageToolkit,自然語言處理工具包,在NLP領(lǐng)域中,最常使用的一個Python庫。
NLTK是一個開源的項目,包含:Python模塊,數(shù)據(jù)集和教程,用于NLP的研究和開發(fā) 。
NLTK由Steven Bird和Edward Loper在賓夕法尼亞大學(xué)計算機和信息科學(xué)系開發(fā)。
NLTK包括圖形演示和示例數(shù)據(jù)。其提供的教程解釋了工具包支持的語言處理任務(wù)背后的基本概念。
開發(fā)環(huán)境:我所使用的Python版本是最新的3.5.1,NLTK版本是3.2。Python的安裝不在本文的討論范圍內(nèi),我們略去不表。你可以從NLTK的官網(wǎng)上http://www.nltk.org/獲得最新版本的NLTK。Anyway,使用pip指令來完成NLTK包的下載和安裝無疑是最簡便的方法。
當(dāng)然,當(dāng)你完成這一步時,其實還不夠。因為NLTK是由許多許多的包來構(gòu)成的,此時運行Python,并輸入下面的指令(當(dāng)然,第一條指令還是要導(dǎo)入NLTK包)
>>> import nltk >>> nltk.download()
然后,Python Launcher會彈出下面這個界面,建議你選擇安裝所有的Packages,以免去日后一而再、再而三的進行安裝,也為你的后續(xù)開發(fā)提供一個穩(wěn)定的環(huán)境。某些包的Status顯示“out of date”,你可以不必理會,它基本不影響你的使用與開發(fā)。
既然你已經(jīng)安裝成功,我們來小試牛刀一下。當(dāng)然本文涉及的主要任務(wù)都是自然語言處理中最常用,最基礎(chǔ)的pre-processing過程,結(jié)合機器學(xué)習(xí)的高級應(yīng)用我們會在后續(xù)文章中再進行介紹。
1、SentencesSegment(分句)
也就是說我們手頭有一段文本,我們希望把它分成一個一個的句子。此時可以使用NLTK中的punktsentencesegmenter。來看示例代碼
>>> sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') >>> paragraph = "The first time I heard that song was in Hawaii on radio. ... I was just a kid, and loved it very much! What a fantastic song!" >>> sentences = sent_tokenizer.tokenize(paragraph) >>> sentences ['The first time I heard that song was in Hawaii on radio.', 'I was just a kid, and loved it very much!', 'What a fantastic song!']
由此,我們便把一段話成功分句了。
2、SentencesSegment(分詞)
接下來我們要把每個句話再切割成逐個單詞。最簡單的方法是使用NLTK包中的WordPuncttokenizer。來看示例代碼
>>> from nltk.tokenize import WordPunctTokenizer >>> sentence = "Are you old enough to remember Michael Jackson attending ... the Grammys with Brooke Shields and Webster sat on his lap during the show?" >>> words = WordPunctTokenizer().tokenize(sentence) >>> words ['Are', 'you', 'old', 'enough', 'to', 'remember', 'Michael', 'Jackson', 'attending', 'the', 'Grammys', 'with', 'Brooke', 'Shields', 'and', 'Webster', 'sat', 'on', 'his', 'lap', 'during', 'the', 'show', '?']
我們的分詞任務(wù)仍然完成的很好。除了WordPunct tokenizer之外,NLTK中還提供有另外三個分詞方法,
TreebankWordTokenizer,PunktWordTokenizer和WhitespaceTokenizer,而且他們的用法與WordPunct tokenizer也類似。然而,顯然我們并不滿足于此。對于比較復(fù)雜的詞型,WordPunct tokenizer往往并不勝任。此時我們需要借助正則表達式的強大能力來完成分詞任務(wù),此時我所使用的函數(shù)是regexp_tokenize()。來看下面這段話
>>> text = 'That U.S.A. poster-print costs $12.40...'
目前市面上可以參考的在Python下進行自然語言處理的書籍是由Steven Bird、Ewan Klein、Edward Loper編寫的《Python 自然語言處理》。但是該書的編寫時間距今已有近十年的時間,由于軟件包更新等語言,在新環(huán)境下進行開發(fā)時,書中的某些代碼并不能很正常的運行。最后,我們舉一個書中代碼out of date的例子(對上面這就話進行分詞),并給出相應(yīng)的解決辦法。首先來看書中的一段節(jié)錄
>>> text = 'That U.S.A. poster-print costs $12.40...' >>> pattern = r'''''(?x) # set flag to allow verbose regexps ... ([A-Z]\.)+ # abbreviations, e.g. U.S.A. ... | \w+(-\w+)* # words with optional internal hyphens ... | \$?\d+(\.\d+)?%? # currency and percentages, e.g. $12.40, 82% ... | \.\.\. # ellipsis ... | [][.,;"'?():-_`] # these are separate tokens; includes ], [ ... ''' >>> nltk.regexp_tokenize(text, pattern)
我們預(yù)期得到輸出應(yīng)該是這樣的
['That', 'U.S.A.', 'poster-print', 'costs', '$12.40', '...']
但是我們實際得到的輸出卻是這樣的(注意我們所使用的NLTK版本)
[('', '', ''), ('A.', '', ''), ('', '-print', ''), ('', '', ''), ('', '', '.40'), ('', '', '')]
會出現(xiàn)這樣的問題是由于nltk.internals.compile_regexp_to_noncapturing()在V3.1版本的NLTK中已經(jīng)被拋棄(盡管在更早的版本中它仍然可以運行),為此我們把之前定義的pattern稍作修改
pattern = r"""(?x) # set flag to allow verbose regexps (?:[A-Z]\.)+ # abbreviations, e.g. U.S.A. |\d+(?:\.\d+)?%? # numbers, incl. currency and percentages |\w+(?:[-']\w+)* # words w/ optional internal hyphens/apostrophe |\.\.\. # ellipsis |(?:[.,;"'?():-_`]) # special characters with meanings """
再次執(zhí)行前面的語句,便會得到
>>> nltk.regexp_tokenize(text, pattern) ['That', 'U.S.A.', 'poster-print', 'costs', '12.40', '...']
以上便是我們對NLTK這個自然語言處理工具包的初步探索,日后主頁君將結(jié)合機器學(xué)習(xí)中的方法再來探討一些更為深入的應(yīng)用。最后,我想說《Python 自然語言處理》仍然是當(dāng)前非常值得推薦的一本講述利用NLTK和Python進行自然語言處理技術(shù)的非常值得推薦的書籍。
總結(jié)
以上就是本文關(guān)于Python編程使用NLTK進行自然語言處理詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
python中requests庫session對象的妙用詳解
python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
如有不足之處,歡迎留言指出。
相關(guān)文章
Python自動化辦公之讀取Excel數(shù)據(jù)的實現(xiàn)
這篇文章主要為大家詳細介紹了如何通過Python實現(xiàn)Excel數(shù)據(jù)的讀取,文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定幫助,需要的可以參考一下2022-05-05python機器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)(二)
這篇文章主要為大家詳細介紹了python機器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)第二篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Python爬取YY評級分數(shù)并保存數(shù)據(jù)實現(xiàn)過程解析
這篇文章主要介紹了Python爬取YY評級分數(shù)并保存數(shù)據(jù)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Python+ChatGPT實現(xiàn)5分鐘快速上手編程
最近一段時間chatGPT火爆出圈!無論是在互聯(lián)網(wǎng)行業(yè),還是其他各行業(yè)都賺足了話題。俗話說:“外行看笑話,內(nèi)行看門道”,今天從chatGPT個人體驗感受以及如何用的角度來分享一下2023-02-02