File size: 5,000 Bytes
672b6b3
22d1540
47194d0
 
 
 
 
08c162e
 
22d1540
0e12842
672b6b3
08c162e
727ab8a
 
08c162e
5658207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1d33663
 
 
 
5658207
1d33663
5658207
 
 
 
 
 
 
 
 
1d33663
5658207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1d33663
 
5658207
 
 
 
 
 
1d33663
5658207
1d33663
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5658207
1d33663
5658207
1d33663
5658207
1d33663
5658207
1d33663
5658207
1d33663
5658207
1d33663
5658207
1d33663
5658207
 
 
 
 
 
 
 
 
 
 
 
 
1d33663
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
---
license: agpl-3.0
language:
- zh
base_model:
- hfl/chinese-bert-wwm-ext
pipeline_tag: fill-mask
tags:
- bert
- Chinese
library_name: transformers
---

CNMBert
[Github](https://github.com/IgarashiAkatuki/zh-CN-Multi-Mask-Bert)

# zh-CN-Multi-Mask-Bert (CNMBert)
![image](https://github.com/user-attachments/assets/a888fde7-6766-43f1-a753-810399418bda)

---

一个用来翻译拼音缩写的模型

此模型基于[Chinese-BERT-wwm](https://github.com/ymcui/Chinese-BERT-wwm)训练而来,通过修改其预训练任务来使其适配拼音缩写翻译任务,相较于微调过的GPT模型以及GPT-4o达到了sota

---

## 什么是拼音缩写

形如:

> "bhys" -> "不好意思"
>
> "ys" -> "原神"

这样的,使用拼音首字母来代替汉字的缩写,我们姑且称之为拼音缩写。

如果对拼音缩写感兴趣可以看看这个↓

[大家为什么会讨厌缩写? - 远方青木的回答 - 知乎](https://www.zhihu.com/question/269016377/answer/2654824753)

### CNMBert

| Model           | 模型权重                                                    | Memory Usage (FP16) | Model Size | QPS   | MRR   | Acc   |
| --------------- | ----------------------------------------------------------- | ------------------- | ---------- | ----- | ----- | ----- |
| CNMBert-Default | [Huggingface](https://huggingface.co/Midsummra/CNMBert)     | 0.4GB               | 131M       | 12.56 | 59.70 | 49.74 |
| CNMBert-MoE     | [Huggingface](https://huggingface.co/Midsummra/CNMBert-MoE) | 0.8GB               | 329M       | 3.20  | 61.53 | 51.86 |

* 所有模型均在相同的200万条wiki以及知乎语料下训练
* QPS 为 queries per second (由于没有使用c重写predict所以现在性能很糟...)
* MRR 为平均倒数排名(mean reciprocal rank)
* Acc 为准确率(accuracy)

### Usage

```python
from transformers import AutoTokenizer, BertConfig

from CustomBertModel import predict
from MoELayer import BertWwmMoE
```

加载模型

```python
# use CNMBert with MoE
# To use CNMBert without MoE, replace all "Midsummra/CNMBert-MoE" with "Midsummra/CNMBert" and use BertForMaskedLM instead of using 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')

# model = BertForMaskedLM.from_pretrained('Midsummra/CNMBert').to('cuda')
```

预测词语

```python
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]

---

```python
# 默认的predict函数使用束搜索
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](https://github.com/IgarashiAkatuki/CNMBert/blob/main/TrainExample.ipynb),在数据集的格式上,只要保证csv的第一列为要训练的语料即可。

### Q&A

Q: 感觉这个东西准确度有点低啊

A: 可以尝试设置`fast_mode``strict_mode``False`。 模型是在很小的数据集(200w)上进行的预训练,所以泛化能力不足很正常,,,可以在更大数据集或者更加细分的领域进行微调,具体微调方式和[Chinese-BERT-wwm](https://github.com/ymcui/Chinese-BERT-wwm)差别不大,只需要将`DataCollactor`替换为`CustomBertModel.py`中的`DataCollatorForMultiMask`### 引用
如果您对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}, 
}
```