條件頻率分布就是頻率分布的集合,每個頻率分布有一個不同的“條件”,這個條件通常是文本的類別。當語料文本分為幾類(文體,主題,作者等)時,可以計算每個類別獨立的頻率分布,這樣,就可以通過條件頻率分布研究類別之間的系統性差異。通常,我們用nltk的ConditionalFreqDist數據類型來實現的。
1. 條件和事件
頻率分布計算觀察到的事件,如本文中出現的詞匯。條件頻率分布需要給每個事件關聯一個條件,所以不是處理一個詞序列,而是要處理一系列配對序列。
>>> text=['The', 'Fulton', 'County', 'Grand', 'Jury', 'said'] >>> pairs = [('news', 'The'), ('news', 'Fulton'), ('news', 'County')] >>>
每對的形式是:(條件,事件)。
2. 按文體統計詞匯
1)輸入
FreqDist()以一個簡單的鏈表作為輸入,ConditionalFreqDist()以一個配對鏈表作為輸入。
2)遍歷文體,產生配對
對於每個文體,遍歷文體中的每個詞以產生文體與詞的配對。這里以“新聞”和“言情”兩種文體為例。
>>> 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() >>>