邓宇扬, 吴丹『面向藏族传统节日的汉藏双语命名实体识别研究』(数据分析与知识发现, 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トークンに泣き別れになってて、しかも真ん中のトークンがすごく気持ち悪い。こういうの、どうにもならないのかなあ。