AIうぉ--!(ai-wo-katsuyo-shitai !)

AIを上手く使ってみせたい!!自分なりに。

BERT 。 1 たす 1 は 、 日本語 。(自然言語処理の限界。。)

BERT 。 1 たす 1 は 、 日本語 。

このタイトルは、自然言語処理のBERTで、以下のように、『日本語』の部分をふせて
「穴埋め」問題にした場合の、結果です。

BERT。1たす1は、{*}。

なんとなく、キャッチーな気がしたので、タイトルにして別記事の単なる再掲。 (ちょっと、様子を把握しておく価値はあるかと思います。)
元記事は、

ai-de-seikei.hatenablog.com

です。




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の記事のコードを利用させて頂きました! 多謝。

https://qiita.com/outermostkt/items/6fe48eaa7101925309f6