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)のカウント」です。あなたがループの中で次のように追加することができます
ありがとうございました。もう2つの質問をすることができますか?(このサイトのルールに違反していないことを願っています。)(1)最高の頻度でk、vの値を並べ替えるにはどうすればよいですか?私は高周波数とMLEのprobに合わせてbigramを配列したいと思います。(2)2番目に、bigramのwhloleを計算するためにvの値全体を合計したいと思います... –
(1)頻度で値をソートするには、別の解決策を知っているのではなく、すべての頻度値をリストにコピーして並べ替えます。ループ内で 'freq_list.append(v)'を実行し、その後に 'freq_list.sort()'を呼び出すことができます。 (2)そのリストを参照して、値を合計変数に追加します(同じループ内で実行することもできます)。ルールに違反しているかどうかは分かりませんが、私はここで全く新しいです:D – divandc