1. 程式人生 > >NLTK學習之一:簡單文字分析

NLTK學習之一:簡單文字分析

nltk的全稱是natural language toolkit,是一套基於python的自然語言處理工具集。

1 NLTK的安裝

nltk的安裝十分便捷,只需要pip就可以。

pip install nltk

在nltk中集成了語料與模型等的包管理器,通過在python直譯器中執行

>>> import nltk
>>> nltk.download()

便會彈出下面的包管理介面,在管理器中可以下載語料,預訓練的模型等。
nltk_download

2 對文字進行簡單的分析

2.1 Text類介紹

nltk.text.Text()類用於對文字進行初級的統計與分析,它接受一個詞的列表作為引數。Text類提供了下列方法。

方法 作用
Text(words) 物件構造
concordance(word, width=79, lines=25) 顯示word出現的上下文
common_contexts(words) 顯示words出現的相同模式
similar(word) 顯示word的相似詞
collocations(num=20, window_size=2) 顯示最常見的二詞搭配
count(word) word出現的詞數
dispersion_plot(words) 繪製words中文件中出現的位置圖
vocab() 返回文章去重的詞典

nltk.text.TextCollection類是Text的集合,提供下列方法

方法 作用
nltk.text.TextCollection([text1,text2,]) 物件構造
idf(term) 計算詞term在語料庫中的逆文件頻率,即logterm
tf(term,text) 統計term在text中的詞頻
tf_idf(term,text) 計算term在句子中的tf_idf,即tf*idf

2.2 示例

下面我們對青春愛情小說《被遺忘的時光》做下簡單的分析。首先載入文字:

import ntlk
import jieba

raw=open('forgotten_times.txt').read()
text=nltk.text.Text(jieba.lcut(raw))

對於言情小說,先看下風花雪月這樣的詞出現的情況

print text.concordance(u'風花雪月')

輸出如下:

>>> Displaying 2 of 2 matches:
彼時 校園 民謠 不復 大熱 了 , 但 處身 校園 , 喜歡 吟唱 風花雪月 的 感性 青年 還是 喜歡 藉此 抒懷 。 邵伊敏 平常 聽 英語歌 較
的 眼睛 看 的 是 自己 , 迷戀 的 卻 多半 只是 少女 心中 的 風花雪月 , 而 迷戀 過後 不可避免 不是 失望 就是 幻滅 。 他 將 目光

再看下作者對於某些同義詞的使用習慣

print text.common_contexts([u'一起',u'一同'])

輸出如下:

>>> 爺爺奶奶_生活 在_時

下面看下文章常用的二詞搭配

text.collocations()

輸出

出入境 管理處; 沃爾沃 XC90; 慢吞吞 爬起來; 沒交過 男朋友; 邵伊敏 回頭一看; 戴維凡 哭笑不得; 沒想到 邵伊敏; 邵伊敏 第二天; 邵伊敏 沒想到

檢視關心的詞在文中出現的位置

text.dispersion_plot([u'校園',u'大學'])

輸出如下圖:
nltk_disp_plot

3 對文件用詞進行分佈統計

3.1 FreqDist類介紹

這個類主要記錄了每個詞出現的次數,根據統計資料生成表格,或繪圖。其結構很簡單,用一個有序詞典進行實現。所以dict型別的方法在此類也是適用的。如keys()等。

方法 作用
B() 返回詞典的長度
plot(title,cumulative=False) 繪製頻率分佈圖,若cumu為True,則是累積頻率分佈圖
tabulate() 生成頻率分佈的表格形式
most_common() 返回出現次數最頻繁的詞與頻度
hapaxes() 返回只出現過一次的詞

3.2 示例

對歌曲《The day you went away》的歌詞進行分析。

text = open('corpus/the_day_you_went_away.txt').read()
fdist = nltk.FreqDist(nltk.word_tokenize(text))
fdist.plot(30,cumulative=True)

程式碼第二行呼叫了word_tokenize()函式,此函式的作用是基於空格/標點等對文字進行分詞,返回分詞後的列表。如果要處理中文,需要三方的分詞器先處理,之後才能使用nltk進行處理。執行輸出分佈圖如下:
nltk_word_dist

4 nltk自帶的語料庫

在nltk.corpus包下,提供了幾類標註好的語料庫。見下表:

語料庫 說明
gutenberg 一個有若干萬部的小說語料庫,多是古典作品
webtext 收集的網路廣告等內容
nps_chat 有上萬條聊天訊息語料庫,即時聊天訊息為主
brown 一個百萬詞級的英語語料庫,按文體進行分類
reuters 路透社語料庫,上萬篇新聞方檔,約有1百萬字,分90個主題,並分為訓練集和測試集兩組
inaugural 演講語料庫,幾十個文字,都是總統演說

更多語料庫,可以用nltk.download()在下載管理器中檢視corpus。

4.1語料庫處理

方法明 說明
fileids() 返回語料庫中檔名列表
fileids[categories] 返回指定類別的檔名列表
raw(fid=[c1,c2]) 返回指定檔名的文字字串
raw(catergories=[]) 返回指定分類的原始文字
sents(fid=[c1,c2]) 返回指定檔名的語句列表
sents(catergories=[c1,c2]) 按分類返回語句列表
words(filename) 返回指定檔名的單詞列表
words(catogories=[]) 返回指定分類的單詞列表

5 文字預處理

NLP在獲取語料之後,通常要進行文字預處理。英文的預處理包括:分詞,去停詞,提取詞幹等步驟。中文的分詞相對於英文更復雜一些,也需要去停詞。但沒有提取詞幹的需要。
對於英文去停詞的支援,在corpus下包含了一個stopword的停詞庫。
對於提取詞詞幹,提供了Porter和Lancaster兩個stemer。另個還提供了一個WordNetLemmatizer做詞形歸併。Stem通常基於語法規則使用正則表示式來實現,處理的範圍廣,但過於死板。而Lemmatizer實現採用基於詞典的方式來解決,因而更慢一些,處理的範圍和詞典的大小有關。

porter = nltk.PorterStemmer()
porter.stem('lying') #'lie'

lema=nltk.WordNetLemmatizer()
lema.lemmatize('women')   #'woman'