🚀 MorphBERT-Large:俄语语素分割
本仓库包含 CrabInHoney/morphbert-large-morpheme-segmentation-ru
模型,这是一个基于大型 Transformer 的系统,针对俄语单词的语素分割进行了微调。该模型将给定单词的每个字符分类为 25 种语素类别之一:['END', 'END1', 'HYPH', 'HYPH1', 'LINK', 'LINK1', 'LINK2', 'LINK3', 'POSTFIX', 'PREF', 'PREF1', 'PREF2', 'ROOT', 'ROOT1', 'ROOT2', 'ROOT3', 'ROOT4', 'ROOT5', 'SUFF', 'SUFF1', 'SUFF2', 'SUFF3', 'SUFF4', 'SUFF5', 'SUFF6']
✨ 主要特性
- 任务:语素分割(字符级别的标记分类)
- 语言:俄语(ru)
- 架构:Transformer(类似 BERT base)
- 标签:['END', 'END1', 'HYPH', 'HYPH1', 'LINK', 'LINK1', 'LINK2', 'LINK3', 'POSTFIX', 'PREF', 'PREF1', 'PREF2', 'ROOT', 'ROOT1', 'ROOT2', 'ROOT3', 'ROOT4', 'ROOT5', 'SUFF', 'SUFF1', 'SUFF2', 'SUFF3', 'SUFF4', 'SUFF5', 'SUFF6']
- 模型大小与规格:
- 参数数量:约 8550 万个
- 张量类型:F32
- 磁盘占用:约 342 MB
📚 详细文档
模型描述
morphbert-large-morpheme-segmentation-ru
使用了强大的 Transformer 架构,旨在更准确地预测字符级别的形态分析。由于其规模较大,与小版本(CrabInHoney/morphbert-tiny-morpheme-segmentation-ru)相比,该模型在确定俄语单词的组成语素方面表现出更高的准确性。
该模型是从头开始训练得到的,其架构复杂度与 bert-base 相当。
性能
该模型在评估数据集上实现了约 0.99 的字符级准确率。
局限性
- 对于未登录词、新词或训练数据中未充分体现的高度复杂形态结构,模型性能可能会有所不同。
- 该模型严格在字符级别上运行,不考虑更广泛的词汇或句法上下文。
- 语素边界的模糊情况可能会根据训练期间学到的模式进行解析,在边缘情况下可能并不总是符合语言习惯。
💻 使用示例
基础用法
该模型可以轻松地与 Hugging Face 的 transformers
库一起使用。它逐字符处理单词。
from transformers import AutoTokenizer, AutoModelForTokenClassification
import torch
model_name = "CrabInHoney/morphbert-large-morpheme-segmentation-ru"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)
model.eval()
def analyze(word):
tokens = list(word)
encoded = tokenizer(tokens, is_split_into_words=True, return_tensors="pt", truncation=True, max_length=34)
with torch.no_grad():
logits = model(**encoded).logits
predictions = logits.argmax(dim=-1)[0]
word_ids = encoded.word_ids()
output = []
current_label = None
current_chunk = []
for i, word_idx in enumerate(word_ids):
if word_idx is not None and word_idx < len(tokens):
label_id = predictions[i].item()
label = model.config.id2label[label_id]
token = tokens[word_idx]
if label == current_label:
current_chunk.append(token)
else:
if current_chunk:
chunk_str = "".join(current_chunk)
output.append(f"{chunk_str}:{current_label}")
current_chunk = [token]
current_label = label
if current_chunk:
chunk_str = "".join(current_chunk)
output.append(f"{chunk_str}:{current_label}")
return " / ".join(output)
for word in ["масляный", "предчувствий", "тарковский", "кот", "подгон", "сине-белый", "шторы", "абажур", "дедлайн", "веб-сайт", "адаптированная", "формообразующий"]:
print(f"{word} → {analyze(word)}")
示例预测
масляный → масл:ROOT / ян:SUFF / ый:END
предчувствий → пред:PREF / чу:ROOT / в:SUFF / ств:SUFF1 / ий:END
тарковский → тарк:ROOT / ов:SUFF / ск:SUFF1 / ий:END
кот → кот:ROOT
подгон → под:PREF / гон:ROOT
сине-белый → син:ROOT / е:LINK / -:HYPH / бел:ROOT1 / ый:END
шторы → штор:ROOT / ы:END
абажур → абажур:ROOT
дедлайн → дедлайн:ROOT
веб-сайт → веб:ROOT / -:HYPH / сайт:ROOT1
адаптированная → адапт:ROOT / ир:SUFF / ова:SUFF1 / нн:SUFF2 / ая:END
формообразующий → форм:ROOT / о:LINK / образу:ROOT1 / ющ:SUFF / ий:END
📄 许可证
本项目采用 Apache-2.0 许可证。