🚀 用于插入越南语重音符号的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自动提供)查看分配给每个单词的标签(索引)。