BertとかのAI、、、文章の本質理解は、まだ遠い!!ことを「穴埋め問題」で確認する。
DeepL含め、ものすごく上手な翻訳が実現できているけれど、これは、極端に言えば、言語to言語の直接の変換であり、中味の理解とはあまり関係がない?、ことに留意する必要があると思う。
Bert穴埋めで試してみた。
問題1
問題
先ほど、お店でりんごを9個買って、帰りながら2個食べた。だから、残りは、{ * }個になった。)
回答 (7個!!でしょう。)
先 ほど 、 お 店 で りんご を 9 個 買っ て 、 帰り ながら 2 個 食べ た 。 だから 、 残り は 、3 個 に なっ た 。
[CLS] 先 ほど 、 お 店 で りんご を 9 個 買っ て 、 帰り ながら 2 個 食べ た 。 だから 、 残り は 、 3 個 に なっ た 。 [SEP] [CLS] 先 ほど 、 お 店 で りんご を 9 個 買っ て 、 帰り ながら 2 個 食べ た 。 だから 、 残り は 、 4 個 に なっ た 。 [SEP] [CLS] 先 ほど 、 お 店 で りんご を 9 個 買っ て 、 帰り ながら 2 個 食べ た 。 だから 、 残り は 、 1 個 に なっ た 。 [SEP] [CLS] 先 ほど 、 お 店 で りんご を 9 個 買っ て 、 帰り ながら 2 個 食べ た 。 だから 、 残り は 、 2 個 に なっ た 。 [SEP] [CLS] 先 ほど 、 お 店 で りんご を 9 個 買っ て 、 帰り ながら 2 個 食べ た 。 だから 、 残り は 、 8 個 に なっ た 。 [SEP]
問題2
問題
私と姉の朋美は双子で、母が和子で、和子の母が裕子です。だから、私の母の名は、{*}です。)
回答(和子!!、でしょう。)
私 と 姉 の 朋美 は 双子 で 、 母 が 和子 で 、 和子 の 母 が 裕子 です 。 だから 、 私 の 母 の 名 は 、 裕子 で す 。
[CLS] 私 と 姉 の 朋美 は 双子 で 、 母 が 和子 で 、 和子 の 母 が 裕子 です 。 だから 、 私 の 母 の 名 は 、 裕子 で す 。 [SEP] [CLS] 私 と 姉 の 朋美 は 双子 で 、 母 が 和子 で 、 和子 の 母 が 裕子 です 。 だから 、 私 の 母 の 名 は 、 和子 で す 。 [SEP] [CLS] 私 と 姉 の 朋美 は 双子 で 、 母 が 和子 で 、 和子 の 母 が 裕子 です 。 だから 、 私 の 母 の 名 は 、 洋子 で す 。 [SEP] [CLS] 私 と 姉 の 朋美 は 双子 で 、 母 が 和子 で 、 和子 の 母 が 裕子 です 。 だから 、 私 の 母 の 名 は 、 雅子 で す 。 [SEP] [CLS] 私 と 姉 の 朋美 は 双子 で 、 母 が 和子 で 、 和子 の 母 が 裕子 です 。 だから 、 私 の 母 の 名 は 、 直子 で す 。 [SEP]
問題3
問題
BERT。1たす1は、{*}。
回答(2!!、でしょう。)
BERT 。 1 たす 1 は 、 日本語 。
[CLS] BERT 。 1 たす 1 は 、 日本語 。 [SEP] [CLS] BERT 。 1 たす 1 は 、 1 。 [SEP] [CLS] BERT 。 1 たす 1 は 、 2 。 [SEP] [CLS] BERT 。 1 たす 1 は 、 [UNK] 。 [SEP] [CLS] BERT 。 1 たす 1 は 、 小学生 。 [SEP]
補足
コードは、
import torch from transformers import BertJapaneseTokenizer from transformers import BertForMaskedLM tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') model = BertForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') input_ids = tokenizer.encode(f'先ほど、お店でりんごを9個買って、帰りながら2個食べた。だから、残りは、{tokenizer.mask_token}個になった。', return_tensors='pt') masked_index = torch.where(input_ids == tokenizer.mask_token_id)[1].tolist()[0] result = model(input_ids) pred_ids = result[0][:, masked_index].topk(5).indices.tolist()[0] for pred_id in pred_ids: output_ids = input_ids.tolist()[0] output_ids[masked_index] = pred_id print(tokenizer.decode(output_ids))
↑ コードは、以下のqiitaの記事のコードを利用させて頂きました! 多謝。