NLTK中的條件概率分布

產(chǎn)生一個(gè)文本携冤,一般要基于一個(gè)已有的訓(xùn)練集盆繁,或者說(shuō)是種子,來(lái)告訴程序詞匯的分布以及用詞習(xí)慣竖席,下面是一個(gè)最為基礎(chǔ)的文本產(chǎn)生函數(shù)耘纱,基于nltk的條件頻率分布函數(shù)構(gòu)建:

def generate_model(cfd, word, num=15):
    for i in range (num):
        print word #輸出當(dāng)前詞匯        
        word = cfd[word].max() #該詞匯的下一個(gè)"最有可能"與之聯(lián)結(jié)的詞匯, 并替代當(dāng)前詞匯,使之輸入到下一次循環(huán)當(dāng)中
text = nltk.corpus.genesis.words('english-kjv.txt')
bigrams = nltk.bigrams(text)
cfd = nltk.ConditionalFreqDist(bigrams)

這里想詳細(xì)說(shuō)說(shuō)nltk.ConditionalFreqDist這個(gè)函數(shù)毕荐,個(gè)人感覺(jué)這個(gè)函數(shù)意義非凡束析。該函數(shù)是頻率分布的集合,比如憎亚,我們想統(tǒng)計(jì)在新聞文體中和言情小說(shuō)文體中給定詞的頻率分布员寇,那么這里的“新聞”以及“言情小說(shuō)”就是兩個(gè)條件弄慰,而給定的詞,就是我們觀察到的事件丁恭。在一個(gè)ConditionalFreqDist函數(shù)中曹动,(條件,事件)的集合牲览,就是輸入的argument墓陈,比如:
cfd = ConditionalFreqDist(條件,事件)

舉例說(shuō)明第献,我們想知道brown語(yǔ)料庫(kù)中贡必,news和romance兩種文學(xué)體裁的詞頻分布,那么我們可以使用如下代碼:

#我們先設(shè)置(條件庸毫,事件)的集合:
genre_word= [(genre, word) for genre in ['news','romance'] for word in brown.words(categories = genre)]

#輸出條件頻率
cfdist = nltk.ConditionalFreqDist(genre_word)
#這個(gè)函數(shù)的輸出仔拟,事實(shí)上是有“news”以及“romance”條件的counter default字典,下面是一部分#output:
#defaultdict(nltk.probability.FreqDist,
            {'news': Counter({u'sunbonnet': 1,
                      u'Elevated': 1,
                      u'narcotic': 2,
                      u'four': 73,
                      u'woods': 4,
                      u'railing': 1,
                      u'Until': 5,
#我們可以進(jìn)一步的切片這個(gè)結(jié)果:
news = cfdist['news’]
<FreqDist with 14394 samples and 100554 outcomes>
news_four = cfdist['news']['four’] #cfdist[條件][事件]
Out[39]: 73

除此之外飒赃,我們還可以對(duì)cfdist做一寫(xiě)表達(dá)式處理利花,比如tabulate或者plot:

In[44]: cfdist.tabulate(conditions = ['news'],samples = ['four'])
     four
news   73
In[45]: cfdist.tabulate(samples = ['four'])
        four
   news   73
romance    8
In[46]: cfdist.tabulate(samples = ['I','love','you'])
           I love  you
   news  179    3   55
romance  951   32  456
#我們也可以讓他顯示百分比而不是counts:

cfdist_copy = cfdist
total_news = cfdist['news'].N()
total_romance = cfdist['romance'].N()

for i in cfdist_copy['news']:
    cfdist_copy['news'][i] = float(cfdist_copy['news'][i])/float(total_news)

for j in cfdist_copy['romance']:
    cfdist_copy['romance'][j] = float(cfdist_copy['romance'][j])/ float(total_romance)

print cfdist['romance']['I']
Out[78]: 0.013581445831310159

我們也可以對(duì)結(jié)果進(jìn)行畫(huà)圖,使之更加淺顯易懂:

cfdist.plot(samples = [‘I’, ‘love’, ‘you’])

接下來(lái)载佳,我們還可以利用CFD做一些更有趣的事情炒事,比如自動(dòng)生成一個(gè)文本, 即該文一開(kāi)頭的例子,這里我們有言情小說(shuō)來(lái)構(gòu)建一篇更有趣的“電腦寫(xiě)的言情小說(shuō)”:

from nltk.corpus import brown

def generate_romance(rcfdist, word, num = 100):
    for i in range(num):
        print word
        word = rcfdist[word].max()

refined = [w for w in brown.words(categories = 'romance') if w.isalpha()]
bigrams = nltk.bigrams(refined)
rcfdist = nltk.ConditionalFreqDist(bigrams)

generate_romance(rcfdist,’love’)

output:
love
you
have
to
the
same
time
to
the
same
time
to
the

可以看到蔫慧,這個(gè)程序?qū)嶋H上存在很大問(wèn)題挠乳,因?yàn)槟承゜igrams一旦出現(xiàn)固定循環(huán),程序就會(huì)不停的在這個(gè)循環(huán)內(nèi)滾動(dòng)姑躲,不過(guò)這樣運(yùn)用條件概率分布的例子睡扬,仍然對(duì)我們是有啟發(fā)性的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黍析,一起剝皮案震驚了整個(gè)濱河市卖怜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阐枣,老刑警劉巖韧涨,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異侮繁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)如孝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)宪哩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人第晰,你說(shuō)我怎么就攤上這事锁孟”蜃妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵品抽,是天一觀的道長(zhǎng)储笑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)圆恤,這世上最難降的妖魔是什么突倍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮盆昙,結(jié)果婚禮上羽历,老公的妹妹穿的比我還像新娘。我一直安慰自己淡喜,他們只是感情好秕磷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著炼团,像睡著了一般澎嚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘟芝,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天易桃,我揣著相機(jī)與錄音,去河邊找鬼模狭。 笑死颈抚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚼鹉。 我是一名探鬼主播贩汉,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锚赤!你這毒婦竟也來(lái)了匹舞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤线脚,失蹤者是張志新(化名)和其女友劉穎赐稽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浑侥,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姊舵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寓落。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片括丁。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伶选,靈堂內(nèi)的尸體忽然破棺而出史飞,到底是詐尸還是另有隱情尖昏,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布构资,位于F島的核電站抽诉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吐绵。R本人自食惡果不足惜迹淌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拦赠。 院中可真熱鬧巍沙,春花似錦、人聲如沸荷鼠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)允乐。三九已至矮嫉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牍疏,已是汗流浹背蠢笋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳞陨,地道東北人昨寞。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像厦滤,于是被迫代替她去往敵國(guó)和親援岩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容