欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中一些自然語(yǔ)言工具的使用的入門(mén)教程

系統(tǒng) 1893 0

NLTK 是使用 Python 教學(xué)以及實(shí)踐計(jì)算語(yǔ)言學(xué)的極好工具。此外,計(jì)算語(yǔ)言學(xué)與人工 智能、語(yǔ)言/專(zhuān)門(mén)語(yǔ)言識(shí)別、翻譯以及語(yǔ)法檢查等領(lǐng)域關(guān)系密切。
NLTK 包括什么

NLTK 會(huì)被自然地看作是具有棧結(jié)構(gòu)的一系列層,這些層構(gòu)建于彼此基礎(chǔ)之上。那些熟悉人工語(yǔ)言(比如 Python)的文法 和解析的讀者來(lái)說(shuō),理解自然語(yǔ)言模型中類(lèi)似的 ―― 但更深?yuàn)W的 ―― 層不會(huì)有太大困難。
術(shù)語(yǔ)表

全集(Corpora):相關(guān)文本的集合。例如,莎士比亞的作品可能被統(tǒng)稱(chēng)為一個(gè) 文集(corpus); 而若干個(gè)作者的作品稱(chēng)為 全集。

直方圖(Histogram):數(shù)據(jù)集中不同單詞、字母或其他條目的出現(xiàn)頻率的統(tǒng)計(jì)分布。

結(jié)構(gòu)(Syntagmatic):對(duì)語(yǔ)段的研究;也就是全集中字母、單詞或短語(yǔ)連續(xù)出現(xiàn)的統(tǒng)計(jì)關(guān)系。

上下文無(wú)關(guān)語(yǔ)法(Context-free grammar): 由四類(lèi)形式語(yǔ)法構(gòu)成的 Noam Chomsky 層級(jí)中的第二類(lèi)。參閱 參考資料 以獲得 詳盡描述。

盡管 NLTK 附帶了很多已經(jīng)預(yù)處理(通常是手工地)到不同程度的全集,但是概念上每一層 都是依賴(lài)于相鄰的更低層次的處理。首先是斷詞;然后是為單詞加上 標(biāo)簽;然后將成組 的單詞解析為語(yǔ)法元素,比如名詞短語(yǔ)或句子(取決于幾種技術(shù)中的某一種,每種技術(shù)都有其優(yōu)缺點(diǎn)); 最后對(duì)最終語(yǔ)句或其他語(yǔ)法單元進(jìn)行分類(lèi)。通過(guò)這些步驟,NLTK 讓您可以生成關(guān)于不同元素出現(xiàn)情況 的統(tǒng)計(jì),并畫(huà)出描述處理過(guò)程本身或統(tǒng)計(jì)合計(jì)結(jié)果的圖表。

在本文中,您將看到關(guān)于低層能力的一些相對(duì)完整的示例,而對(duì)大部分高層次能力將只是進(jìn)行簡(jiǎn)單抽象的描述。 現(xiàn)在讓我們來(lái)詳細(xì)分析文本處理的首要步驟。

斷詞(Tokenization)

您可以使用 NLTK 完成的很多工作,尤其是低層的工作,與使用 Python 的基本數(shù)據(jù)結(jié)構(gòu)來(lái)完成相比,并 沒(méi)有 太 大的區(qū)別。不過(guò),NLTK 提供了一組由更高的層所依賴(lài)和使用的系統(tǒng)化的接口,而不只是 簡(jiǎn)單地提供實(shí)用的類(lèi)來(lái)處理加過(guò)標(biāo)志或加過(guò)標(biāo)簽的文本。

