パスワードを忘れた? アカウント作成
15292403 journal
人工知能

yasuokaの日記: SikuBERTは「孟子[MASK]梁惠王」の[MASK]に何を埋めてくるのか

日記 by yasuoka

Transformersのモデルページに、古典中国語モデルSikuBERTが収録されているのを見つけた。王东波・刘畅・朱子赫・胡昊天・沈思・李斌の『面向数字人文的《四库全书》预训练模型构建及应用研究』(第五届全国未来智慧图书馆发展论坛、2021年5月)によれば、四庫全書536097588字をもとにしたBERTモデルらしい。さっそく動かしてみようとしたのだが、モデルにバグがあって、うまく動かない。仕方ないので、Google Colaboratoryでバグを避けて動かしてみることにした。

!test -f SIKU-BERT/sikubert/config.json || ( mkdir -p SIKU-BERT/sikubert && cd SIKU-BERT/sikubert && for F in vocab.txt pytorch_model.bin bert_config.json ; do curl -LO https://huggingface.co/SIKU-BERT/sikubert/resolve/main/$F ; done ; cp bert_config.json config.json )
!pip install transformers
import torch
from transformers import AutoTokenizer,AutoModelForMaskedLM
tokenizer=AutoTokenizer.from_pretrained("SIKU-BERT/sikubert")
model=AutoModelForMaskedLM.from_pretrained("SIKU-BERT/sikubert")
tokens=tokenizer.tokenize("孟子[MASK]梁惠王")
print(tokens)
mask=tokens.index("[MASK]")
ids=torch.tensor([tokenizer.convert_tokens_to_ids(tokens)])
with torch.no_grad():
  outputs=model(ids)
  pred=outputs[0][0,mask].topk(5)
for i,t in enumerate(tokenizer.convert_ids_to_tokens(pred.indices)):
  tokens[mask]=t
  print(i+1,tokens)

最初の長い行はバグ除けで、本来は不要だったりする。「孟子[MASK]梁惠王」という例文に対し、私(安岡孝一)の手元では、以下の結果が得られた。

['孟', '子', '[MASK]', '梁', '惠', '王']
1 ['孟', '子', '[UNK]', '梁', '惠', '王']
2 ['孟', '子', '上', '梁', '惠', '王']
3 ['孟', '子', '交', '梁', '惠', '王']
4 ['孟', '子', '書', '梁', '惠', '王']
5 ['孟', '子', '間', '梁', '惠', '王']

バグを避け切れていないのか、かなり結果が変だ。GuwenBERT-baseや私のroberta-classical-chinese-base-charと較べてみても、うまく穴埋めできていない。どうなってるんだろうと思いつつ、SikuBERTのvocab.txtを眺めてみたところ、例の「しにはとんとんワークケートを」が紛れ込んでいる。どうして、古典中国語モデルのvocab.txtに、ワークゲートの求人情報が入ってるんだろ。それとも、バグが直ったら、このあたりも直るのかしら。

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...