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

yasuokaの日記: Transformersにおける日本語トークナイザBertJapaneseTokenizerFastの改良

日記 by yasuoka

昨日の日記でデッチ上げたBertJapaneseTokenizerFastだが、テキストペアのlistを受け取れるようにすると同時に、[UNK]の処理を多少改善してみた。Google Colaboratoryで動かしてみよう。

!pip install transformers pytokenizations fugashi unidic_lite
from transformers import BertJapaneseTokenizer
class BertJapaneseTokenizerFast(BertJapaneseTokenizer):
  def __call__(self,text,text_pair=None,return_offsets_mapping=False,**kwargs):
    v=super().__call__(text=text,text_pair=text_pair,return_offsets_mapping=False,**kwargs)
    if return_offsets_mapping:
      import tokenizations
      if type(text)==str:
        z=zip([v["input_ids"]],[text],[text_pair] if text_pair else [""])
      else:
        z=zip(v["input_ids"],text,text_pair if text_pair else [""]*len(text))
      w=[]
      for a,b,c in z:
        a2b,b2a=tokenizations.get_alignments(self.convert_ids_to_tokens(a),b+c)
        x=[]
        for i,t in enumerate(a2b):
          if t==[]:
            s=(0,0)
            if a[i]==self.unk_token_id:
              j=[[-1]]+[t for t in a2b[0:i] if t>[]]
              k=[t for t in a2b[i+1:] if t>[]]+[[len(b+c)]]
              s=(j[-1][-1]+1,k[0][0])
          elif t[-1]<len(b):
            s=(t[0],t[-1]+1)
          else:
            s=(t[0]-len(b),t[-1]-len(b)+1)
          x.append(s)
        w.append(list(x))
      v["offset_mapping"]=w[0] if type(text)==str else w
    return v

tokenizer=BertJapaneseTokenizerFast.from_pretrained("cl-tohoku/bert-base-japanese-v2")
d=tokenizer("𠮟られても平気なの☺",return_offsets_mapping=True)
print([tokenizer.convert_ids_to_tokens(t) for t in d["input_ids"]],d,sep="\n")

cl-tohoku/bert-base-japanese-v2のトークナイザを拡張して、「𠮟られても平気なの☺」をトークナイズしてみたところ、私(安岡孝一)の手元では以下の結果になった。

['[CLS]', '[UNK]', 'られ', 'て', 'も', '平', '##気', 'な', 'の', '[UNK]', '[SEP]']
{'input_ids': [2, 1, 11158, 888, 916, 2180, 7193, 892, 896, 1, 3], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'offset_mapping': [(0, 0), (0, 1), (1, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (0, 0)]}

文頭の[UNK]や文末の[UNK]に対しても、offset_mappingがちゃんと出ていて、非常にうれしい。ただ、これ、pytokenizationsっていう追加モジュールを必要とするので、ちょっとpull requestを出すのは憚られる。さて、どうしたものかな。

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

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

読み込み中...