具體講, nltk.tokenizer.Token 類(lèi)被廣泛地用于存儲(chǔ)文本的有注解的片斷;這些 注解可以標(biāo)記很多不同的特性,包括詞類(lèi)(parts-of-speech)、子標(biāo)志(subtoken)結(jié)構(gòu)、一個(gè)標(biāo)志(token) 在更大文本中的偏移位置、語(yǔ)形詞干 (morphological stems)、文法語(yǔ)句成分,等等。實(shí)際上,一個(gè) Token 是一種 特別的字典 ―― 并且以字典形式訪問(wèn) ―― 所以它可以容納任何您希望的鍵。在 NLTK 中使用了一些專(zhuān)門(mén)的鍵, 不同的鍵由不同的子程序包所使用。

讓我們來(lái)簡(jiǎn)要地分析一下如何創(chuàng)建一個(gè)標(biāo)志并將其拆分為子標(biāo)志:
清單 1. 初識(shí) nltk.tokenizer.Token 類(lèi)

            
>>> from nltk.tokenizer import *
>>> t = Token(TEXT='This is my first test sentence')
>>> WSTokenizer().tokenize(t, addlocs=True) # break on whitespace
>>> print t['TEXT']
This is my first test sentence
>>> print t['SUBTOKENS']
[
            
              @[0:4c], 
              
                @[5:7c], 
                
                  @[8:10c], 
                  
                    @[11:16c],

                    
                      @[17:21c], 
                      
                        @[22:30c]]
>>> t['foo'] = 'bar'
>>> t

                        
                          @[0:4c], 
                          
                            @[5:7c], 
                            
                              @[8:10c], 
                              
                                @[11:16c],

                                
                                  @[17:21c], 
                                  
                                    @[22:30c]]>
>>> print t['SUBTOKENS'][0]

                                    
                                      @[0:4c]
>>> print type(t['SUBTOKENS'][0])

                                      
                                      
                                    
                                  
                                
                              
                            
                          
                        
                      
                    
                  
                
              
            
          

概率(Probability)

對(duì)于語(yǔ)言全集,您可能要做的一件相當(dāng)簡(jiǎn)單的事情是分析其中各種 事件(events) 的 頻率分布,并基于這些已知頻率分布做出概率預(yù)測(cè)。NLTK 支持多種基于自然頻率分布數(shù)據(jù)進(jìn)行概率預(yù)測(cè)的方法。 我將不會(huì)在這里介紹那些方法(參閱 參考資料 中列出的概率教程), 只要說(shuō)明您肯定會(huì) 期望的那些與您已經(jīng) 知道的 那些(不止是顯而易見(jiàn)的 縮放比例/正規(guī)化)之間有著一些模糊的關(guān)系就夠了。

基本來(lái)講,NLTK 支持兩種類(lèi)型的頻率分布:直方圖和條件頻率分布(conditional frequency)。 nltk.probability.FreqDist 類(lèi)用于創(chuàng)建直方圖;例如, 可以這樣創(chuàng)建一個(gè)單詞直方圖:
清單 2. 使用 nltk.probability.FreqDist 創(chuàng)建基本的直方圖

            
>>> from nltk.probability import *
>>> article = Token(TEXT=open('cp-b17.txt').read())
>>> WSTokenizer().tokenize(article)
>>> freq = FreqDist()
>>> for word in article['SUBTOKENS']:
...   freq.inc(word['TEXT'])
>>> freq.B()
1194
>>> freq.count('Python')
12


          

概率教程討論了關(guān)于更復(fù)雜特性的直方圖的創(chuàng)建,比如“以元音結(jié)尾的詞后面的詞的長(zhǎng)度”。 nltk.draw.plot.Plot 類(lèi)可用于直方圖的可視化顯示。當(dāng)然, 您也可以這樣分析高層次語(yǔ)法特性或者甚至是與 NLTK 無(wú)關(guān)的數(shù)據(jù)集的頻率分布。

