條件頻率分佈就是頻率分佈的集合,每一個頻率分佈有一個不一樣的「條件」,這個條件一般是文本的類別。當語料文本分爲幾類(文體,主題,做者等)時,能夠計算每一個類別獨立的頻率分佈,這樣,就能夠經過條件頻率分佈研究類別之間的系統性差別。一般,咱們用nltk的ConditionalFreqDist數據類型來實現的。編碼
1. 條件和事件spa
頻率分佈計算觀察到的事件,如本文中出現的詞彙。條件頻率分佈須要給每一個事件關聯一個條件,因此不是處理一個詞序列,而是要處理一系列配對序列。3d
>>> text=['The', 'Fulton', 'County', 'Grand', 'Jury', 'said'] >>> pairs = [('news', 'The'), ('news', 'Fulton'), ('news', 'County')] >>>
每對的形式是:(條件,事件)。code
2. 按文體統計詞彙blog
1)輸入事件
FreqDist()以一個簡單的鏈表做爲輸入,ConditionalFreqDist()以一個配對鏈表做爲輸入。generator
2)遍歷文體,產生配對it
對於每一個文體,遍歷文體中的每一個詞以產生文體與詞的配對。這裏以「新聞」和「言情」兩種文體爲例。io
>>> from nltk.corpus import brown >>> genre_word = [(genre, word) ... for genre in ['news', 'romance'] ... for word in brown.words(categories=genre)] >>> len(genre_word) 170576 >>> genre_word[:4] [('news', 'The'), ('news', 'Fulton'), ('news', 'County'), ('news', 'Grand')] >>>
3)使用此配對鏈表建立一個ConditionalFreqDist,並保存。字符編碼
>>> cfd = nltk.ConditionalFreqDist(genre_word) >>> cfd <ConditionalFreqDist with 2 conditions> >>> cfd.conditions() ['romance', 'news'] >>> cfd['news'] FreqDist({'the': 5580, ',': 5188, '.': 4030, 'of': 2849, 'and': 2146, 'to': 2116 , 'a': 1993, 'in': 1893, 'for': 943, 'The': 806, ...}) >>> cfd['romance'] FreqDist({',': 3899, '.': 3736, 'the': 2758, 'and': 1776, 'to': 1502, 'a': 1335, 'of': 1186, '``': 1045, "''": 1044, 'was': 993, ...}) >>> cfd['romance']['could'] 193 >>>
3.繪製分佈圖和分佈表
除了組合兩個或兩個以上的頻率分佈及更容易初始化以外,ConditionalFreqDist還爲製表和繪圖提供了一些有用的方法。
>>> import nltk >>> from nltk.corpus import udhr >>> languages = ['Chickasaw', 'English', 'German_Deutsch', 'Greenlandic_Inuktiku t', 'Hungarian_Magyar', 'Ibibio_Efik'] >>> cfd = nltk.ConditionalFreqDist( ... (lang, len(word)) ... for lang in languages ... for word in udhr.words(lang+'-Latin1')) >>> cfd.plot(cumulative=True) >>> cfd.tabulate(conditions=['English', 'German_Deutsch'], samples=range(10), cu mulative=True) 0 1 2 3 4 5 6 7 8 9 English 0 185 525 883 997 1166 1283 1440 1558 1638 German_Deutsch 0 171 263 614 717 894 1013 1110 1213 1275 >>>
該圖是基於上面代碼繪製出來的一個條件頻率分佈圖。條件是語言的名稱,圖中的計數來源於單詞長度。它利用了這樣一個特色:即每一種語言的文件名是語言名稱及後面緊跟着‘-Latin1’(字符編碼)。
在plot()和tabulate()方法中,可使用conditions=參數來指定顯示哪些條件。若是咱們忽略它,全部條件都會顯示出來。一樣,可使用samples=參數來限制要顯示的樣本,這能將大量數據載入到一個條件頻率分佈,而後經過選定條件和樣品,對完成的繪圖或製表進行探索。這也使咱們能全面控制條件和樣本的顯示順序。如上面,爲兩種語言和長度少於10個字符的詞彙繪製累計頻率數據表,如上面代碼輸出顯示。
4.使用雙連詞生成隨機文本
1)產生雙連詞
>>> sent=['In', 'the', 'begining'] >>> nltk.bigrams(sent) <generator object bigrams at 0x03C3E4E0> >>> mt = nltk.bigrams(sent) >>> mt <generator object bigrams at 0x0455A058>
2)建立隨機本文
>>> sent=['In', 'the', 'begining'] >>> nltk.bigrams(sent) <generator object bigrams at 0x03C3E4E0> >>> mt = nltk.bigrams(sent) >>> mt <generator object bigrams at 0x0455A058> >>> cfd=nltk.ConditionalFreqDist(mt) >>> cfd.tabulate() begining the In 0 1 the 1 0 >>> cfd.plot() >>>