打ち消し線### 前提・実現したいこと
15stepで踏破 自然言語処理 アプリケーション開発入門で pythonを勉強しています。
サンプルコードを実行したのですが、エラーが出てしまい、原因がわからず、
エラーの理由がわかると助かります。 宜しくお願い致します。
* 本のページは、220~222Page目が該当します。
以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
File "dialogue_agent.py", line 31,in _tokenize if features[6] != '*'\ IndexError:list index out of range
該当のソースコード
python
1 2 3import unicodedata 4from os.path import dirname, join, normpath 5 6import MeCab 7import neologdn 8import pandas as pd 9from sklearn.feature_extraction.text import TfidfVectorizer 10from sklearn.pipeline import Pipeline 11from keras.layers import Dense 12from keras.models import Sequential 13from keras.wrappers.scikit_learn import KerasClassifier 14 15 16 17 18class DialogueAgent: 19 def __init__(self): 20 self.tagger = MeCab.Tagger() 21 22 def _tokenize(self, text): 23 text = unicodedata.normalize('NFKC', text) 24 text = neologdn.normalize(text) 25 text = text.lower() 26 27 node = self.tagger.parseToNode(text) 28 result = [] 29 while node: 30 features = node.feature.split(',') 31 32 if features[0] != 'BOS/EOS': 33 if features[0] not in ['助詞', '助動詞']: 34 token = features[6] \ 35 if features[6] != '*' \ 36 else node.surface 37 result.append(token) 38 39 node = node.next 40 41 return result 42 43 def _build_mlp(self, input_dim, hidden_units, output_dim): 44 mlp = Sequential() 45 mlp.add(Dense(units=hidden_units, 46 input_dim=input_dim, 47 activation='relu')) 48 mlp.add(Dense(units=output_dim, activation='softmax')) 49 mlp.compile(loss='categorical_crossentropy', 50 optimizer='adam') 51 52 return mlp 53 54 def train(self, texts, labels): # <1> 55 vectorizer = TfidfVectorizer(tokenizer=self._tokenize, 56 ngram_range=(1, 2)) 57 vectorizer.fit(texts) 58 59 feature_dim = len(vectorizer.get_feature_names()) 60 n_labels = max(labels) + 1 61 62 classifier = KerasClassifier(build_fn=self._build_mlp, 63 input_dim=feature_dim, 64 hidden_units=32, 65 output_dim=n_labels) 66 67 pipeline = Pipeline([ 68 ('vectorizer', vectorizer), 69 ('classifier', classifier), 70 ]) 71 72 pipeline.fit(texts, labels, classifier__epochs=100) 73 74 self.pipeline = pipeline 75 76 def predict(self, texts): 77 return self.pipeline.predict(texts) # <2> 78 79 80if __name__ == '__main__': 81 BASE_DIR = normpath(dirname(__file__)) 82 83 training_data = pd.read_csv(join(BASE_DIR, './training_data.csv')) 84 85 dialogue_agent = DialogueAgent() 86 dialogue_agent.train(training_data['text'], training_data['label']) 87 88 with open(join(BASE_DIR, './replies.csv')) as f: 89 replies = f.read().split('\n') 90 91 input_text = '名前を教えてよ' 92 predictions = dialogue_agent.predict([input_text]) 93 predicted_class_id = predictions[0] 94 95 print(replies[predicted_class_id]) 96
補足情報(FW/ツールのバージョンなど)
環境 goorm
tensorflow 1.14.0
keras 2.1.6
pythonのコードの一番最初の行のすぐ上に
```python
だけの行を追加してください
また、pythonのコードの一番最後の行のすぐ下に
```
だけの行を追加してください
現状、コードがとても読み辛いです
質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
ご指摘、ありがとうございます。修正致しました。宜しくお願い致します。
エラーは、
Traceback...
のところから、省略せずに全部書いてください
(もちろん、ユーザー名等の個人情報は伏せ字にしてかまいません)
ここに書かないで、質問を編集して追記してください
あと、書籍のどのページのコードか書いてくれたらありがたいです
探すの面倒くさいので
92ページのリスト4は実行できますか?
エラー出ないなら、リスト5, 6, 9も試してください
(リスト9は、74ページのリスト17の修正版です)
サポート頂きありがとうございます。
リスト4,5,6は実行できました。リスト9が以下のエラーとなりました。
File ”dialogue_agent_with_preprocessing.py" ,line30 ,in_tokenize
if features[6] !='*' \
IndexError:list index out of range
となりました。 (上の¥はバックスラッシュです)
宜しくお願い致します。
リスト9は(そしておそらく質問のコードも)
text = unicodedata.normalize('NFKC', text)
text = neologdn.normalize(text)
text = text.lower()
の3行を全部コメント化して無効にしたら、エラー出ないと思います
そこから、どの行を有効に戻したらエラーが出るか、確認してください
エラーの原因の処理が分かったら、書籍の「02.2 正規化」(83ページ〜)の、エラー原因の処理に該当する部分の解説を読みながら、そこのコードを実行して、どうなるか確認してください
おそらく、書籍に書かれてるような結果にはならないと思います
迅速なサポートを頂き感謝です。
3行をコメント致しましたが、同じエラーが発生しました。
リスト9と対象もおなじです。
お手数おかけします。宜しくお願い致します。
> 3行をコメント致しましたが、同じエラーが発生しました。
それは失礼しました
エラー原因詳しく調べようと、質問のコードを動かしてみたら、エラー出ずに動いてしまいました
実行手順を回答に書いたので、確認してください
CSVファイルは、書籍のサンプルコードのZIP内のものをお使いでしょうか?
もし、独自に作成したCSVファイルを使っているなら、書籍のサンプルコードのZIP内のものを(手を加えずにそのまま)使ってみてください
もしかしたら、作成したCSVファイルに何か問題があるのかもしれませんので
回答1件
あなたの回答
tips
プレビュー