條件頻率分布可能比普通的直方圖更有趣。條件頻率分布是一種二維直方圖 ―― 它按每個(gè)初始條件或者“上下文”為您顯示 一個(gè)直方圖。例如,教程提出了一個(gè)對(duì)應(yīng)每個(gè)首字母的單詞長(zhǎng)度分布問(wèn)題。我們就以這樣分析:
清單 3. 條件頻率分布:對(duì)應(yīng)每個(gè)首字母的單詞長(zhǎng)度

            
>>> cf = ConditionalFreqDist()
>>> for word in article['SUBTOKENS']:
...   cf[word['TEXT'][0]].inc(len(word['TEXT']))
...
>>> init_letters = cf.conditions()
>>> init_letters.sort()
>>> for c in init_letters[44:50]:
...   print "Init %s:" % c,
...   for length in range(1,6):
...     print "len %d/%.2f," % (length,cf[c].freq(n)),
...   print
...
Init a: len 1/0.03, len 2/0.03, len 3/0.03, len 4/0.03, len 5/0.03,
Init b: len 1/0.12, len 2/0.12, len 3/0.12, len 4/0.12, len 5/0.12,
Init c: len 1/0.06, len 2/0.06, len 3/0.06, len 4/0.06, len 5/0.06,
Init d: len 1/0.06, len 2/0.06, len 3/0.06, len 4/0.06, len 5/0.06,
Init e: len 1/0.18, len 2/0.18, len 3/0.18, len 4/0.18, len 5/0.18,
Init f: len 1/0.25, len 2/0.25, len 3/0.25, len 4/0.25, len 5/0.25,


          

條件頻率分布在語(yǔ)言方面的一個(gè)極好應(yīng)用是分析全集中的語(yǔ)段分布 ―― 例如,給出一個(gè)特定的 詞,接下來(lái)最可能出現(xiàn)哪個(gè)詞。當(dāng)然,語(yǔ)法會(huì)帶來(lái)一些限制;不過(guò),對(duì)句法選項(xiàng)的選擇的研究 屬于語(yǔ)義學(xué)、語(yǔ)用論和術(shù)語(yǔ)范疇。

詞干提取(Stemming)

nltk.stemmer.porter.PorterStemmer 類(lèi)是一個(gè)用于從英文單詞中 獲得符合語(yǔ)法的(前綴)詞干的極其便利的工具。這一能力尤其讓我心動(dòng),因?yàn)槲乙郧霸?jīng)用 Python 創(chuàng)建了一個(gè)公用的、全文本索引的 搜索工具/庫(kù)(見(jiàn) Developing a full-text indexer in Python 中的描述,它已經(jīng)用于相當(dāng)多的其他項(xiàng)目中)。

盡管對(duì)大量文檔進(jìn)行關(guān)于一組確切詞的搜索的能力是非常實(shí)用的( gnosis.indexer 所做的工作), 但是,對(duì)很多搜索用圖而言,稍微有一些模糊將會(huì)有所幫助。也許,您不能特別確定您正在尋找的電子郵件是否使用了單詞 “complicated”、“complications”、“complicating”或者“complicates”,但您卻記得那是大概涉及的內(nèi)容(可能與其他一些 詞共同來(lái)完成一次有價(jià)值的搜索)。

NLTK 中包括一個(gè)用于單詞詞干提取的極好算法,并且讓您可以按您的喜好定制詞干提取算法:
清單 4. 為語(yǔ)形根(morphological roots)提取單詞詞干

            
>>> from nltk.stemmer.porter import PorterStemmer
>>> PorterStemmer().stem_word('complications')
'complic'


          

實(shí)際上,您可以怎樣利用 gnosis.indexer 及其衍生工具或者完全不同的索引工具中的詞干 提取功能,取決于您的使用情景。幸運(yùn)的是,gnosis.indexer 有一個(gè)易于進(jìn)行專(zhuān)門(mén)定制的 開(kāi)放接口。您是否需要一個(gè)完全由詞干構(gòu)成的索引?或者您是否在索引中同時(shí)包括完整的單詞 和詞干?您是否需要將結(jié)果中的詞干匹配從確切匹配中分離出來(lái)?在未來(lái)版本的 gnosis.indexer 中我將引入一些種類(lèi)詞干的提取能力,不過(guò),最終用戶(hù)可能仍然希望進(jìn)行不同的定制。

