2016-04-22 7 views
0

は私のコードです。bigramペアの頻度をunigram wordでどのように分けることができますか?

from __future__ import division 
import nltk 
import re 

f = open('C:/Python27/brown_A1_half.txt', 'rU') 
w = open('C:/Python27/brown_A1_half_Out.txt', 'w') 

#to read whole file using read() 

filecontents = f.read() 
from nltk.tokenize import sent_tokenize 
sent_tokenize_list = sent_tokenize(filecontents) 

for sentence in sent_tokenize_list: 
    sentence = "Start " + sentence + " End" 
    tokens = sentence.split() 
    bigrams = (tuple(nltk.bigrams(tokens))) 
    bigrams_frequency = nltk.FreqDist(bigrams) 
    for k,v in bigrams_frequency.items(): 
     print k, v 

この場合、印刷結果は「(bigrams)、その頻度」です。ここでは、私が欲しいのは、各バイグラムペアについて であり、バイグラム周波数を最初に出現するunigramワード周波数で除算します。 (例えば、bigram( 'red'、 'apple')があり、その頻度が3であれば、それを 'red'の頻度で除算したい)。 これは、MLE probを取得するためのもので、「MLE prob =(w1、w2)のカウント/(w1)のカウント」です。あなたがループの中で次のように追加することができます

答えて

0

... plzは私を助ける(印刷後にK、V):あなたは、各バイグラムのためのMLE PROBを与える必要があります

number_unigrams = tokens.count(k[0]) 
prob = v/number_unigrams 

+0

ありがとうございました。もう2つの質問をすることができますか?(このサイトのルールに違反していないことを願っています。)(1)最高の頻度でk、vの値を並べ替えるにはどうすればよいですか?私は高周波数とMLEのprobに合わせてbigramを配列したいと思います。(2)2番目に、bigramのwhloleを計算するためにvの値全体を合計したいと思います... –

+0

(1)頻度で値をソートするには、別の解決策を知っているのではなく、すべての頻度値をリストにコピーして並べ替えます。ループ内で 'freq_list.append(v)'を実行し、その後に 'freq_list.sort()'を呼び出すことができます。 (2)そのリストを参照して、値を合計変数に追加します(同じループ内で実行することもできます)。ルールに違反しているかどうかは分かりませんが、私はここで全く新しいです:D – divandc

関連する問題