はじめに
タイトルのとおり、
穴埋め問題で、Bert(日本語)の威力を体感する。
『今日は最悪の一日だ。』
『今日は最高の一日だ。』
の前振りに対するBertの反応をみた。
環境
OS: windows
transformers: 4.9.1
GPU: I do not have a GPU.
検証結果
問題1
問題文
(今日は最悪の一日だ。財布を XXX した。)
input_ids = tokenizer.encode(f'今日は最悪の一日だ。財布を{tokenizer.mask_token}した。', return_tensors='pt')
回答
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 紛失 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 用意 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 破壊 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 発見 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 回収 し た 。 [SEP]
⇒⇒ 100点かな。。。
問題2
問題文
(今日は最高の一日だ。財布を XXX した。)
input_ids = tokenizer.encode(f'今日は最高の一日だ。財布を{tokenizer.mask_token}した。', return_tensors='pt')
回答
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を プレゼント し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 購入 し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 用意 し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 交換 し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 準備 し た 。 [SEP]
⇒⇒100点かな。。。
「なくした財布を」ならば、「発見」したとかだろうけど、、、、この文なら、
「プレゼント」は、面白いと思う。
コード
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'今日は最悪の一日だ。財布を{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))
上記は、
https://www.koi.mashykom.com/bert.html
などを参考にさせて頂きました。
(他のサイトもいろいろ、参考にしています。)
余談
以下の記事で、ネガティブに(笑)に、引用されていた。でも、内容は面白い。
https://ai-de-seikei.hatenablog.com/entry/2022/01/10/111614
まとめ
それなりな感じ。。。