無(wú)論如何,一般來(lái)說(shuō)添加詞干提取是非常簡(jiǎn)單的:首先,通過(guò)特別指定 gnosis.indexer.TextSplitter 來(lái)從一個(gè)文檔中獲得詞干;然后, 當(dāng)然執(zhí)行搜索時(shí),(可選地)在使用搜索條件進(jìn)行索引查找之前提取其詞干,可能是通過(guò)定制 您的 MyIndexer.find() 方法來(lái)實(shí)現(xiàn)。

在使用 PorterStemmer 時(shí)我發(fā)現(xiàn) nltk.tokenizer.WSTokenizer 類(lèi)確實(shí)如教程所警告的那樣不好用。它可以勝任概念上的角色,但是對(duì)于實(shí)際的文本而言,您可以更好地識(shí)別出什么是一個(gè) “單詞”。幸運(yùn)的是, gnosis.indexer.TextSplitter 是一個(gè)健壯的斷詞工具。例如:
清單 5. 基于拙劣的 NLTK 斷詞工具進(jìn)行詞干提取

            
>>> from nltk.tokenizer import *
>>> article = Token(TEXT=open('cp-b17.txt').read())
>>> WSTokenizer().tokenize(article)
>>> from nltk.probability import *
>>> from nltk.stemmer.porter import *
>>> stemmer = PorterStemmer()
>>> stems = FreqDist()
>>> for word in article['SUBTOKENS']:
...   stemmer.stem(word)
...   stems.inc(word['STEM'].lower())
...
>>> word_stems = stems.samples()
>>> word_stems.sort()
>>> word_stems[20:40]
['"generator-bas', '"implement', '"lazili', '"magic"', '"partial',
'"pluggable"', '"primitives"', '"repres', '"secur', '"semi-coroutines."',
'"state', '"understand', '"weightless', '"whatev', '#', '#-----',
'#----------', '#-------------', '#---------------', '#b17:']


          

查看一些詞干,集合中的詞干看起來(lái)并不是都可用于索引。很多根本不是實(shí)際的單詞,還有其他一些是 用破折號(hào)連接起來(lái)的組合詞,單詞中還被加入了一些不相干的標(biāo)點(diǎn)符號(hào)。讓我們使用更好的斷詞工具 來(lái)進(jìn)行嘗試:
清單 6. 使用斷詞工具中靈巧的啟發(fā)式方法來(lái)進(jìn)行詞干提取

            
>>> article = TS().text_splitter(open('cp-b17.txt').read())
>>> stems = FreqDist()
>>> for word in article:
...   stems.inc(stemmer.stem_word(word.lower()))
...
>>> word_stems = stems.samples()
>>> word_stems.sort()
>>> word_stems[60:80]
['bool', 'both', 'boundari', 'brain', 'bring', 'built', 'but', 'byte',
'call', 'can', 'cannot', 'capabl', 'capit', 'carri', 'case', 'cast',
'certain', 'certainli', 'chang', 'charm']


          

在這里,您可以看到有一些單詞有多個(gè)可能的擴(kuò)展,而且所有單詞看起來(lái)都像是單詞或者詞素。 斷詞方法對(duì)隨機(jī)文本集合來(lái)說(shuō)至關(guān)重要;公平地講,NLTK 捆綁的全集已經(jīng)通過(guò) WSTokenizer() 打包為易用且準(zhǔn)確的斷詞工具。要獲得健壯的實(shí)際可用的索引器,需要使用健壯的斷詞工具。

添加標(biāo)簽(tagging)、分塊(chunking)和解析(parsing)

NLTK 的最大部分由復(fù)雜程度各不相同的各種解析器構(gòu)成。在很大程度上,本篇介紹將不會(huì) 解釋它們的細(xì)節(jié),不過(guò),我愿意大概介紹一下它們要達(dá)成什么目的。

