NLTK文本預(yù)處理與文本分析

本文主要介紹Python中NLTK文本分析的內(nèi)容蝌矛,咱先來(lái)看看文本分析的整個(gè)流程:

原始文本 - 分詞 - 詞性標(biāo)注 - 詞形歸一化 - 去除停用詞 - 去除特殊字符 - 單詞大小寫轉(zhuǎn)換 - 文本分析

一训唱、分詞

使用DBSCAN聚類算法的英文介紹文本為例:

from nltk import word_tokenize
sentence = "DBSCAN - Density-Based Spatial Clustering of Applications with Noise. Finds core samples of high density and expands clusters from them. Good for data which contains clusters of similar density "
token_words = word_tokenize(sentence)
print(token_words)

輸出分詞結(jié)果:

['DBSCAN', '-', 'Density-Based', 'Spatial', 'Clustering', 'of', 'Applications', 'with', 'Noise', '.', 'Finds', 'core', 'samples', 'of', 'high', 'density', 'and', 'expands', 'clusters', 'from', 'them', '.', 'Good', 'for', 'data', 'which', 'contains', 'clusters', 'of', 'similar', 'density']

二薯蝎、詞性標(biāo)注

為什么要進(jìn)行詞性標(biāo)注倦挂?咱先來(lái)看看不做詞性標(biāo)注豺撑,直接按照第一步分詞結(jié)果進(jìn)行詞形歸一化的情形:

常見詞形歸一化有兩種方式(詞干提取與詞形歸并):

1逼肯、詞干提取

from nltk.stem.lancaster import LancasterStemmer
lancaster_stemmer = LancasterStemmer()
words_stemmer = [lancaster_stemmer.stem(token_word) for token_word in token_words]
print(words_stemmer)

輸出結(jié)果:

['dbscan', '-', 'density-based', 'spat', 'clust', 'of', 'apply', 'with', 'nois', '.', 'find', 'cor', 'sampl', 'of', 'high', 'dens', 'and', 'expand', 'clust', 'from', 'them', '.', 'good', 'for', 'dat', 'which', 'contain', 'clust', 'of', 'simil', 'dens']

說明:詞干提取默認(rèn)提取單詞詞根阱当,容易得出一些不具實(shí)際意義的單詞沟突,比如上面的”Spatial“變?yōu)椤眘pat“,”Noise“變?yōu)椤眓ois“丈积,在常規(guī)文本分析中沒意義筐骇,在信息檢索中用該方法會(huì)比較合適。

2江滨、詞形歸并(單詞變體還原)

from nltk.stem import WordNetLemmatizer
wordnet_lematizer = WordNetLemmatizer()
words_lematizer = [wordnet_lematizer.lemmatize(token_word) for token_word in token_words]
print(words_lematizer)

輸出結(jié)果:

['DBSCAN', '-', 'Density-Based', 'Spatial', 'Clustering', 'of', 'Applications', 'with', 'Noise', '.', 'Finds', 'core', 'sample', 'of', 'high', 'density', 'and', 'expands', 'cluster', 'from', 'them', '.', 'Good', 'for', 'data', 'which', 'contains', 'cluster', 'of', 'similar', 'density']

說明:這種方法主要在于將過去時(shí)铛纬、將來(lái)時(shí)、第三人稱等單詞還原為原始詞唬滑,不會(huì)產(chǎn)生詞根這些無(wú)意義的單詞饺鹃,但是仍存在有些詞無(wú)法還原的情況,比如“Finds”间雀、“expands”、”contains“仍是第三人稱的形式镊屎,原因在于wordnet_lematizer.lemmatize函數(shù)默認(rèn)將其當(dāng)做一個(gè)名詞惹挟,以為這就是單詞原型,如果我們?cè)谑褂迷摵瘮?shù)時(shí)指明動(dòng)詞詞性缝驳,就可以將其變?yōu)椤眂ontain“了连锯。所以要先進(jìn)行詞性標(biāo)注獲取單詞詞性(詳情如下)归苍。

3、詞性標(biāo)注

先分詞运怖,再詞性標(biāo)注:

from nltk import word_tokenize,pos_tag
sentence = "DBSCAN - Density-Based Spatial Clustering of Applications with Noise. Finds core samples of high density and expands clusters from them. Good for data which contains clusters of similar density"
token_word = word_tokenize(sentence)  #分詞
token_words = pos_tag(token_word)     #詞性標(biāo)注
print(token_words)

輸出結(jié)果:

