🚀 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 許可證。