【自然語言處理篇】--以NLTK為基礎講解自然語?處理的原理
阿新 • • 發佈:2018-07-08
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_]+)", # 話題標簽 r‘http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[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為基礎講解自然語?處理的原理