🚀 ベトナム語のアクセント記号を挿入するためのTransformerモデル
このモデルは、アクセント記号(変音符)がない(または一部の単語にのみアクセントがある)ベトナム語のテキストにアクセント記号を挿入するために使用されます。例えば、入力が “Nhin nhung mua thu di” の場合、目標とする出力は “Nhìn những mùa thu đi” です。
🚀 クイックスタート
このモデルは、ベトナム語のアクセント記号を挿入する問題をトークン分類問題としてモデル化し、各入力トークンに “ラベル” を割り当てて、それをアクセント付きのトークンに変換します。
✨ 主な機能
- 高精度:HMMバージョン(91%)と比較して、このモデルの精度は97%と高くなっています。
- Transformerアーキテクチャに基づく:XLM - Roberta Largeから微調整されており、より強力な言語理解能力を備えています。
📦 インストール
このモデルを使用する前に、transformers、torch、numpy パッケージをインストールしてください。
💻 使用例
基本的な使用法
このモデルを使用する詳細な手順とコード例を以下に示します。
手順1:モデルの読み込み
from transformers import AutoTokenizer, AutoModelForTokenClassification
import torch
import numpy as np
def load_trained_transformer_model():
model_path = "peterhung/vietnamese-accent-marker-xlm-roberta"
tokenizer = AutoTokenizer.from_pretrained(model_path, add_prefix_space=True)
model = AutoModelForTokenClassification.from_pretrained(model_path)
return model, tokenizer
model, tokenizer = load_trained_transformer_model()
手順2:入力テキストをモデルに入力する
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model.to(device)
model.eval()
def insert_accents(text, model, tokenizer):
our_tokens = text.strip().split()
inputs = tokenizer(our_tokens,
is_split_into_words=True,
truncation=True,
padding=True,
return_tensors="pt"
)
input_ids = inputs['input_ids']
tokens = tokenizer.convert_ids_to_tokens(input_ids[0])
tokens = tokens[1:-1]
with torch.no_grad():
inputs.to(device)
outputs = model(**inputs)
predictions = outputs["logits"].cpu().numpy()
predictions = np.argmax(predictions, axis=2)
predictions = predictions[0][1:-1]
assert len(tokens) == len(predictions)
return tokens, predictions
text = "Nhin nhung mua thu di, em nghe sau len trong nang."
tokens, predictions = insert_accents(text, model, tokenizer)
手順3:アクセント付きの単語を取得する
def _load_tags_set(fpath):
labels = []
with open(fpath, 'r') as f:
for line in f:
line = line.strip()
if line:
labels.append(line)
return labels
label_list = _load_tags_set("./selected_tags_names.txt")
assert len(label_list) == 528, f"Expect {len(label_list)} tags"
print(tokens)
print(list(f"{pred} ({label_list[pred]})" for pred in predictions))
['▁Nhi', 'n', '▁nhu', 'ng', '▁mua', '▁thu', '▁di', ',', '▁em', '▁nghe', '▁sau', '▁len', '▁trong', '▁nang', '.']
['217 (i-ì)', '217 (i-ì)', '388 (u-ữ)', '388 (u-ữ)', '407 (ua-ùa)', '378 (u-u)', '120 (di-đi)', '0 (-)', '185 (e-e)', '185 (e-e)', '41 (au-âu)', '188 (e-ê)', '302 (o-o)', '14 (a-ắ)', '0 (-)']
TOKENIZER_WORD_PREFIX = "▁"
def merge_tokens_and_preds(tokens, predictions):
merged_tokens_preds = []
i = 0
while i < len(tokens):
tok = tokens[i]
label_indexes = set([predictions[i]])
if tok.startswith(TOKENIZER_WORD_PREFIX):
tok_no_prefix = tok[len(TOKENIZER_WORD_PREFIX):]
cur_word_toks = [tok_no_prefix]
j = i + 1
while j < len(tokens):
if not tokens[j].startswith(TOKENIZER_WORD_PREFIX):
cur_word_toks.append(tokens[j])
label_indexes.add(predictions[j])
j += 1
else:
break
cur_word = ''.join(cur_word_toks)
merged_tokens_preds.append((cur_word, label_indexes))
i = j
else:
merged_tokens_preds.append((tok, label_indexes))
i += 1
return merged_tokens_preds
merged_tokens_preds = merge_tokens_and_preds(tokens, predictions)
print(merged_tokens_preds)
[('Nhin', {217}), ('nhung', {388}), ('mua', {407}), ('thu', {378}), ('di,', {120, 0}), ('em', {185}), ('nghe', {185}), ('sau', {41}), ('len', {188}), ('trong', {302}), ('nang.', {0, 14})]
def get_accented_words(merged_tokens_preds, label_list):
accented_words = []
for word_raw, label_indexes in merged_tokens_preds:
for label_index in label_indexes:
tag_name = label_list[int(label_index)]
raw, vowel = tag_name.split("-")
if raw and raw in word_raw:
word_accented = word_raw.replace(raw, vowel)
break
else:
word_accented = word_raw
accented_words.append(word_accented)
return accented_words
accented_words = get_accented_words(merged_tokens_preds, label_list)
print(accented_words)
['Nhìn', 'những', 'mùa', 'thu', 'đi,', 'em', 'nghe', 'sâu', 'lên', 'trong', 'nắng.']
高度な使用法
高度な使用法の例は現在ありません。
📚 ドキュメント
このモデルはXLM - Roberta Largeから微調整されています。トレーニングプロセスの詳細については、このブログ記事を参照してください。
🔧 技術詳細
この問題はトークン分類問題としてモデル化されており、各入力トークンに対して、それをアクセント付きのトークンに変換する “ラベル” を割り当てることが目標です。
📄 ライセンス
このモデルはApache - 2.0ライセンスを使用しています。
⚠️ 重要な注意事項
- このモデルは最大512トークンを受け入れます。これは、基礎となる事前学習済みのXLM - Robertaモデルから引き継いだ制限です。
- HMMバージョン(91%)と比較して、このモデルの精度は高く(97%)、ただし実行時間が長くなる可能性があります。詳細についてはこちらを参照してください。
💡 使用上のヒント
このページの右側にある推論API(HFによって自動提供されます)を使用して、各単語に割り当てられたラベル(インデックス)を確認することができます。