2016-05-08 14 views
0

次は私のコードです。コメントが見つからない場合は、コードを追加します。文字列の長さが '0'の理由が分かりません

filenames2 = ['BROWN1_L1.txt', 'BROWN1_M1.txt', 'BROWN1_N1.txt', 'BROWN1_P1.txt', 'BROWN1_R1.txt'] 
with open("C:/Python27/L1_R1_TRAINING.txt", 'w') as outfile: 
    for fname in filenames2: 
     with open(fname) as infile: 
      for line in infile: 
       outfile.write(line) 

b = open("C:/Python27/L1_R1_TRAINING.txt", 'rU')  

filenames3 =[] 
    for path, dirs, files in os.walk("C:/Python27/Reutertest"): 
     for file in files: 
      file = os.path.join(path, file) 
      filenames3.append(file) 

    with open("C:/Python27/REUTER.txt", 'w') as outfile: 
     for fname in filenames3: 
      with open(fname) as infile: 
       for line in infile: 
        outfile.write(line) 
c = open("C:/Python27/REUTER.txt", 'rU') 

def Cross_Entropy(x,y): 
filecontents1 = x.read() 
filecontents2 = y.read() 
sentence1 = filecontents1.upper() 
sentence2 = filecontents2.upper() 
count_A1 = sentence1.count('A') 
count_B1 = sentence1.count('B') 
count_C1 = sentence1.count('C') 
count_all1 = len(sentence1) 
prob_A1 = count_A1/count_all1 
prob_B1 = count_B1/count_all1 
prob_C1 = count_C1/count_all1 
count_A2 = sentence2.count('A') 
count_B2 = sentence2.count('B') 
count_C2 = sentence2.count('C') 
count_all2 = len(sentence2) 
prob_A2 = count_A2/count_all2 
prob_B2 = count_B2/count_all2 
prob_C2 = count_C2/count_all2 
Cross_Entropy = -(prob_A1 * math.log(prob_A2, 2) + prob_B1 * math.log(prob_B2, 2) + prob_C1 * math.log(prob_C2, 2) 

Cross_Entropy(b, c) 

はい。今。私はエラー"prob_A1 = count_A1/count_all1 ZeroDivisionError: division by zero"を持っています。私のコードに何が問題なの?私の正書法は間違っていますか?

+0

あなたのインデントは意味がありません。また、Pythonでは(Visual Basicとは異なり)関数名に代入することで値を返さないので、 'Cross_Entropy = - (prob_A1')で始まる行は、あなたがしたいことをしません。 - (prob_A1 ... ' –

+0

もう一つのアイデア:デザインの観点からは、' Cross_Entropy'を2つの文字列(2つのファイルハンドルではなく)を必要とする関数にして、ファイルを読み込むロジックを分離することができますクロスエントロピー(それが何であれ)を計算するロジックからです。一般的に、関数は1つだけを実行しようとします。その関数は2つの無関係なものを実行しようとしています。 –

+0

3行目から最後の行それを上書きする。 –

答えて

0

私は、ファイルから、あなたの文字列を読むためにあなたの失敗の背後にあるものはかなりわからないんだけど、あなたのクロスエントロピーがはるかに簡潔に計算することができます。

def crossEntropy(s1,s2): 
    s1 = s1.upper() 
    s2 = s2.upper() 
    probsOne = (s1.count(c)/float(len(s1)) for c in 'ABC') 
    probsTwo = (s2.count(c)/float(len(s2)) for c in 'ABC') 
    return -sum(p*math.log(q,2) for p,q in zip(probsOne,probsTwo)) 

例えば、

>>> crossEntropy('abbcabcba','abbabaccc') 
1.584962500721156 

これを計算したい場合は、文字列を組み立ててcrossEntropyに渡すことに集中できるようになりました。私はあなたが作成しようとしている2つのファイルが必要な場合を除いて、読み書き読み込みロジックを取り除くことをお勧めします。2つのディレクトリにあるファイルを2つの配列に直接読み込み、すべてのホワイトスペースとは、crossEntropy

もう一つの可能​​なアプローチに渡されます。 場合あなたが望むすべてのは、「A」、「B」、「C」の数は、二つのディレクトリにある - ちょうど両方の「A」、「B」をキーと2つの辞書、各ディレクトリに1つずつ、作成、および " C 'に変換し、各ディレクトリ内のファイルを順番に読み込み、各ファイルを繰り返し読み込み、結果の文字列を保存せず、これらの3文字の数を取得して、crossEntropyという2つの辞書が必要です。

ような何か:たとえば

def crossEntropy(d1,d2): 
    countOne = sum(d1[c] for c in 'ABC') 
    countTwo = sum(d2[c] for c in 'ABC') 
    probsOne = (d1[c]/float(countOne) for c in 'ABC') 
    probsTwo = (d2[c]/float(countTwo) for c in 'ABC') 
    return -sum(p*math.log(q,2) for p,q in zip(probsOne,probsTwo)) 

>>> d1 = {'A':3,'B':5,'C':2} 
>>> d2 = {'A':2,'B':5,'C':3} 
>>> crossEntropy(d1,d2) 
1.54397154729945 
関連する問題