前提・実現したいこと
ファイル単位で単語の出現頻度を数えるプログラムを製作しています。
オブジェクトの中に別のオブジェクトを入れ子にするやり方が分からず躓いています。
発生している問題・エラーメッセージ
キーが正しく指定できていないか、そもそもプログラムの他の部分を間違えているか、だと思い色々試しましたが、原因がつかめていないです。
TypeError Traceback (most recent call last) <ipython-input-42-8fc6c919059b> in <module>() 22 # もし、そのキーの値が参照する無名辞書オブジェクトにファイル名をキーとするレコードが存在していれば 23 if name in dict[token.surface]: ---> 24 dict[token.surface][name] += 1 25 # さもなくば 26 else: TypeError: string indices must be integers
該当のソースコード
エラー該当部分を抜き出したのは以下の4行
if name in dict[token.surface]:
dict[token.surface][name] += 1
else:
dict[token.surface][name] = 1
以下プログラム全文
python
1# 必要なライブラリを読み込む 2import os 3from janome.tokenizer import Tokenizer 4t = Tokenizer() 5# データフォルダの設定 6DATA = CJE3 + "/data" 7for filename in os.listdir(DATA): 8 f = open(DATA + '/' + filename, 'r') 9 name = filename 10# 辞書オブジェクトの初期化 11dict = {} 12# DATAフォルダに含まれるファイルを一つずつ処理 13for line in f: 14 # ファイルを1行ずつ処理 15 tokens = t.tokenize(line) 16 # 分かち書きした単語を一つずつ処理 17 for token in tokens: 18 # もしdictに単語をキーとするレコードが存在していれば 19 if token.surface in dict: 20 # もし、そのキーの値が参照する無名辞書オブジェクトにファイル名をキーとするレコードが存在していれば 21 if name in dict[token.surface]: 22 dict[token.surface][name] += 1 23 # さもなくば 24 else: 25 dict[token.surface][name] = 1 26 # さもなくば 27 else: 28 dict[token.surface] = name 29 30# 全体の出力(ソート) 31for key1 in dict: 32 for key2 in dict[key1]: 33 print(key1 + '\t' + key2 + '\t' + str(dict[key1][key2]))
試したこと
dict[token.surface] = {} を入れてみる。(入れる場所が間違っていた可能性あり)
回答1件
あなたの回答
tips
プレビュー