[('DBSCAN', 'NNP'), ('-', ':'), ('Density-Based', 'JJ'), ('Spatial', 'NNP'), ('Clustering', 'NNP'), ('of', 'IN'), ('Applications', 'NNP'), ('with', 'IN'), ('Noise', 'NNP'), ('.', '.'), ('Finds', 'NNP'), ('core', 'NN'), ('samples', 'NNS'), ('of', 'IN'), ('high', 'JJ'), ('density', 'NN'), ('and', 'CC'), ('expands', 'VBZ'), ('clusters', 'NNS'), ('from', 'IN'), ('them', 'PRP'), ('.', '.'), ('Good', 'JJ'), ('for', 'IN'), ('data', 'NNS'), ('which', 'WDT'), ('contains', 'VBZ'), ('clusters', 'NNS'), ('of', 'IN'), ('similar', 'JJ'), ('density', 'NN')]

說明:列表中每個(gè)元組第二個(gè)元素顯示為該詞的詞性拼弃,具體每個(gè)詞性注釋可運(yùn)行代碼”nltk.help.upenn_tagset()“或參看說明文檔:詞性標(biāo)簽說明

三、詞形歸一化(指明詞性)

from nltk.stem import WordNetLemmatizer
words_lematizer = []
wordnet_lematizer = WordNetLemmatizer()
for word, tag in token_words:
    if tag.startswith('NN'):
        word_lematizer =  wordnet_lematizer.lemmatize(word, pos='n')  # n代表名詞
    elif tag.startswith('VB'): 
        word_lematizer =  wordnet_lematizer.lemmatize(word, pos='v')   # v代表動(dòng)詞
    elif tag.startswith('JJ'): 
        word_lematizer =  wordnet_lematizer.lemmatize(word, pos='a')   # a代表形容詞
    elif tag.startswith('R'): 
        word_lematizer =  wordnet_lematizer.lemmatize(word, pos='r')   # r代表代詞
    else: 
        word_lematizer =  wordnet_lematizer.lemmatize(word)
    words_lematizer.append(word_lematizer)
print(words_lematizer)

輸出結(jié)果:

['DBSCAN', '-', 'Density-Based', 'Spatial', 'Clustering', 'of', 'Applications', 'with', 'Noise', '.', 'Finds', 'core', 'sample', 'of', 'high', 'density', 'and', 'expand', 'cluster', 'from', 'them', '.', 'Good', 'for', 'data', 'which', 'contain', 'cluster', 'of', 'similar', 'density']

說明:可以看到單詞變體已經(jīng)還原成單詞原型摇展,如“Finds”吻氧、“expands”、”contains“均已變?yōu)楦髯缘脑汀?/p>

四咏连、去除停用詞

經(jīng)過分詞與詞形歸一化之后盯孙,得到各個(gè)詞性單詞的原型,但仍存在一些無(wú)實(shí)際意義的介詞祟滴、量詞等在文本分析中不重要的詞(這類詞在文本分析中稱作停用詞)振惰,需要將其去除。

from nltk.corpus import stopwords 
cleaned_words = [word for word in words_lematizer if word not in stopwords.words('english')]
print('原始詞:', words_lematizer)
print('去除停用詞后:', cleaned_words)

輸出結(jié)果:

原始詞: ['DBSCAN', '-', 'Density-Based', 'Spatial', 'Clustering', 'of', 'Applications', 'with', 'Noise', '.', 'Finds', 'core', 'sample', 'of', 'high', 'density', 'and', 'expand', 'cluster', 'from', 'them', '.', 'Good', 'for', 'data', 'which', 'contain', 'cluster', 'of', 'similar', 'density']
去除停用詞后: ['DBSCAN', '-', 'Density-Based', 'Spatial', 'Clustering', 'Applications', 'Noise', '.', 'Finds', 'core', 'sample', 'high', 'density', 'expand', 'cluster', '.', 'Good', 'data', 'contain', 'cluster', 'similar', 'density']

說明:of垄懂、for骑晶、and這類停用詞已被去除。

五草慧、去除特殊字符

標(biāo)點(diǎn)符號(hào)在文本分析中也是不需要的桶蛔,也將其剔除,這里我們采用循環(huán)列表判斷的方式來(lái)剔除冠蒋,可自定義要去除的標(biāo)點(diǎn)符號(hào)羽圃、要剔除的特殊單詞也可以放在這將其剔除,比如咱將"DBSCAN"也連同標(biāo)點(diǎn)符號(hào)剔除抖剿。

characters = [',', '.','DBSCAN', ':', ';', '?', '(', ')', '[', ']', '&', '!', '*', '@', '#', '$', '%','-','...','^','{','}']
words_list = [word for word in cleaned_words if word not in characters]
print(words_list)

輸出結(jié)果:

['Density-Based', 'Spatial', 'Clustering', 'Applications', 'Noise', 'Finds', 'core', 'sample', 'high', 'density', 'expand', 'cluster', 'Good', 'data', 'contain', 'cluster', 'similar', 'density']

說明:處理后的單詞列表已不存在“-”朽寞、“.”等特殊字符。

