0
0

sangjeedondrub/tibetan-roberta-baseは「ད་རིང་ཨ་མ་ཤི་བ།」をどうトークナイズするのか

Posted at

邓宇扬, 吴丹『面向藏族传统节日的汉藏双语命名实体识别研究』(数据分析与知识发现, Vol.7, No.7 (2023年7月), pp.125-135)を読んでいたところ、sangjeedondrub/tibetan-roberta-baseというチベット語モデルが使用されていた。とりあえず、昨日の記事の例文「ད་རིང་ཨ་མ་ཤི་བ།」をトークナイズしてみよう。

>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("sangjeedondrub/tibetan-roberta-base")
>>> print(tkz.convert_ids_to_tokens(tkz("ད་རིང་ཨ་མ་ཤི་བ།")["input_ids"]))
['<s>', 'à½ij', 'à¼ĭ', 'ར', 'ི', 'à½Ħ', 'à¼ĭ', 'ཨ', 'à¼ĭ', 'à½ĺ', 'à¼ĭ', 'ཤ', 'ིà¼ĭ', 'à½ĸ', 'à¼į', '</s>']

う、全てのトークンで1文字目が「à」ということは

>>> text="ད་རིང་ཨ་མ་ཤི་བ།"
>>> x=tkz(text,return_offsets_mapping=True)
>>> for i,(s,e) in zip(x["input_ids"],x["offset_mapping"]):
...   print(" ",text[s:e],text[s:e].encode("utf-8"),ascii(tkz.convert_ids_to_tokens(i)))
...
   b'' '<s>'
  ད b'\xe0\xbd\x91' '\xe0\xbd\u0133'
  ་ b'\xe0\xbc\x8b' '\xe0\xbc\u012d'
  ར b'\xe0\xbd\xa2' '\xe0\xbd\xa2'
  ི b'\xe0\xbd\xb2' '\xe0\xbd\xb2'
  ང b'\xe0\xbd\x84' '\xe0\xbd\u0126'
  ་ b'\xe0\xbc\x8b' '\xe0\xbc\u012d'
  ཨ b'\xe0\xbd\xa8' '\xe0\xbd\xa8'
  ་ b'\xe0\xbc\x8b' '\xe0\xbc\u012d'
  མ b'\xe0\xbd\x98' '\xe0\xbd\u013a'
  ་ b'\xe0\xbc\x8b' '\xe0\xbc\u012d'
  ཤ b'\xe0\xbd\xa4' '\xe0\xbd\xa4'
  ི་ b'\xe0\xbd\xb2\xe0\xbc\x8b' '\xe0\xbd\xb2\xe0\xbc\u012d'
  བ b'\xe0\xbd\x96' '\xe0\xbd\u0138'
  ། b'\xe0\xbc\x8d' '\xe0\xbc\u012f'
   b'' '</s>'

ううう、UTF-8のByte-Pair Encodingがナマで使われてる(ただし0x00~0x20・0x7f~0x9fはU+0100~U+0120・U+0121~U+0141へマッピング)上に、母音記号とかが変な形で泣き別れになってる。decodeは実装されてるかしら。

>>> print([tkz.decode(t) for t in x["input_ids"]])
['<s>', 'ད', '་', 'ར', 'ི', 'ང', '་', 'ཨ', '་', 'མ', '་', 'ཤ', 'ི་', 'བ', '།', '</s>']

一応は動くけど、それでも「ཤི་བ」が「ཤ」「 ི་」「བ」の3トークンに泣き別れになってて、しかも真ん中のトークンがすごく気持ち悪い。こういうの、どうにもならないのかなあ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0