前々回に引き続き、学習済みのBERTのモデルを使ってTOEICの問題を解いてみようと思います。今回はいよいよ最難関と思われるPart7です。Part7は長文読解問題で、英語の長文を読んで内容に関する設問に答えます。前々回の最後にも話しましたが問題としてはSQuADに近いと思うので、SQuADでfine-tuningされたモデルを使おうと思います。今回も問題はIIBC公式のサンプル問題を使用させていただきます。略で、スタンフォード大学が作った質問応答データセットです。1つの問題がwikipediaの記事からきたテキスト、その内容に対する質問文、テキストの中にある質問に対する回答のセットで構成されています。(開始位置269文字目)アメリカのシンガーソングライター、ビヨンセさんの記事ですね。有名になったのはいつからか、という質問に対して1990年後半という回答になります。2.0から答えられない問題is_impossibleも考慮する必要がありますが今回は割愛させていただきます。BERT学習済みモデルの読み込みここから実装に入ります。毎度お世話になっているhuggingfaceのtransformersを利用します。BertForQuestionAnswering.from_pretrained('bert-large-cased-whole-word-masking-finetuned-squad')以前まではbaseモデルを利用していましたが、今回はSQuADでfine-tuningされたモデルを利用します。country.",]回答方法SQuADで学習したモデルはテキストと質問文を入力して、回答のテキスト内での位置を出力します。Part7でも同様にテキストと質問文を入力して、出力された回答位置から回答文を抽出し、Part6のときと同じように、ベクトル化したときに最もcos類似度が近い候補を回答とすることとします。問題文章をTokenIDのリストに変換する今回は質問文とテキストを特殊トークン[SEP]で区切ってトークン化します。tokenizer.convert_tokens_to_ids(tokens)TokenIDのタイプを設定テキストと質問文の範囲を指定するtoken_type_idsを定義します。[SEP]トークンのIDが102なので、それ以降を1にしています。range(len(input_ids))]BERTによる予測BERTのモデルで予測をします。出力は回答がトークンのどの範囲にあるのかの開始位置と終了位置のスコアです。出力されたトークンで最もスコアの高い位置のテキストを回答として抽出します。抽出された回答と候補をベクトル化し、cos類似度を比較します。ベクトル化にはPart6のときに使用した関数を利用します。repaired.正解です!抽出文とは離れていますが、他の選択肢が的外れすぎたのからでしょうか。maintain.'Ghorbaniさんが車を売る理由として、海外に行くことを抽出できているので、回答抽出はうまくいってそうですが、候補はうまく選べていません異なる問題を解いてみるもう一問解いてみました結果3問中1問正解と、あまりいい結果ではありませんでした。〜」で聞かれている質問で、抽出された回答はたしかに述べられている内容なのですが、候補と合っておらず間違った候補を選択してしまっています。問題1ではたまたま正解でしたが、こういった類の問題が苦手なのかもしれません。総合成績は5問中2問正解であまり良くなく、以下のような弱点があるのではと考えました。候補選択でのcos類似度による比較そもそも(似ているとはいえ)違うタスクで学習したモデルを使っているので、この辺が限界かな、と思います。3週連続で連載させていただいたBERTでTOEICの問題を解いてみるシリーズ、なんとかPart7まで来ることができました。問題を解く過程でtransformersの使い方など色々勉強できたので非常に楽しかったです。