六斩郎、大小寫轉(zhuǎn)換

為防止同一個(gè)單詞同時(shí)存在大小寫而算作兩個(gè)單詞的情況脑融,還需要統(tǒng)一單詞大小寫(此處統(tǒng)一為小寫)。

words_lists = [x.lower() for x in words_list ]
print(words_lists)

輸出結(jié)果:

['density-based', 'spatial', 'clustering', 'applications', 'noise', 'finds', 'core', 'sample', 'high', 'density', 'expand', 'cluster', 'good', 'data', 'contain', 'cluster', 'similar', 'density']

七缩宜、文本分析

經(jīng)以上六步的文本預(yù)處理后肘迎,已經(jīng)得到干凈的單詞列表做文本分析或文本挖掘(可轉(zhuǎn)換為DataFrame之后再做分析)。

統(tǒng)計(jì)詞頻(這里我們以統(tǒng)計(jì)詞頻為例):

from nltk import FreqDist    
freq = FreqDist(words_lists)   
for key,val in freq.items():
    print (str(key) + ':' + str(val))

輸出結(jié)果:

density-based:1
spatial:1
clustering:1
applications:1
noise:1
finds:1
core:1
sample:1
high:1
density:2
expand:1
cluster:2
good:1
data:1
contain:1
similar:1

可視化(折線圖):

freq.plot(20,cumulative=False)
詞頻

可視化(詞云):

繪制詞云需要將單詞列表轉(zhuǎn)換為字符串

words = ' '.join(words_lists)
words

輸出結(jié)果:

'density-based spatial clustering applications noise finds core sample high density expand cluster good data contain cluster similar density'

繪制詞云

from wordcloud import WordCloud
from imageio import imread
import matplotlib.pyplot as plt
pic = imread('./picture/china.jpg')
wc = WordCloud(mask = pic,background_color = 'white',width=800, height=600)
wwc = wc.generate(words)
plt.figure(figsize=(10,10))
plt.imshow(wwc)
plt.axis("off")
plt.show()
詞頻

文本分析結(jié)論:根據(jù)折線圖或詞云锻煌,咱可以直觀看到“density”與“cluster”兩個(gè)單詞出現(xiàn)最多妓布,詞云中字體越大。

謝謝宋梧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匣沼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捂龄,更是在濱河造成了極大的恐慌释涛,老刑警劉巖加叁,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唇撬,居然都是意外死亡它匕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門窖认,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豫柬,“玉大人,你說我怎么就攤上這事耀态÷职” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵首装,是天一觀的道長(zhǎng)创夜。 經(jīng)常有香客問我,道長(zhǎng)仙逻,這世上最難降的妖魔是什么驰吓? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮系奉,結(jié)果婚禮上檬贰,老公的妹妹穿的比我還像新娘。我一直安慰自己缺亮,他們只是感情好翁涤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萌踱,像睡著了一般葵礼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上并鸵,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天鸳粉,我揣著相機(jī)與錄音,去河邊找鬼园担。 笑死届谈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弯汰。 我是一名探鬼主播艰山,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咏闪!你這毒婦竟也來(lái)了程剥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎织鲸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溪胶,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搂擦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哗脖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瀑踢。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖才避,靈堂內(nèi)的尸體忽然破棺而出橱夭,到底是詐尸還是另有隱情,我是刑警寧澤桑逝,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布棘劣,位于F島的核電站,受9級(jí)特大地震影響楞遏,放射性物質(zhì)發(fā)生泄漏茬暇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一寡喝、第九天 我趴在偏房一處隱蔽的房頂上張望糙俗。 院中可真熱鬧,春花似錦预鬓、人聲如沸巧骚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)劈彪。三九已至,卻和暖如春蟋定,著一層夾襖步出監(jiān)牢的瞬間粉臊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工驶兜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扼仲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓抄淑,卻偏偏與公主長(zhǎng)得像屠凶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肆资,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 2018.06.13 星期三 天氣:雨加冰雹 今天干活時(shí)矗愧,他們?cè)诹奶欤晃徽f他去干活,老板多給...
    三七李心宇媽媽閱讀 355評(píng)論 2 3
  • 初三迎喜神之后,年的氣息便開始散去属愤,直至恢復(fù)平常女器。唯有遠(yuǎn)處時(shí)不時(shí)的炮聲,不厭其煩的訴說著節(jié)日的歡快住诸,也在激發(fā)著小孩...
    厚樸HOPE_閱讀 330評(píng)論 0 3
  • 電視開在高爾夫頻道驾胆,有一眼沒一眼地看著比賽。二杯白葡萄酒下了肚贱呐,微醺正好丧诺,但第三杯繼續(xù)。兩個(gè)爐子上燉著好吃的銀耳紅...
    楓葉國(guó)的雪君閱讀 343評(píng)論 0 0