前提
bertの勉強をしようと軽く触れた段階です。プログラミング自体初心者です。
https://www.ai-shift.co.jp/techblog/550
勉強にあたって、上記のサイトのコードを実行してみたところ、attributeエラーが出ました。
エラーの意味は分かるのですが、どう修正していけばいいかわかりません。解決方法を教えていただきたいです。
python
1tokens = ["[MASK]" if t == "*" else t for i, t in enumerate(tokens)] 2mask_vecs = outputs[0].numpy()[[i+1 for i in masked_indexs]]
1行目のelseが何故必要なのかわかりません。
2行目のmask_vecsは問題文全体のベクトルということで合っていますでしょうか。
よろしくお願いいたします。
実現したいこと
- 正常に動作するようにする
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-37-2942a8726bf2> in <module> 29 30 part6_slover(text,candidate1,answer1,q=1) ---> 31 part6_slover(text,candidate3,answer1,q=3) <ipython-input-36-75a002ca5230> in part6_slover(text, candidate, answer, q) 14 with torch.no_grad(): 15 outputs, _ = model.bert(ids) ---> 16 mask_vecs = outputs[0].numpy()[[i+1 for i in masked_indexs]] 17 18 c_vecs = np.array([get_bert_vec(c) for c in candidate]) AttributeError: 'str' object has no attribute 'numpy'
該当のソースコード
Python
1def part6_slover(text, candidate, answer, q): 2 if max([len(tokenizer.tokenize(c)) for c in candidate]) == 1: #candidate(候補)を順番に見てすべて1単語であれば 3 return part5_slover(text, candidate, answer) #part5のロジックを使用 4 tokens = tokenizer.tokenize(text) #textをトークン化 5 tokens = ["[MASK]" if t == "*" else t for i, t in enumerate(tokens)] #トークンを順番に見て*を[MASK]に変更 6 tokens = ["[CLS]"] + tokens + ["[SEP]"] #前後に[CLS],[SEP]を付与 7 8 ids = tokenizer.convert_tokens_to_ids(tokens) #id化 9 ids = torch.tensor(ids).reshape(1,-1) #テンソル化 10 ids = ids.cuda() #GPU 11 12 masked_indexs = [i for i, v in enumerate(ids[0]) if v == 103] #[MASK]のid(103)がでてくるのは何番目か 13 14 with torch.no_grad(): #文章ベクトルを計算 15 outputs, _ = model.bert(ids) 16 mask_vecs = outputs[0].numpy()[[i+1 for i in masked_indexs]] #? 17 18 c_vecs = np.array([get_bert_vec(c) for c in candidate]) #選択肢の文章ベクトルを計算 19 return candidate[cosine_similarity([mask_vecs[q-1]], c_vecs)[0].argsort()[-1]] #cos類似度の高いものを戻り値に
コメントは独自に意味を汲み取ったものです。誤った捉え方をしていたら教えてほしいです。
その記法は「リスト内包表記」と呼ばれるものです,そちらに関してご自身で調査いただいて,わからない内容を聞かれるのが建設的かと思います.
outputs[0]の中身がstring型になっているのでシステム君が[string型変数にnumpy()ってメソッドなんかないで!]って怒られてます。十中八九呼び出し方かmodel.bertの返り値のどちらかがおかしいのが原因です。私自身もあまり詳しくないのであまり出しゃばらずに修正方法はほかの詳しい人に任せます。
[]の記述方法は内包表記と言います。
詳しい解説はこちらを参照ください。
https://aiacademy.jp/media/?p=1252
内包表記を調べて、プログラムを見ると、大方の内容は汲み取ることができました。
ありがとうございます。
それでもわからない部分が出てきましたので、質問内容をそのように編集させていただきます。
型の違いについては私の知識ではわかりませんでした...。
回答1件
あなたの回答
tips
プレビュー