不要忘記標(biāo)志是特殊的字典這一背景 ―― 具體說(shuō)是那些可以包含一個(gè) TAG 鍵以指明單詞的語(yǔ)法角色的標(biāo)志。NLTK 全集文檔通常有部分專(zhuān)門(mén)語(yǔ)言已經(jīng)預(yù)先添加了標(biāo)簽,不過(guò),您當(dāng)然可以 將您自己的標(biāo)簽添加到?jīng)]有加標(biāo)簽的文檔。

分塊有些類(lèi)似于“粗略解析”。也就是說(shuō),分塊工作的進(jìn)行,或者基于語(yǔ)法成分的已有標(biāo)志,或者基于 您手工添加的或者使用正則表達(dá)式和程序邏輯半自動(dòng)生成的標(biāo)志。不過(guò),確切地說(shuō),這不是真正的解析 (沒(méi)有同樣的生成規(guī)則)。例如:
清單 7. 分塊解析/添加標(biāo)簽:?jiǎn)卧~和更大的單位

            
>>> from nltk.parser.chunk import ChunkedTaggedTokenizer
>>> chunked = "[ the/DT little/JJ cat/NN ] sat/VBD on/IN [ the/DT mat/NN ]"
>>> sentence = Token(TEXT=chunked)
>>> tokenizer = ChunkedTaggedTokenizer(chunk_node='NP')
>>> tokenizer.tokenize(sentence)
>>> sentence['SUBTOKENS'][0]
(NP: 
            
              
                
                  )
>>> sentence['SUBTOKENS'][0]['NODE']
'NP'
>>> sentence['SUBTOKENS'][0]['CHILDREN'][0]

                  
                    
>>> sentence['SUBTOKENS'][0]['CHILDREN'][0]['TAG']
'DT'
>>> chunk_structure = TreeToken(NODE='S', CHILDREN=sentence['SUBTOKENS'])
(S:
 (NP: 
                    
                      
                        
                          )
 
                          
                            
                              
 (NP: 
                              
                                
                                  ))


                                
                              
                            
                          
                        
                      
                    
                  
                
              
            
          

所提及的分塊工作可以由 nltk.tokenizer.RegexpChunkParser 類(lèi)使用偽正則表達(dá)式來(lái)描述 構(gòu)成語(yǔ)法元素的一系列標(biāo)簽來(lái)完成。這里是概率教程中的一個(gè)例子:
清單 8. 使用標(biāo)簽上的正則表達(dá)式進(jìn)行分塊

            
>>> rule1 = ChunkRule('
            
? * ', ... 'Chunk optional det, zero or more adj, and a noun') >>> chunkparser = RegexpChunkParser([rule1], chunk_node='NP', top_node='S') >>> chunkparser.parse(sentence) >>> print sent['TREE'] (S: (NP: ) (NP: ))

真正的解析將引領(lǐng)我們進(jìn)入很多理論領(lǐng)域。例如,top-down 解析器可以確保找到每一個(gè)可能的產(chǎn)品,但 可能會(huì)非常慢,因?yàn)橐l繁地(指數(shù)級(jí))進(jìn)行回溯。Shift-reduce 效率更高,但是可能會(huì)錯(cuò)過(guò)一些產(chǎn)品。 不論在哪種情況下,語(yǔ)法規(guī)則的聲明都類(lèi)似于解析人工語(yǔ)言的語(yǔ)法聲明。本專(zhuān)欄曾經(jīng)介紹了其中的一些: SimpleParse 、 mx.TextTools 、 Spark 和 gnosis.xml.validity (參閱 參考資料)。

