入門系列之:Python3 如何使用NLTK處理語言數據

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~python

本文由冰糖葫蘆 發表於雲+社區專欄算法

介紹

文本已成爲最多見的表達形式之一。咱們天天都要發送電子郵件、短信、推文、更新狀態。所以,非結構化文本數據變得很是廣泛,分析大量文本數據如今是瞭解人們的想法的關鍵方法。數據庫

微博上的推文幫助咱們找到熱門新聞主題。淘寶的評論幫助用戶購買評價最高的產品。這些例子都是天然語言處理(NLP)任務的體現。編程

NLP屬於計算機科學領域,主要作人機互動。NLP技術用於分析文本,爲計算機提供了一種理解人類語言的方法。NLP應用程序的一些例子包括自動文本摘要、主題分隔和情感分析。json

本教程將介紹如何使用Natural Language Toolkit(NLTK):一個Python的NLP工具。bash

準備

首先,您應該安裝Python 3,並在計算機上設置一個本地編程環境。要充分利用本教程,您應該先熟悉Python編程語言,能夠參考騰訊雲開發手冊Python中文開發文檔和使用騰訊雲Python開發環境直接上機實驗。微信

第一步,導入NLTK

開始使用Python以前,先確保安裝了NLTK模塊。在命令行上,經過運行如下命令檢查NLTK:編程語言

$ python -c "import nltk"
複製代碼

若是已安裝NLTK,那麼這個命令將完成且沒有錯誤。如今,讓咱們確保您安裝了最新版本:編輯器

$ python -c "import nltk; print(nltk.__version__)"
複製代碼

您應該安裝版本3.2.1,由於咱們將使用須要此版本的NLTK Twitter軟件包。工具

若是未安裝NLTK,您將收到一條錯誤消息:

Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'nltk'
複製代碼

錯誤消息代表未安裝NLTK,因此請使用pip下載資料庫:

$ pip install nltk
複製代碼

接下來,咱們將下載咱們將在本教程中使用的數據和NLTK工具。

第二步,下載NLTK的數據和標記器

在本教程中,咱們將使用一個Twitter語料庫,該語料庫可經過NLTK下載。具體來講,咱們將使用NLTK的twitter_samples語料庫。讓咱們經過如下命令行來下載語料庫:

$ python -m nltk.downloader twitter_samples
複製代碼

若是命令成功運行,您應該看到如下輸出:

[nltk_data] Downloading package twitter_samples to
[nltk_data]	/Users/sammy/nltk_data...
[nltk_data] Unzipping corpora/twitter_samples.zip.
複製代碼

接下來,下載POS標記器。POS標記是對文本中的單詞進行標記的過程,使其與特定POS標記對應:名詞,動詞,形容詞,副詞等。在本教程中,咱們將使用NLTK的平均感知器標記器。平均感知器標記器使用感知器算法來預測最可能給出該單詞的POS標籤。讓咱們下載該標記器,以下所示:

$ python -m nltk.downloader averaged_perceptron_tagger
複製代碼

若是命令成功運行,您應該看到如下輸出:

