1. 程式人生 > >【自然語言處理篇】--以NLTK為基礎講解自然語?處理的原理

【自然語言處理篇】--以NLTK為基礎講解自然語?處理的原理

pytho 沒有 正則表達 emma lower art pro 轉換 算法

一、前述

Python上著名的?然語?處理庫?帶語料庫,詞性分類庫?帶分類,分詞,等等功能強?的社區?持,還有N多的簡單版wrapper。

二、文本預處理

1、安裝nltk

pip install -U nltk

安裝語料庫 (一堆對話,一對模型)

import nltk
nltk.download()

技術分享圖片

2、功能一覽表:

技術分享圖片

3、文本處理流程

技術分享圖片

4、Tokenize 把長句?拆成有“意義”的?部件

技術分享圖片

import jieba
seg_list = jieba.cut("我來到北北京清華?大學", cut_all=True)
print "Full Mode:", "/ "
.join(seg_list) # 全模式 seg_list = jieba.cut("我來到北北京清華?大學", cut_all=False) print "Default Mode:", "/ ".join(seg_list) # 精確模式 seg_list = jieba.cut("他來到了了?網易易杭研?大廈") # 默認是精確模式 print ", ".join(seg_list) seg_list = jieba.cut_for_search("?小明碩?士畢業於中國科學院計算所,後在?日本京都?大學深造") # 搜索引擎模式 print ", ".join(seg_list)

結果:

【全模式】: 我/ 來到/ 北北京/ 清華/ 清華?大學/ 華?大/ ?大學
【精確模式】: 我/ 來到/ 北北京/ 清華?大學
【新詞識別】:他, 來到, 了了, ?網易易, 杭研, ?大廈
(此處,“杭研”並沒有在詞典中,但是也被Viterbi算法識別出來了了)
【搜索引擎模式】: ?小明, 碩?士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算,
計算所, 後, 在, ?日本, 京都, ?大學, ?日本京都?大學, 深造

社交?絡語?的tokenize:

import re
emoticons_str = r"""
(?:
[:=;] # 眼睛
[oO\-]? # ?鼻?子
[D\)\]\(\]/\\OpP] # 嘴
)
""" regex_str = [ emoticons_str, r<[^>]+>, # HTML tags r(?:@[\w_]+), # @某?人 r"(?:\#+[\w_]+[\w\‘_\-]*[\w_]+)", # 話題標簽 rhttp[s]?://(?:[a-z]|[0-9]|[$-_@.&amp;+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+, # URLs r(?:(?:\d+,?)+(?:\.?\d+)?), # 數字 r"(?:[a-z][a-z‘\-_]+[a-z])", # 含有 - 和 ‘ 的單詞 r(?:[\w_]+), # 其他 r(?:\S) # 其他 ]

正則表達式對照表
http://www.regexlab.com/zh/regref.htm

這樣能處理社交語言中的表情等符號:

tokens_re = re.compile(r(+|.join(regex_str)+), re.VERBOSE | re.IGNORECASE)
emoticon_re = re.compile(r^+emoticons_str+$, re.VERBOSE | re.IGNORECASE)
def tokenize(s):
return tokens_re.findall(s)
def preprocess(s, lowercase=False):
tokens = tokenize(s)
if lowercase:
tokens = [token if emoticon_re.search(token) else token.lower() for token in
tokens]
return tokens
tweet = RT @angelababy: love you baby! :D http://ah.love #168cm
print(preprocess(tweet))
# [‘RT‘, ‘@angelababy‘, ‘:‘, ‘love‘, ‘you‘, ‘baby‘,
# ’!‘, ‘:D‘, ‘http://ah.love‘, ‘#168cm‘]

5、詞形歸?化

Stemming 詞?提取:?般來說,就是把不影響詞性的inflection的?尾巴砍掉
walking 砍ing = walk
walked 砍ed = walk
Lemmatization 詞形歸?:把各種類型的詞的變形,都歸為?個形式
went 歸? = go
are 歸? = be

>>> from nltk.stem.porter import PorterStemmer
>>> porter_stemmer = PorterStemmer()
>>> porter_stemmer.stem(‘maximum’)
u’maximum’
>>> porter_stemmer.stem(‘presumably’)
u’presum’
>>> porter_stemmer.stem(‘multiply’)
u’multipli’
>>> porter_stemmer.stem(‘provision’)
u’provis’
>>> from nltk.stem import SnowballStemmer
>>> snowball_stemmer = SnowballStemmer(“english”)
>>> snowball_stemmer.stem(‘maximum’)
u’maximum’
>>> snowball_stemmer.stem(‘presumably’)
u’presum’
>>> from nltk.stem.lancaster import LancasterStemmer
>>> lancaster_stemmer = LancasterStemmer()
>>> lancaster_stemmer.stem(‘maximum’)
‘maxim’
>>> lancaster_stemmer.stem(‘presumably’)
‘presum’
>>> lancaster_stemmer.stem(‘presumably’)
‘presum’
>>> from nltk.stem.porter import PorterStemmer
>>> p = PorterStemmer()
>>> p.stem(went)
went
>>> p.stem(wenting)
went

6、詞性Part-Of-Speech

技術分享圖片

>>> import nltk
>>> text = nltk.word_tokenize(what does the fox say)
>>> text
[what, does, the, fox, say]
>>> nltk.pos_tag(text)
[(what, WDT), (does, VBZ), (the, DT), (fox, NNS), (say, VBP)]

7、Stopwords

?先記得在console??下載?下詞庫
或者 nltk.download(‘stopwords’)
from nltk.corpus import stopwords
# 先token?一把,得到?一個word_list
# ...
# 然後filter?一把
filtered_words =
[word for word in word_list if word not in stopwords.words(english)]

8、?條?本預處理流?線

技術分享圖片

三、自然語言處理應用。

實際上預處理就是將文本轉換為Word_List,自然語言處理再轉變成計算機能識別的語言。

技術分享圖片

自然語言處理有以下幾個應用:情感分析,?本相似度, ?本分類

【自然語言處理篇】--以NLTK為基礎講解自然語?處理的原理