甚至,除了 top-down 和 shift-reduce 解析器以外,NLTK 還提供了“chart 解析器”,它可以創(chuàng)建部分假定, 這樣一個(gè)給定的序列就可以繼而完成一個(gè)規(guī)則。這種方法可以是既有效又完全的。舉一個(gè)生動(dòng)的(玩具級(jí)的)例子:
清單 9. 為上下文無(wú)關(guān)語(yǔ)法定義基本的產(chǎn)品

            
>>> from nltk.parser.chart import *
>>> grammar = CFG.parse('''
...  S -> NP VP
...  VP -> V NP | VP PP
...  V -> "saw" | "ate"
...  NP -> "John" | "Mary" | "Bob" | Det N | NP PP
...  Det -> "a" | "an" | "the" | "my"
...  N -> "dog" | "cat" | "cookie"
...  PP -> P NP
...  P -> "on" | "by" | "with"
...  ''')
>>> sentence = Token(TEXT='John saw a cat with my cookie')
>>> WSTokenizer().tokenize(sentence)
>>> parser = ChartParser(grammar, BU_STRATEGY, LEAF='TEXT')
>>> parser.parse_n(sentence)
>>> for tree in sentence['TREES']: print tree
(S:
 (NP: 
            
              )
 (VP:
  (VP: (V: 
              
                ) (NP: (Det: 
                
                  ) (N: 
                  
                    )))
  (PP: (P: 
                    
                      ) (NP: (Det: 
                      
                        ) (N: 
                        
                          )))))
(S:
 (NP: 
                          
                            )
 (VP:
  (V: 
                            
                              )
  (NP:
   (NP: (Det: 
                            
                          
                        
                      
                    
                  
                
                
                  ) (N: 
                  
                    ))
   (PP: (P: 
                    
                      ) (NP: (Det: 
                      
                        ) (N: 
                        
                          ))))))


                        
                      
                    
                  
                
              
            
          

probabilistic context-free grammar(或者說(shuō)是 PCFG)是一種上下文無(wú)關(guān)語(yǔ)法, 它將其每一個(gè)產(chǎn)品關(guān)聯(lián)到一個(gè)概率。同樣,用于概率解析的解析器也捆綁到了 NLTK 中。

您在等待什么?

NLTK 還有其他本篇簡(jiǎn)短介紹中不能涵蓋的重要功能。例如,NLTK 有一個(gè)完整的框架,用于通過(guò)類(lèi)似于“naive Bayesian” 和“maximum entropy”等模型的統(tǒng)計(jì)技術(shù)進(jìn)行文本分類(lèi)。 即使還有篇幅,現(xiàn)在我也還不能解釋其本質(zhì)。不過(guò),我認(rèn)為,即使是 NLTK 較低的層,也可以成為一個(gè)既可用于教學(xué)應(yīng)用程序 也可用于實(shí)際應(yīng)用程序的實(shí)用框架。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 无限资源动漫精彩日本 | 人人爽久久涩噜噜噜蜜桃 | 一个看片免费视频www | 亚洲97| 国亚洲欧美日韩精品 | 日韩精品一区二区三区第95 | 一级免费看片 | 免费在线国产视频 | 久久精彩视频 | 欧美黑人ⅹxxx片 | 99久久99久久精品免费看蜜桃 | 午夜成人在线视频 | 久久国产精品视频一区 | 天天躁日日躁狠狠很躁 | 日韩小视频| 日韩国产精品一区二区三区 | 成人a视频 | a毛片视频 | 精品久久久久久久久久久 | 久久95| 天堂在线资源av | 国产精品爱久久久久久久小说 | 精品视频一区二区三区 | 欧美精品网站 | jizz 亚洲大全 | 伊人久久大杳蕉综合大象 | 婷婷丁香综合 | 亚洲视频区 | 亚洲欧洲精品在线 | 免费二区| 亚洲精品福利你懂 | 成人精品一区二区三区 | 国产福利不卡视频在免费 | 国产亚洲精品一区二区 | 欧美一区二区三区在线播放 | 色.com | 色99视频| 91精品国产一区二区三区蜜臀 | www操com| 天堂热 | 国产综合视频在线观看 |