python 天然語言處理(三)____條件頻率分佈

  條件頻率分佈就是頻率分佈的集合,每一個頻率分佈有一個不一樣的「條件」,這個條件一般是文本的類別。當語料文本分爲幾類(文體,主題,做者等)時,能夠計算每一個類別獨立的頻率分佈,這樣,就能夠經過條件頻率分佈研究類別之間的系統性差別。一般,咱們用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()
>>>
相關文章
相關標籤/搜索