1. 程式人生 > >Python自然語言處理—條件詞頻分佈

Python自然語言處理—條件詞頻分佈

一 條件詞頻統計

由於要按條件統計詞頻,自己準備資料較為麻煩,本次資料集呼叫NLTK自帶的資料集,

from nltk.corpus import brown
cdf = nltk.ConditionalFreqDist((genre,word) for genre in brown.categories() 
                            for word in brown.words(categories=genre))
modals = ['can','could', 'may','might']
cdf.tabulate(samples = modals)

第一步將資料集變為(category,word)的形式,再統計頻率,結果如下。

當然可以在統計詞頻的過程中,使用一些判斷條件,來讓結果更符合你的需求。


二 繪製分佈圖和分佈表

使用plot()和tabulate()函式即可

cdf.tabulate(samples = modals,conditions=['news','lore'])
cdf.plot(samples = modals,conditions=['news','lore'])

結果如下


三 利用連詞生成隨機文字

為了便於大家理解,本次資料集使用的是2000道數學題組合的文字,詳情見

Python自然語言處理—統計詞頻,當然本次資料集我偷偷將符號都去掉了。

mathbigrams = nltk.bigrams(text) #首先將一段話[w1,w2,w3...],拆成[[w1,w2],[w2,w3]..]
cdf = nltk.ConditionalFreqDist(mathbigrams) # 條件詞頻統計


def generate_model(cfdist, word, num=20):  # 程式設計生成隨機文字的方法
    for i in range(num):
        print(word,end='')  # 為了保證不換行
        word = cfdist[word].max()  # 每個詞接下來的詞就是根據樣本決定的

generate_model(cdf,'數學')
generate_model(cdf,'語文')
generate_model(cdf,'英語')

 

分別用數學,語文,英語來嘗試一下,可以發現由於生成規則是直接匹配接下來max詞頻的詞,會出現迴圈的結果。優化方法就是根據詞頻來概率的選擇接下來的詞,生成方法可以參考聚類演算法(1)中K-means++ 隨機選初始點的思路。


四 自己文字如何呼叫NLTK第一章的函式

這裡簡單提一種解決思路,將文字匯入到python中然後呼叫nltk.Text()函式即可。

mathe = nltk.Text(text)
mathe.concordance('數學')  # 數學的上下文
mathe.similar('數學')  # 和數學相似的詞
mathe.common_contexts(['數學','語文'])  # 語文數學共有的上下文

然後呼叫了幾個函式嘗試了一下,可以發現結果很不錯。