🚀 CNMBert
CNMBert 是一个用于翻译拼音缩写的模型,它基于 Chinese-BERT-wwm 训练而来,通过修改预训练任务适配拼音缩写翻译,在该任务上相较于微调过的 GPT 模型以及 GPT-4o 达到了 SOTA 水平。
🚀 快速开始
安装依赖
from transformers import AutoTokenizer, BertConfig
from CustomBertModel import predict
from MoELayer import BertWwmMoE
加载模型
tokenizer = AutoTokenizer.from_pretrained("Midsummra/CNMBert-MoE")
config = BertConfig.from_pretrained('Midsummra/CNMBert-MoE')
model = BertWwmMoE.from_pretrained('Midsummra/CNMBert-MoE', config=config).to('cuda')
预测词语
print(predict("我有两千kq", "kq", model, tokenizer)[:5])
print(predict("快去给魔理沙看b吧", "b", model, tokenizer[:5]))
输出示例
['块钱', 1.2056937473156175], ['块前', 0.05837443749364857], ['开千', 0.0483869208528063], ['可千', 0.03996622172280445], ['口气', 0.037183335575008414]
['病', 1.6893256306648254], ['吧', 0.1642467901110649], ['呗', 0.026976384222507477], ['包', 0.021441461518406868], ['报', 0.01396679226309061]
✨ 主要特性
- 适配拼音缩写翻译:通过修改预训练任务,使模型能够有效处理拼音缩写到汉字的转换。
- 多模型可选:提供 CNMBert-Default 和 CNMBert-MoE 两种模型,满足不同需求。
- 多种预测模式:支持束搜索和回溯的无剪枝暴力搜索,可根据需求选择。
📦 安装指南
文档未提及具体安装步骤,可参考相关依赖库的安装方法进行安装。
💻 使用示例
基础用法
from transformers import AutoTokenizer, BertConfig
from CustomBertModel import predict
from MoELayer import BertWwmMoE
tokenizer = AutoTokenizer.from_pretrained("Midsummra/CNMBert-MoE")
config = BertConfig.from_pretrained('Midsummra/CNMBert-MoE')
model = BertWwmMoE.from_pretrained('Midsummra/CNMBert-MoE', config=config).to('cuda')
print(predict("我有两千kq", "kq", model, tokenizer)[:5])
高级用法
def backtrack_predict(sentence: str,
predict_word: str,
model,
tokenizer,
top_k=10,
fast_mode=True,
strict_mode=True):
print(backtrack_predict("我有两千kq", "kq", model, tokenizer)[:5])
📚 详细文档
什么是拼音缩写
形如 "bhys" -> "不好意思","ys" -> "原神" 这样,使用拼音首字母来代替汉字的缩写,我们称之为拼音缩写。更多关于拼音缩写的讨论可参考 大家为什么会讨厌缩写? - 远方青木的回答 - 知乎。
CNMBert 模型对比
模型 |
模型权重 |
Memory Usage (FP16) |
模型大小 |
QPS |
MRR |
Acc |
CNMBert-Default |
Huggingface |
0.4GB |
131M |
12.56 |
59.70 |
49.74 |
CNMBert-MoE |
Huggingface |
0.8GB |
329M |
3.20 |
61.53 |
51.86 |
说明:
- 所有模型均在相同的 200 万条 wiki 以及知乎语料下训练。
- QPS 为 queries per second(由于没有使用 c 重写 predict 所以现在性能很糟...)。
- MRR 为平均倒数排名(mean reciprocal rank)。
- Acc 为准确率(accuracy)。
预测函数说明
def predict(sentence: str,
predict_word: str,
model,
tokenizer,
top_k=8,
beam_size=16,
threshold=0.005,
fast_mode=True,
strict_mode=True):
def backtrack_predict(sentence: str,
predict_word: str,
model,
tokenizer,
top_k=10,
fast_mode=True,
strict_mode=True):
注意事项
⚠️ 重要提示
由于 BERT 的自编码特性,导致其在预测 MASK 时,顺序不同会导致预测结果不同,如果启用 fast_mode
,则会正向和反向分别对输入进行预测,可以提升一点准确率(2% 左右),但是会带来更大的性能开销。strict_mode
会对输入进行检查,以判断其是否为一个真实存在的汉语词汇。
如何微调模型
请参考 TrainExample.ipynb,在数据集的格式上,只要保证 csv 的第一列为要训练的语料即可。
Q&A
Q:感觉这个东西准确度有点低啊。
A:可以尝试设置 fast_mode
和 strict_mode
为 False
。 模型是在很小的数据集(200w)上进行的预训练,所以泛化能力不足很正常,可以在更大数据集或者更加细分的领域进行微调,具体微调方式和 Chinese-BERT-wwm 差别不大,只需要将 DataCollactor
替换为 CustomBertModel.py
中的 DataCollatorForMultiMask
。
🔧 技术细节
文档未提供详细技术细节。
📄 许可证
本项目采用 AGPL-3.0 许可证。
引用
如果您对 CNMBert 的具体实现感兴趣的话,可以参考
@misc{feng2024cnmbertmodelhanyupinyin,
title={CNMBert: A Model For Hanyu Pinyin Abbreviation to Character Conversion Task},
author={Zishuo Feng and Feng Cao},
year={2024},
eprint={2411.11770},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2411.11770},
}