機器學習自然語言處理之英文NLTK(代碼+原理)
目錄
什么是自然語言處理?
常用的自然語言處理技術
NLTK簡介
NLTK的功能
分詞
過濾掉停用詞
詞匯規范化(Lexicon Normalization)
1)詞形還原(lemmatization)
2) 詞干提取(stem)
詞性標注
獲取近義詞
其他案例
每文一語
什么是自然語言處理?
自然語言處理是計算機科學領域與人工智能領域中的一個重要方向。它研究如何能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。
簡單地說,自然語言處理( Natural Language Processing,簡稱 NLP)就是用計算機來處理、理解以及運用人類語言(如中文、英文等),它屬于人工智能的一個分支,是計算機科學與語言學的交叉學科。
我們都知道,計算機是無法讀懂我們人類的語言的,當我們把我們所謂的“自然語言”傳輸到計算中,對計算器而言這或許是一系列的無意義的字符格式數據,而我們的自然語言處理技術目的就是將這些無意義數據變為計算機有意義并可以計算的數值型數據。
一般的英文我們使用NLTK模塊,中文使用jieba進行操作
透過現象看本質,才是真正的剖析方向
計算機是如何處理數據,計算機又是如何根據數據進行計算的,雖然當下已經有很多的主流編程語言了,我們似乎不需要去了解計算機到底是如何工作的,但是作為一個熱愛編程的技術人員,你應該了解!
數據是數值類型的嗎?我們進行計算機處理的時候,需要將其轉為數值類型,不管是圖像還是文本,不管是音頻還是各類各樣的數據類型,或者說你存在于這個世界,時時刻刻都在產生數據,那么數據到底是什么,在我認為,數據就是將宇宙萬物連接起來的一個橋梁,如果世界沒有了數據,那可能就像宇宙中的黑洞般的的“寂靜”。
前期我們的機器學習的,分類模型,都是將數據進行轉換為數值類型,然后帶入模型中進行訓練,及時存在一些文本數據,我們也可以進行編碼處理,那么現在我們面對的時候一堆文字,我們又該如何處理呢?本篇文章,將帶你了解當下計算機自然語言處理的步驟和原理,以及我們如何巧妙的將其與機器學習聯合在一起,解決我們日常生活中的需要。
常用的自然語言處理技術
1)詞條化, 即形態學分割。所謂的詞條化簡單的說就是把單詞分成單個語素,并識別詞素的種類。這項任務的難度很大程度上取決于所考慮語言的形態(即單詞結構)的復雜性。英語具有相當簡單的形態,尤其是屈折形態,因此常??梢院唵蔚貙卧~的所有可能形式作為單獨的單詞進行建模。然而,在諸如土耳其語或美泰語這樣的高度凝集的語言中,這種方法是不可行的,因為每一個字的詞條都有成千上萬個可能的詞形。
2)詞性標注, 即給定一個句子,確定每個單詞的詞性。在自然語言中有很多詞,尤其是普通詞,是會存在多種詞性的。例如,英語中“ book”可以是名詞或動詞(“預訂”);“ SET”可以是名詞、動詞或形容詞;“ OUT”可以是至少五個不同的詞類中的任何一個。有些語言比其他語言有更多的歧義。例如具有屈折形態的語言,如英語,尤其容易產生歧義。漢語的口語是一種音調語言,也十分容易產生歧義現象。這種變形不容易通過正字法中使用的實體來傳達意圖的含義。
3)詞干還原是將不同詞形的單詞還原成其原型,在處理英文文檔時,文檔中經常會使用一些單詞的不同形態,例如單詞“ observe”,可能以“observe”“observers”“observed”“observer”出現,但是他們都是具有相同或相似意義的單詞族,因此我們希望將這些不同的詞形轉換為其原型“observe”。在自然語言處理中,提取這些單詞的原型在我們進行文本信息統計的時候是非常有幫助的,因此下文中我們將介紹如何使用 NLTK 模塊來實現詞干還原:
4)詞型歸并和詞干還原的目的一樣,都是將單詞的不同詞性轉換為其原型,但是當詞干還原算法簡單粗略的去掉“小尾巴”這樣的時候,經常會得到一些無意義的結果,例如“ wolves”被還原成“ wolv”,而詞形歸并指的是利用詞匯表以及詞形分析方法返回詞的原型的過程。既歸并變形詞的結尾,例如“ ing”或者“es”,然后獲得單詞的原型,例如對單詞“ wolves”進行詞形歸并,將得到“wolf”輸出。
5)句法分析,確定給定句子的句法樹(語法分析)。自然語言的語法是模糊的,一個普通的句子可能會有多種不同的解讀結果。而目前主流的句法分析技術有兩種主要的分析方法即依賴分析和選區分析。依賴句法分析致力于分析句子中的單詞之間的關系(標記諸如主語和謂詞之間的關系),而選區句法分析則側重于使用概率來構造解析樹。
6)斷句,給定一大塊文本,找出句子的邊界。句子邊界通常用句點或其他標點符號來標記,但這些相同的字符特殊情況下也會用于其他目的。
NLTK簡介
Natural Language Toolkit,自然語言處理工具包,在NLP領域中,最常使用的一個Python庫。
NLTK是一個開源的項目,包含:Python模塊,數據集和教程,用于NLP的研究和開發。
NLTK由Steven Bird和Edward Loper在賓夕法尼亞大學計算機和信息科學系開發。
NLTK包括圖形演示和示例數據。其提供的教程解釋了工具包支持的語言處理任務背后的基本概念。
NLTK的功能
搜索文本
單詞搜索: 相似詞搜索; 相似關鍵詞識別; 詞匯分布圖; 生成文本;
1
2
3
4
5
分詞
文本是由段落(Paragraph)構成的,段落是由句子(Sentence)構成的,句子是由單詞構成的。切詞是文本分析的第一步,它把文本段落分解為較小的實體(如單詞或句子),每一個實體叫做一個Token,Token是構成句子(sentence )的單詞、是段落(paragraph)的句子。NLTK能夠實現句子切分和單詞切分兩種功能。
斷句
from nltk.tokenize import sent_tokenize text="""Hello Mr. Smith, how are you doing today? The weather is great, and city is awesome.The sky is pinkish-blue. You shouldn't eat cardboard""" tokenized_text=sent_tokenize(text) print(tokenized_text) ''' 結果: ['Hello Mr. Smith, how are you doing today?', 'The weather is great, and city is awesome.The sky is pinkish-blue.', "You shouldn't eat cardboard"] '''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
單句分詞
import nltk sent = "I am almost dead this time" token = nltk.word_tokenize(sent) # 結果:token['I','am','almost','dead','this','time']
1
2
3
4
5
過濾掉停用詞
(1)移除標點符號
import string """移除標點符號""" if __name__ == '__main__': # 方式一 # s = 'abc.' text_list = "Hello Mr. Smith, how are you doing today? The weather is great, and city is awesome." text_list = text_list.translate(str.maketrans(string.punctuation, " " * len(string.punctuation))) # abc print("s: ", text_list) # 方式二 english_punctuations = [',', '.', ':', ';', '?', '(', ')', '[', ']', '&', '!', '*', '@', '#', '$', '%'] text_list = [word for word in text_list if word not in english_punctuations] print("text: ", text_list)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(2)移除停用詞
import nltk from nltk.corpus import stopwords # nltk.download('stopwords') # Downloading package stopwords to # C:\Users\Administrator\AppData\Roaming\nltk_data\corpora\stopwords.zip. # Unzipping the stopwords.zip """移除停用詞""" stop_words = stopwords.words("english") if __name__ == '__main__': text = "Hello Mr. Smith, how are you doing today? The weather is great, and city is awesome." word_tokens = nltk.tokenize.word_tokenize(text.strip()) filtered_word = [w for w in word_tokens if not w in stop_words] print("word_tokens: ", word_tokens) print("filtered_word: ", filtered_word) ''' word_tokens:['Hello', 'Mr.', 'Smith', ',', 'how', 'are', 'you', 'doing', 'today', '?', 'The', 'weather', 'is', 'great', ',', 'and', 'city', 'is', 'awesome', '.'] filtered_word:['Hello', 'Mr.', 'Smith', ',', 'today', '?', 'The', 'weather', 'great', ',', 'city', 'awesome', '.'] '''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
詞匯規范化(Lexicon Normalization)
詞匯規范化是指把詞的各種派生形式轉換為詞根,在NLTK中存在兩種抽取詞干的方法porter和wordnet。
1)詞形還原(lemmatization)
利用上下文語境和詞性來確定相關單詞的變化形式,根據詞性來獲取相關的詞根,也叫lemma,結果是真實的單詞。
基于字典的映射。nltk中要求手動注明詞性,否則可能會有問題。因此一般先要分詞、詞性標注,再詞性還原。
from nltk.stem import WordNetLemmatizer lemmatizer = WordNetLemmatizer() lemmatizer.lemmatize('leaves') # 輸出:'leaf'
1
2
3
4
2) 詞干提?。╯tem)
從單詞中刪除詞綴并返回詞干,可能不是真正的單詞。
# 基于Porter詞干提取算法 from nltk.stem.porter import PorterStemmer porter_stemmer = PorterStemmer() porter_stemmer.stem('maximum') # 基于Lancaster 詞干提取算法 from nltk.stem.lancaster import LancasterStemmer lancaster_stemmer = LancasterStemmer() lancaster_stemmer.stem() # 基于Snowball 詞干提取算法 from nltk.stem import SnowballStemmer snowball_stemmer = SnowballStemmer("english") snowball_stemmer.stem('maximum')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from nltk.stem.wordnet import WordNetLemmatizer # from nltk.stem import WordNetLemmatizer lem = WordNetLemmatizer() # 詞形還原 from nltk.stem.porter import PorterStemmer # from nltk.stem import PorterStemmer stem = PorterStemmer() # 詞干提取 word = "flying" print("Lemmatized Word:",lem.lemmatize(word,"v")) print("Stemmed Word:",stem.stem(word)) ''' Lemmatized Word: fly Stemmed Word: fli '''
1
2
3
4
5
6
7
8
9
10
11
12
13
詞性標注
詞性(POS)標記的主要目標是識別給定單詞的語法組,POS標記查找句子內的關系,并為該單詞分配相應的標簽。
sent = "Albert Einstein was born in Ulm, Germany in 1879." tokens = nltk.word_tokenize(sent) tags = nltk.pos_tag(tokens) ''' [('Albert', 'NNP'), ('Einstein', 'NNP'), ('was', 'VBD'), ('born', 'VBN'), ('in', 'IN'), ('Ulm', 'NNP'), (',', ','), ('Germany', 'NNP'), ('in', 'IN'), ('1879', 'CD'), ('.', '.')] '''
1
2
3
4
5
6
7
8
9
獲取近義詞
查看一個單詞的同義詞集用synsets(); 它有一個參數pos,可以指定查找的詞性。WordNet接口是面向語義的英語詞典,類似于傳統字典。它是NLTK語料庫的一部分。
import nltk nltk.download('wordnet') # Downloading package wordnet to C:\Users\Administrator\AppData\Roaming\nltk_data...Unzipping corpora\wordnet.zip. from nltk.corpus import wordnet word = wordnet.synsets('spectacular') print(word) # [Synset('spectacular.n.01'), Synset('dramatic.s.02'), Synset('spectacular.s.02'), Synset('outstanding.s.02')] print(word[0].definition()) print(word[1].definition()) print(word[2].definition()) print(word[3].definition()) ''' a lavishly produced performance sensational in appearance or thrilling in effect characteristic of spectacles or drama having a quality that thrusts itself into attention '''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
其他案例
from __future__ import division import nltk import matplotlib from nltk.book import * from nltk.util import bigrams # 單詞搜索 print('單詞搜索') text1.concordance('boy') text2.concordance('friends') # 相似詞搜索 print('相似詞搜索') text3.similar('time') #共同上下文搜索 print('共同上下文搜索') text2.common_contexts(['monstrous','very']) # 詞匯分布表 print('詞匯分布表') text4.dispersion_plot(['citizens', 'American', 'freedom', 'duties']) # 詞匯計數 print('詞匯計數') print(len(text5)) sorted(set(text5)) print(len(set(text5))) # 重復詞密度 print('重復詞密度') print(len(text8) / len(set(text8))) # 關鍵詞密度 print('關鍵詞密度') print(text9.count('girl')) print(text9.count('girl') * 100 / len(text9)) # 頻率分布 fdist = FreqDist(text1) vocabulary = fdist.keys() for i in vocabulary: print(i) # 高頻前20 fdist.plot(20, cumulative = True) # 低頻詞 print('低頻詞:') print(fdist.hapaxes()) # 詞語搭配 print('詞語搭配') words = list(bigrams(['louder', 'words', 'speak'])) print(words)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
大致上來說,我們在處理英文的時候,充分利用這方面的知識和語法,目前NLTK在這方面的生態都已經比較成熟了,我們可以通過它來解決英文項目。
nltk 怎么樣使用中文?這是個大問題。這么個工具目前只能比較好的處理英文和其他的一些拉丁語系,誰讓別人的單詞與單詞之間有個空格隔開呢!中文漢字一個挨一個的,nltk在分詞這一關就過不去了,分詞沒法分,剩下的就都做不了。唯一能做的, 就是對網上現有的中文語料進行處理,這些語料都分好了詞,可以使用nltk進行類似與英文的處理。
目前python中文分詞的包,我推薦使用結巴分詞。 使用結巴分詞,之后,就可以對輸出文本使用nltk進行相關處理。
也就說NLTK在分詞方面并不是支持的,但是我們利用jieba分詞之后,我們可以使用NLTK進行深入的研發和研究!
總而言之,在處理自然語言的過程中,我們的基本步驟就是:
1.相關第三包的準備
2.獲取語料庫及停用詞信息
3.分詞
4.詞頻統計
5.去停用詞
6.基于TF-IDF理論、詞袋模型等的文本向量化處理
7.機器學習、情感分析
8.簡單可視化
后期我們會介紹比較詳細的自然語言處理!歡迎關注!
每文一語
加油
AI 機器學習 自然語言處理基礎
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。