質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1565閲覧

自然言語処理入門書でエラーがでる件

ThAoyagi

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/06/05 23:53

編集2021/06/06 01:40

打ち消し線### 前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/06/06 00:01

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
ThAoyagi

2021/06/06 00:36

ご指摘、ありがとうございます。修正致しました。宜しくお願い致します。
jbpb0

2021/06/06 00:56

エラーは、 Traceback... のところから、省略せずに全部書いてください (もちろん、ユーザー名等の個人情報は伏せ字にしてかまいません) ここに書かないで、質問を編集して追記してください
jbpb0

2021/06/06 01:11 編集

あと、書籍のどのページのコードか書いてくれたらありがたいです 探すの面倒くさいので
jbpb0

2021/06/06 02:14 編集

92ページのリスト4は実行できますか? エラー出ないなら、リスト5, 6, 9も試してください (リスト9は、74ページのリスト17の修正版です)
ThAoyagi

2021/06/06 05:10

サポート頂きありがとうございます。 リスト4,5,6は実行できました。リスト9が以下のエラーとなりました。  File ”dialogue_agent_with_preprocessing.py" ,line30 ,in_tokenize if features[6] !='*' \ IndexError:list index out of range  となりました。 (上の¥はバックスラッシュです)  宜しくお願い致します。
jbpb0

2021/06/06 08:18 編集

リスト9は(そしておそらく質問のコードも) text = unicodedata.normalize('NFKC', text) text = neologdn.normalize(text) text = text.lower() の3行を全部コメント化して無効にしたら、エラー出ないと思います そこから、どの行を有効に戻したらエラーが出るか、確認してください エラーの原因の処理が分かったら、書籍の「02.2 正規化」(83ページ〜)の、エラー原因の処理に該当する部分の解説を読みながら、そこのコードを実行して、どうなるか確認してください おそらく、書籍に書かれてるような結果にはならないと思います
ThAoyagi

2021/06/06 11:36

迅速なサポートを頂き感謝です。 3行をコメント致しましたが、同じエラーが発生しました。 リスト9と対象もおなじです。  お手数おかけします。宜しくお願い致します。
jbpb0

2021/06/06 15:40

> 3行をコメント致しましたが、同じエラーが発生しました。 それは失礼しました エラー原因詳しく調べようと、質問のコードを動かしてみたら、エラー出ずに動いてしまいました 実行手順を回答に書いたので、確認してください
jbpb0

2021/06/07 00:35

CSVファイルは、書籍のサンプルコードのZIP内のものをお使いでしょうか? もし、独自に作成したCSVファイルを使っているなら、書籍のサンプルコードのZIP内のものを(手を加えずにそのまま)使ってみてください もしかしたら、作成したCSVファイルに何か問題があるのかもしれませんので
guest

回答1

0

ベストアンサー

Google Colabで質問のコードを(ほぼ)そのまま動かしたら、エラー出ずに実行できました

手順を書くので、やってみてください
サンプルコードダウンロードサイト から、書籍のサンプルコードのZIPを、手元のPC内にダウンロードして解凍
・Google Colabでノートブックを新規作成
・書籍サンプルコードの「dialogue_agent_data」ディレクトリ内のCSVファイルを全部、Google Colabの「sample_data」ディレクトリにアップロード
・下記コードをGoogle Colabで実行

python

1!pip uninstall -y tensorflow 2!pip uninstall -y keras-nightly 3!pip uninstall -y keras 4!pip install tensorflow==1.15.3 5!pip install keras==2.3.1 6 7!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab 8!pip install mecab-python3 9!ln -s /etc/mecabrc /usr/local/etc/mecabrc 10!pip install neologdn

・下記コードをGoogle Colabで実行

python

1import unicodedata 2from os.path import dirname, join, normpath 3 4import MeCab 5import neologdn 6import pandas as pd 7from sklearn.feature_extraction.text import TfidfVectorizer 8from sklearn.pipeline import Pipeline 9from keras.layers import Dense 10from keras.models import Sequential 11from keras.wrappers.scikit_learn import KerasClassifier 12 13 14 15 16class DialogueAgent: 17 def __init__(self): 18 self.tagger = MeCab.Tagger() 19 20 def _tokenize(self, text): 21 text = unicodedata.normalize('NFKC', text) 22 text = neologdn.normalize(text) 23 text = text.lower() 24 25 node = self.tagger.parseToNode(text) 26 result = [] 27 while node: 28 features = node.feature.split(',') 29 30 if features[0] != 'BOS/EOS': 31 if features[0] not in ['助詞', '助動詞']: 32 token = features[6] \ 33 if features[6] != '*' \ 34 else node.surface 35 result.append(token) 36 37 node = node.next 38 39 return result 40 41 def _build_mlp(self, input_dim, hidden_units, output_dim): 42 mlp = Sequential() 43 mlp.add(Dense(units=hidden_units, 44 input_dim=input_dim, 45 activation='relu')) 46 mlp.add(Dense(units=output_dim, activation='softmax')) 47 mlp.compile(loss='categorical_crossentropy', 48 optimizer='adam') 49 50 return mlp 51 52 def train(self, texts, labels): # <1> 53 vectorizer = TfidfVectorizer(tokenizer=self._tokenize, 54 ngram_range=(1, 2)) 55 vectorizer.fit(texts) 56 57 feature_dim = len(vectorizer.get_feature_names()) 58 n_labels = max(labels) + 1 59 60 classifier = KerasClassifier(build_fn=self._build_mlp, 61 input_dim=feature_dim, 62 hidden_units=32, 63 output_dim=n_labels) 64 65 pipeline = Pipeline([ 66 ('vectorizer', vectorizer), 67 ('classifier', classifier), 68 ]) 69 70 pipeline.fit(texts, labels, classifier__epochs=100) 71 72 self.pipeline = pipeline 73 74 def predict(self, texts): 75 return self.pipeline.predict(texts) # <2> 76 77 78if __name__ == '__main__': 79 #BASE_DIR = normpath(dirname(__file__)) 80 from pathlib import Path 81 BASE_DIR = normpath(Path().resolve()) 82 83 #training_data = pd.read_csv(join(BASE_DIR, './training_data.csv')) 84 training_data = pd.read_csv(join(BASE_DIR, './sample_data/training_data.csv')) 85 86 87 dialogue_agent = DialogueAgent() 88 dialogue_agent.train(training_data['text'], training_data['label']) 89 90 #with open(join(BASE_DIR, './replies.csv')) as f: 91 with open(join(BASE_DIR, './sample_data/replies.csv')) as f: 92 replies = f.read().split('\n') 93 94 input_text = '名前を教えてよ' 95 predictions = dialogue_agent.predict([input_text]) 96 predicted_class_id = predictions[0] 97 98 print(replies[predicted_class_id])

上記二つ目のPythonコードは、Google Colabで動くように、質問のコードを3ヶ所修正しただけです

Google Colabで質問のコードが(ほぼ)そのままでエラー出ずに動くことから、エラーの原因はコードではなく、質問者さんの実行環境・条件のどこかに原因がある可能性があります

投稿2021/06/06 14:45

編集2021/06/06 23:51
jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ThAoyagi

2021/06/07 10:04

サポートありがとうございます。 ガイドに沿って、Google colabを使い、修正をしたところ、エラーが解消いたしました。 短時間で、ヘルプして頂き感謝です。ありがとうございます。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問