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

騰訊雲加社群發表於2018-07-24

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文由冰糖葫蘆 發表於雲+社群專欄

介紹

文字已成為最常見的表達形式之一。我們每天都要傳送電子郵件、簡訊、推文、更新狀態。因此,非結構化文字資料變得非常普遍,分析大量文字資料現在是瞭解人們的想法的關鍵方法。

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

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

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

準備

首先,您應該安裝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),第一時間獲取更多海量技術實踐乾貨哦~

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

相關文章