(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3, jieba 0.39)python
分詞過程能夠認爲是天然語言處理(NLP)的第一步,在咱們獲取了文本數據集後,首先要作的就是將文本句子分割成各類單詞,下面介紹各類經常使用的分詞工具。git
NLP能夠對句子進行分割,也就將一整段文本分割成幾句話,常常是以句子結尾符號爲標誌來分割。這些符號包括有問號,感嘆號,句號等。(逗號不會分割。)以下演示代碼github
# 對句子進行分割(tokenization) from nltk.tokenize import sent_tokenize text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action." sent_list=sent_tokenize(text) print(sent_list) # 句子結尾符號爲標誌分割
-------------------------------------輸---------出--------------------------------機器學習
['Are you curious about tokenization?', "Let's see how it works!", 'We need to analyze, a couple of sentences with punctuations to see it in action.']工具
--------------------------------------------完-------------------------------------學習
能夠看出sent_tokenize以問號,感嘆號,句號來分割,可是中間的逗號卻留在原來的句子中,沒有分割。大數據
對句子進行分詞,是將一段文本,一句話或者幾個單詞分割成幾個單獨的單詞,分割的依據是空格,問號,逗號,句號等符號,代碼以下:搜索引擎
# 對句子進行分詞,即根據語義將一句話分紅多個單詞 from nltk.tokenize import word_tokenize text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action." word_list=word_tokenize(text) print(word_list) # 以空格,問號,感嘆號,句號等分割成單詞 # 分詞在NLP中很是重要,常常是NLP的第一步
-------------------------------------輸---------出--------------------------------雲計算
['Are', 'you', 'curious', 'about', 'tokenization', '?', 'Let', "'s", 'see', 'how', 'it', 'works', '!', 'We', 'need', 'to', 'analyze', ',', 'a', 'couple', 'of', 'sentences', 'with', 'punctuations', 'to', 'see', 'it', 'in', 'action', '.']人工智能
--------------------------------------------完-------------------------------------
WordPunctTokenizer的結果基本和上面的word_tokenize結果一致,不一樣的地方在於WordPunctTokenizer分詞器能夠將標點符號保留到不一樣的句子標記中。代碼以下:
# 還有一個分詞方法:WordPunct分詞器,能夠將標點符號保留到不一樣的句子標記中 from nltk.tokenize import WordPunctTokenizer text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action." word_punct=WordPunctTokenizer() word_punct_list=word_punct.tokenize(text) print(word_punct_list)
-------------------------------------輸---------出--------------------------------
['Are', 'you', 'curious', 'about', 'tokenization', '?', 'Let', "'", 's', 'see', 'how', 'it', 'works', '!', 'We', 'need', 'to', 'analyze', ',', 'a', 'couple', 'of', 'sentences', 'with', 'punctuations', 'to', 'see', 'it', 'in', 'action', '.']
--------------------------------------------完-------------------------------------
經過和上面的word_tokenize結果結果進行比較能夠發現,惟一的不一樣就是Let's分割時不一樣,WordPunctTokenizer將Let's分割爲三個單詞,而word_tokenize卻分割成兩個單詞。通常狀況下,這一點區別意義不大,故而word_tokenize用得跟多一些。
(注意:雖然在《Python機器學習經典實例》中提到還有一個分詞器PunktWordTokenizer,可是這個分詞器已經棄用了,就連import都會出錯,故而此處不講解。)
上面的幾個分詞器對英文很是好用,可是很遺憾,對中文不能分詞成功,我本身嘗試過。對英文的分詞很簡單,由於是以空格做爲天然分解符,但是中文卻不是的,中文要分紅單詞而不是漢字。
對於中文分詞,有不少種分詞模塊,好比:jieba、SnowNLP(MIT)、pynlpir(大數據搜索挖掘實驗室(北京市海量語言信息處理與雲計算應用工程技術研究中心))、thulac(清華大學天然語言處理與社會人文計算實驗室)等。比較經常使用的是"jieba"分詞器,意思就是像結巴同樣結結巴巴的把一個句子分紅幾個單詞。
jieba分詞器須要單獨安裝,安裝也很簡單,直接使用pip install jieba便可。
jieba分詞支持說那種分詞模式:
1. 精確模式:試圖將句子最精確的切開,適合於文本分析。
2. 全模式:把句子中全部的能夠成詞的詞語都掃描出來,速度很是快,但不能解決歧義。
3. 搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提升召回率,適合於搜索引擎分詞,支持繁體分詞。
下面分別用着三種模式來進行中文分詞,比較其異同點。
# 中文分詞應該使用jieba等分詞模塊 import jieba text = "這是【火爐煉AI】的機器學習系列文章,本文的標題是《【火爐煉AI】機器學習034-NLP對文本進行分詞》。"+ \ "你能夠從這個系列文章中學習到不少關於機器學習,人工智能方面的基礎知識和實戰技巧。"+\ "請盡情享受吧!個人AI朋友們。。。" mode1_list=jieba.cut(text,cut_all=False) # 精確模式(默認爲False,精確模式) print('jieba-精確模式結果:') print('/'.join(mode1_list)) mode2_list=jieba.cut(text,cut_all=True) # 全模式 print('jieba-全模式結果:') print('/'.join(mode2_list)) mode3_list=jieba.cut_for_search(text) # 搜索引擎模式 print('jieba-搜索引擎模式結果:') print('/'.join(mode3_list))
-------------------------------------輸---------出--------------------------------
這是/【/火爐/煉/AI/】/的/機器/學習/系列/文章/,/本文/的/標題/是/《/【/火爐/煉/AI/】/機器/學習/034/-/NLP/對/文本/進行/分詞/》/。/你/能夠/從/這個/系列/文章/中/學習/到/不少/關於/機器/學習/,/人工智能/方面/的/基礎知識/和/實戰/技巧/。/請/盡情/享受/吧/!/我/的/AI/朋友/們/。/。/。
jieba-全模式結果:
這/是///火爐/煉/AI//的/機器/學習/系列/文章///本文/的/標題/是////火爐/煉/AI//機器/學習/034/NLP/對/文本/進行/分詞////你/能夠/從/這個/系列/文章/中學/學習/到/不少/關於/機器/學習///人工/人工智能/智能/方面/的/基礎/基礎知識/知識/和/實戰/戰技/技巧///請/盡情/享受/吧///我/的/AI/朋友/們////
jieba-搜索引擎模式結果:
這是/【/火爐/煉/AI/】/的/機器/學習/系列/文章/,/本文/的/標題/是/《/【/火爐/煉/AI/】/機器/學習/034/-/NLP/對/文本/進行/分詞/》/。/你/能夠/從/這個/系列/文章/中/學習/到/不少/關於/機器/學習/,/人工/智能/人工智能/方面/的/基礎/知識/基礎知識/和/實戰/技巧/。/請/盡情/享受/吧/!/我/的/AI/朋友/們/。/。/。
--------------------------------------------完-------------------------------------
從上面的輸出結果能夠看出,這三種方法仍是有不少不一樣點的,好比全模式的結果都沒有標點符號,並且有幾個地方有重複,好比"文章中學習到"被分割成/文章/中學/學習/到/,而搜索引擎模式則對長詞在此切分,因此有些地方重複,好比/人工/智能/人工智能/方面/的/基礎/知識/基礎知識/等。
########################小**********結###############################
1,若是想對英文進行分詞,能夠直接使用NLP中自帶的sent_tokenize,word_tokenize,WordPunctTokenizer分詞器,其中的word_tokenize是應用最頻繁的。
2,若是想對中文進行分詞,可使用jieba模塊,其中的精確模式(也是其默認模式)已經可以很好的將文本切分開來。其餘模式在不一樣的應用場景中會用到。
#################################################################
注:本部分代碼已經所有上傳到(個人github)上,歡迎下載。
參考資料:
1, Python機器學習經典實例,Prateek Joshi著,陶俊傑,陳小莉譯