BLOGBERTでTOEICの問題を解いてみる2BERTでTOEICの問題を解いてみる22020.01.23自然言語処理(NLP)こんにちわAIチームの戸田です前回に引き続き、学習済みのBERTのモデルを使ってTOEICの問題を解いてみようと思います。今回はPart6に挑戦しました。6は長文穴埋め問題となっており、空白がある英語の長文に、文法・意味的に最も適した選択肢を選んで入れます。難易度が上がっています。今回は選択肢が単語ではなくイディオムや文章だったりします。学習済みのBERTを使って解く際にこのあたりを工夫しなければいけませんでした。今回も問題はIIBC公式のサンプル問題を使用させていただきます。BertForPreTraining.from_pretrained('bert-base-uncased')問題定義textに問題の文章、candidate1~4に問題1~4の穴埋め候補をリストで定義します問題文章の空欄部分は*とします。5と同じ方法で解けそうですが、問題3,4は複数単語あるので何か別の方法を考える必要がありそうです。回答方法BERTは空白部分のtokenベクトルと候補の文章ベクトルをcos類似度で比較して、最も近いものを回答とすることにしました。問題文章をTokenIDのリストに変換するこちらはPart5の時と同様ですね。今回は空欄が4箇所あります。空欄部分のベクトルを取得するため、空欄tokenのインデックスを確保しておきます。文章全体をベクトル化し、先程確保しておいたインデックスから空欄部分のベクトルを取得します。masked_indexs]]空欄埋め候補の文章をベクトル化する空欄埋め候補の4つの選択肢の文章をベクトル化します。最終層の出力の平均をとっています。candidate3])各ベクトル同士のcos類似度を計算する文章全体のベクトルと空欄埋め候補の各ベクトルのcos類似度を比較します。近い候補を回答候補とします。time」が適切で、見事正解です。c_vecs)[0].argsort()[-1]]結果4問中3問正解でした1問ミスですが、間違えた2問目はPart5のロジックを使った部分なので、長文中での空欄予測は1単語であってもまた異なった方法が必要なのかもしれません。6の問題を解いてみました。複数単語の問題は解けましたが、完全回答するにはやはり問題に特化したfine-tuningが必要そうです。イメージとしてはSQuADに近いと思うので、SQuADの事前トレーニングモデルを使おうと思います。