[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data] /Users/sammy/nltk_data...
[nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.
複製代碼

讓咱們仔細檢查語料庫是否正確下載。在您的終端中,打開Python交互式環境:

$ python
複製代碼

在Python的交互式環境中,導入twitter_samples語料庫:

>>> from nltk.corpus import twitter_samples
複製代碼

NLTK的twitter語料庫目前包含從Twitter Streaming API檢索的20,000條推文樣本。完整推文以行分隔的JSON形式存儲。咱們能夠用twitter_samples.fileids()來查看語料庫中存在多少個JSON文件:

>>> twitter_samples.fileids()
複製代碼

輸出將以下所示:

[u'negative_tweets.json', u'positive_tweets.json',u'tweets.20150430-223406.json']
複製代碼

使用這些文件ID,咱們能夠返回推文字符串:

>>> twitter_samples.strings('tweets.20150430-223406.json')
複製代碼

運行它將返回大量輸出。它一般看起來像這樣:

[u'RT @KirkKus: Indirect cost of the UK being in the EU is estimated to be costing Britain \xa3170 billion per year! #BetterOffOut #UKIP'...]
複製代碼

如今咱們知道咱們的語料庫下載成功了。所以,讓咱們使用快捷鍵ctrl+D 退出Python交互式環境。

如今咱們能夠訪問twitter_samples語料庫,咱們能夠開始編寫腳原本處理推文了。

咱們腳本的目標是計算在twitter_samples語料庫的子集中出現形容詞和名詞的數量:

  • 名詞,根據它最基本的定義,一般指一我的、地方或者事物。例如,電影書籍漢堡都是名詞。計算名詞能夠幫助肯定正在討論的主題數量。
  • **形容詞,**是修飾名詞(或代詞)的詞,例如:一個恐怖的電影,有趣的書,或者美味的漢堡。計算形容詞能夠決定使用什麼類型的語言。

您能夠稍後擴展此腳本以計算正面形容詞(偉大的使人敬畏的快樂的等)與負面形容詞(無聊蹩腳悲傷等),可用於分析推文的情緒或關於產品或電影的評論。此腳本提供的數據能夠反過來用於與該產品或電影相關的決策。

咱們將在下一步開始咱們的腳本。

第三步,把句子分詞

首先,在您選擇的文本編輯器中,建立咱們將要使用的腳本並調用它nlp.py。

在咱們的文件中,首先導入語料庫。而後建立一個tweets變量並從positive_tweets.json文件把它分配到推文字符串列表。

nlp.py
from nltk.corpus import twitter_samples
tweets = twitter_samples.strings('positive_tweets.json')
複製代碼

當咱們第一次加載推文列表時,每條推文都用一個字符串來表示。在咱們肯定推文中哪些詞是形容詞或名詞以前,咱們首先須要對咱們的推文進行分詞。

Tokenization是將一系列字符串分解爲單詞、關鍵字、短語、符號和其餘元素,咱們稱之爲分詞。讓咱們建立一個名爲tweets_tokens的新變量,爲其分配分詞的推文列表:

nlp.py
from nltk.corpus import twitter_samples
tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')
複製代碼

這個新變量tweets_tokens是一個列表,其中每一個元素都是一個分詞列表。如今咱們有了每條推文的分詞,咱們能夠用適當的POS標籤標記這些分詞。

第四步,標記句子

爲了訪問NLTK的POS標記器,咱們須要導入它。全部import語句都必須在腳本的開頭。讓咱們把這個新的導入放在另外一個導入聲明中。

nlp.py
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')
複製代碼

如今,咱們能夠標記每一個token 。NLTK容許咱們使用如下方式一次完成全部操做:pos_tag_sents()。咱們將建立一個新變量tweets_tagged,來存儲標記列表。這個新行能夠直接放在咱們當前腳本的末尾:

tweets_tagged = pos_tag_sents(tweets_tokens)
複製代碼

要想知道標記的token長什麼樣,這是咱們tweets_tagged列表中的第一個元素:

[(u'#FollowFriday', 'JJ'), (u'@France_Inte', 'NNP'), (u'@PKuchly57','NNP'),(u'@Milipol_Paris', 'NNP'), (u'for', 'IN'), (u'being', 'VBG'), (u'top', 'JJ'),(u'engaged', 'VBN'), (u'members', 'NNS'), (u'in', 'IN'), (u'my', 'PRP$'),(u'community', 'NN'), (u'this', 'DT'), (u'week', 'NN'), (u':)', 'NN')]
複製代碼

咱們能夠看到咱們的推文被表示爲一個列表,對於每一個token,咱們都有關於其POS標籤的信息。每一個token/標記對都保存爲元組。

在NLTK中,形容詞的縮寫是JJ。

所述標記器NLTK標記單數名詞(NN),複數名詞(NNS)。爲簡化起見,咱們只會經過跟蹤NN標記來計算單數名詞。

在下一步中,咱們將計算在咱們的語料庫中出現多少次JJ和NN。

第五步,計算POS標籤

咱們將使用累加器(計數)變量跟蹤JJ並NN出現的次數,並在每次找到標記時不斷添加該變量。首先讓咱們在腳本的底部建立計數,咱們將首先設置爲零。

nlp.py
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0
複製代碼

在咱們建立變量以後,咱們將建立兩個for循環。第一個循環將迭代列表中的每一個推文。第二個循環將經過每一個推文中的每一個token /標籤對進行迭代。對於每對,咱們將使用適當的元組索引查找標記。

而後,使用條件語句檢查標籤是否匹配字符串'JJ'或'NN'。若是標記匹配,咱們將add(+=1)添加到適當的累加器。

nlp.py
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

for tweet in tweets_tagged:
	for pair in tweet:
		tag = pair[1]
		if tag == 'JJ':
			JJ_count += 1
		elif tag == 'NN':
			NN_count += 1
複製代碼

在兩個循環完成後,語料庫中會看到形容詞和名詞的總數。想要查看咱們的腳本找到多少個形容詞和名詞的話,在腳本末尾添加print語句。

nlp.py
...
for tweet in tweets_tagged:
	for pair in tweet:
		tag = pair[1]
		if tag == 'JJ':
			JJ_count += 1
		elif tag == 'NN':
			NN_count += 1
print('Total number of adjectives = ', JJ_count)
print('Total number of nouns =', NN_count)
複製代碼

如今,咱們的程序可以輸出在語料庫中找到的形容詞和名詞的數量了。

第六步,運行NLP腳本

保存nlp.py文件並運行它來查看咱們找到多少個形容詞和名詞:

$ python nlp.py
複製代碼

請耐心等待,腳本運行可能須要幾秒鐘。若是一切順利,當咱們運行腳本時,咱們應該獲得如下輸出:

Total number of adjectives = 6094
Total number of nouns = 13180
複製代碼

若是您的輸出也是這樣,則表示您已成功完成本教程啦!

完整的代碼

對於咱們完整的代碼,咱們添加一些註釋。咱們的腳本以下所示:

nlp.py
# Import data and tagger
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

# Load tokenized tweets
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

# Tag tagged tweets
tweets_tagged = pos_tag_sents(tweets_tokens)

# Set accumulators
JJ_count = 0
NN_count = 0

# Loop through list of tweets
for tweet in tweets_tagged:
	for pair in tweet:
		tag = pair[1]
		if tag == 'JJ':
			JJ_count += 1
		elif tag == 'NN':
			NN_count += 1
# Print total numbers for each adjectives and nouns
print('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)
複製代碼

咱們在本教程中使用了經過NLTK下載的Twitter語料庫,但您能夠讀取本身的數據。如今,您能夠擴展代碼以計算複數和單數名詞,對形容詞進行情感分析,或使用matplotlib可視化您的數據。

結論

在本教程中,您學習了一些天然語言處理技術,以使用Python中的NLTK庫分析文本。如今,您能夠在Python中下載語料庫、token 、標記和計數POS標記。您能夠利用本教程來簡化在Python中處理本身的文本數據的過程。若是您對NLP感興趣, 能夠訪問騰訊雲學院天然語言處理相關課程


參考文獻:《How To Work with Language Data in Python 3 using the Natural Language Toolkit (NLTK)》

問答

使用NLP進行句子壓縮?

相關閱讀

Nginx的安裝和配置疑難解答

如何備份你的MySQL數據庫

MySQL 8.0 版本功能變動介紹

此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1161355?fromSource=waitui

歡迎你們前往騰訊雲+社區或關注雲加社區微信公衆號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索