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

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

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

Chocolateyは、Windows向けパッケージ管理ソフトウェアです。Windows上で動作するソフトウェアの依存関係を含め、簡単に更新・インストール・アンインストール・検索を行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1287閲覧

IndexError: string index out of range というエラーを本コードで解決したい

yuncy21

総合スコア2

Chocolatey

Chocolateyは、Windows向けパッケージ管理ソフトウェアです。Windows上で動作するソフトウェアの依存関係を含め、簡単に更新・インストール・アンインストール・検索を行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/06 06:25

編集2022/10/06 06:27

前提

bertの勉強をしようと軽く触れた段階です。プログラミング自体初心者です。
https://www.ai-shift.jp/techblog/281
勉強にあたって、上記のサイトのコードを実行してみたところ、indexエラーが出ました。

また、エラーの原因と思われる部分のコードがどういった働き(動き)をしているのかを理解できなかったので、併せてご教授いただければ幸いです。

_, predicted_indexes = torch.topk(predictions[masked_index+1], k=1000)

実現したいこと

正常に出力されるようにする。

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-48-1bd1a0f626d1> in <module> 1 text = 'Customer reviews indicate that many modern mobile devices are often unnecessarily * .' 2 candidate = ["complication", "complicates", "complicate", "complicated"] ----> 3 print(part5_slover(text,candidate)) <ipython-input-47-2884533de229> in part5_slover(text, candidate) 13 predictions = outputs[0] 14 ---> 15 _, predicted_indexes = torch.topk(predictions[masked_index+1], k=1000) 16 predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_indexes.tolist()) 17 IndexError: string index out of range

該当のソースコード

def part5_slover(text, candidate): tokens = tokenizer.tokenize(text) masked_index = tokens.index("*") #何番目に*が出てくるのか(数値) tokens[masked_index] = "[MASK]" #*をMASKに変更 tokens = ["[CLS]"] + tokens + ["[SEP]"] #前後に[CLS][SEP]追加 ids = tokenizer.convert_tokens_to_ids(tokens) #id化 ids = torch.tensor(ids).reshape(1,-1) #テンソル化 ids = ids.cuda() with torch.no_grad(): outputs, _ = model(ids) predictions = outputs[0] _, predicted_indexes = torch.topk(predictions[masked_index+1], k=1000) predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_indexes.tolist()) for i, v in enumerate(predicted_tokens): if v in candidate: return (i, v) return "don't know"
text = 'Customer reviews indicate that many modern mobile devices are often unnecessarily * .' candidate = ["complication", "complicates", "complicate", "complicated"] print(part5_slover(text,candidate))

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

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

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

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

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

jbpb0

2022/10/07 05:15 編集

「def part5_slover(text, candidate):」関数内のエラーが出てる行のすぐ上に下記を追加して実行したら分かりますけど、「predictions」は「p」という文字が一つ入ってるだけです print(outputs) print(predictions) print(type(predictions)) print(len(predictions)) print(masked_index) 一文字なので、参照できるのは下記だけです predictions[0] それなのに、「predictions[masked_index+1]」で「masked_index+1」(=16)番目を参照しようとして、エラーになってます > outputs, _ = model(ids) を実行した結果の時点の「outputs」が既にダメですよね
yuncy21

2022/10/08 11:11

丁寧にありがとうございますm(_ _)m 勉強になります。 今コードを触れる環境にないので後ほど試してみます。 別件になりますが、良ければ教えて頂きたいです。outputsの後ろや、predicted indexesの前後についている -, や _, の働きについて知りたいです。調べてみましたがよく分かりませんでした…。
yuncy21

2022/10/09 06:48

ありがとうございます。
guest

回答1

0

ベストアンサー

outputs, _ = model(ids) predictions = outputs[0]

↓ 修正

outputs = model(ids) predictions = outputs.prediction_logits[0]

とすれば、質問の入力の場合はエラーは出なくなります
他の入力では試してないので、これで常に結果が正しくなるのかは分かりません

投稿2022/10/07 05:18

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問