これは私が長い間頭を悩ませてきた問題なので、どんな助けでも素晴らしいでしょう。次の形式の複数の行を含むファイルがあります(単語、単語が出現した時間、および特定のインスタンス内の特定の単語を含むドキュメントの頻度)。以下は、inputfileがどのように見えるかの例です。
#inputfile
<word, time, frequency>
apple, 1, 3
banana, 1, 2
apple, 2, 1
banana, 2, 4
orange, 3, 1
以下にPythonクラスがあり、キーとして使用し、値として頻度を使用して上記のファイルを格納するための2次元辞書を作成するために使用しました。
class Ddict(dict):
'''
2D dictionary class
'''
def __init__(self, default=None):
self.default = default
def __getitem__(self, key):
if not self.has_key(key):
self[key] = self.default()
return dict.__getitem__(self, key)
wordtime=Ddict(dict) # Store each inputfile entry with a <word,time> key
timeword=Ddict(dict) # Store each inputfile entry with a <time,word> key
# Loop over every line of the inputfile
for line in open('inputfile'):
word,time,count=line.split(',')
# If <word,time> already a key, increment count
try:
wordtime[word][time]+=count
# Otherwise, create the key
except KeyError:
wordtime[word][time]=count
# If <time,word> already a key, increment count
try:
timeword[time][word]+=count
# Otherwise, create the key
except KeyError:
timeword[time][word]=count
私が持っている質問は、この2D辞書のエントリを反復処理しながら特定のものを計算することに関するものです。各時間「t」での各単語「w」について、以下を計算します。
- 時間「t」内 の単語「w」を含むドキュメントの数。(a)
- 時間「t」内に 単語「w」がないドキュメントの数。(b)
- 時間「t」以外 の単語「w」を含むドキュメントの数。(c)
- 時間't'以外 の単語'w'のないドキュメントの数。(d)
上記の各項目は、各単語と時間のカイ2乗分割表のセルの1つを表しています。これらすべてを単一のループ内で計算できますか、それとも一度に1つずつ実行する必要がありますか?
理想的には、出力を以下のようにしたいと思います。ここで、a、b、c、dは、上記で計算されたすべての項目です。
print "%s, %s, %s, %s" %(a,b,c,d)
上記の入力ファイルの場合、時間「1」で単語「apple」の分割表を見つけようとした結果は、になります(3,2,1,6)
。各セルの計算方法を説明します。
- 「3」ドキュメントには、時間「1」内に「apple」が含まれています。
- 時間「1」内に「apple」を含まない「2」ドキュメントがあります。
- 時間「1」の外に「apple」を含む「1」ドキュメントがあります。
- 「apple」(1 + 4 + 1)という単語を含まない「1」以外の6つのドキュメントがあります。