# MacBertMaskedLM For Correction
本项目是 MacBERT 改变网络结构的中文文本纠错模型,可支持 BERT 类模型为 backbone。
> "MacBERT shares the same pre-training tasks as BERT with several modifications." —— (Cui et al., Findings of the EMNLP 2020)
MacBert4csc 模型网络结构:
+ 本项目是 MacBERT 改变网络结构的中文文本纠错模型,可支持 BERT 类模型为 backbone。
+ 在通常 BERT 模型上进行了魔改,追加了一个全连接层作为错误检测即 [detection](https://github.com/shibing624/pycorrector/blob/c0f31222b7849c452cc1ec207c71e9954bd6ca08/pycorrector/macbert/macbert4csc.py#L18),
与 SoftMaskedBERT 模型不同点在于,本项目中的 MacBERT 中,只是利用 detection 层和 correction 层的 loss 加权得到最终的 loss。不像 SoftmaskedBERT 中需要利用 detection 层的置信概率来作为 correction 的输入权重。
![macbert_network](https://github.com/shibing624/pycorrector/blob/master/docs/git_image/macbert_network.jpg)
#### MacBERT 简介
MacBERT 全称为 MLM as correction BERT,其中 MLM 指的是 masked language model。
MacBERT 的模型网络结构上可以选择任意 BERT 类模型,其主要特征在于预训练时不同的 MLM task 设计:
+ 使用全词屏蔽 (wwm, whole-word masking) 以及 N-gram 屏蔽策略来选择 candidate tokens 进行屏蔽;
+ BERT 类模型通常使用 `[MASK]` 来屏蔽原词,而 MacBERT 使用第三方的同义词工具来为目标词生成近义词用于屏蔽原词,特别地,当原词没有近义词时,使用随机 n-gram 来屏蔽原词;
+ 和 BERT 类模型相似地,对于每个训练样本,输入中 80% 的词被替换成近义词(原为`[MASK]`)、10%的词替换为随机词,10%的词不变。
MLM as Correction Mask strategies:
![macbert_strategies](https://github.com/shibing624/pycorrector/blob/master/docs/git_image/macbert_mask_strategies.jpg)
## 使用说明
### 快速加载
#### pycorrector调用
example: [correct_demo.py](correct_demo.py)
```python
from pycorrector.macbert.macbert_corrector import MacBertCorrector
nlp = MacBertCorrector("shibing624/macbert4csc-base-chinese").macbert_correct
i = nlp('今天新情很好')
print(i)
```
#### transformers调用
当然,你也可使用官方的transformers库进行调用。
1.先pip安装transformers库:
```shell
pip install transformers>=4.1.1
```
2.使用以下示例执行:
```python
import operator
import torch
from transformers import BertTokenizerFast, BertForMaskedLM
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = BertTokenizerFast.from_pretrained("shibing624/macbert4csc-base-chinese")
model = BertForMaskedLM.from_pretrained("shibing624/macbert4csc-base-chinese")
model.to(device)
texts = ["今天新情很好", "你找到你最喜欢的工作,我也很高心。"]
with torch.no_grad():
outputs = model(**tokenizer(texts, padding=True, return_tensors='pt').to(device))
def get_errors(corrected_text, origin_text):
sub_details = []
for i, ori_char in enumerate(origin_text):
if ori_char in [' ', '“', '”', '‘', '’', '琊', '\n', '…', '—', '擤']:
# add unk word
corrected_text = corrected_text[:i] + ori_char + corrected_text[i:]
continue
if i >= len(corrected_text):
continue
if ori_char != corrected_text[i]:
if ori_char.lower() == corrected_text[i]:
# pass english upper char
corrected_text = corrected_text[:i] + ori_char + corrected_text[i + 1:]
continue
sub_details.append((ori_char, corrected_text[i], i, i + 1))
sub_details = sorted(sub_details, key=operator.itemgetter(2))
return corrected_text, sub_details
result = []
for ids, text in zip(outputs.logits, texts):
_text = tokenizer.decode(torch.argmax(ids, dim=-1), skip_special_tokens=True).replace(' ', '')
corrected_text = _text[:len(text)]
corrected_text, details = get_errors(corrected_text, text)
print(text, ' => ', corrected_text, details)
result.append((corrected_text, details))
print(result)
```
output:
```shell
今天新情很好 => 今天心情很好 [('新', '心', 2, 3)]
你找到你最喜欢的工作,我也很高心。 => 你找到你最喜欢的工作,我也很高兴。 [('心', '兴', 15, 16)]
```
模型文件组成:
```
macbert4csc-base-chinese
├── config.json
├── added_tokens.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tokenizer_config.json
└── vocab.txt
```
## Evaluate
提供评估脚本[pycorrector/utils/eval.py](../utils/eval.py),该脚本有两个功能:
- 构建评估样本集:评估集[pycorrector/data/eval_corpus.json](../data/eval_corpus.json),
包括字粒度错误100条、词粒度错误100条、语法错误100条,正确句子200条。用户可以修改条数生成其他评估样本分布。
- 计算纠错准召率:采用保守计算方式,简单把纠错之后与正确句子完成匹配的视为正确,否则为错。
执行该评估脚本后,
`shibing624/macbert4csc-base-chinese` 模型在 corpus500 纠错效果评估如下:
- Sentence Level: acc:0.6560, precision:0.7797, recall:0.5919, f1:0.6730
规则方法(加入自定义混淆集)在corpus500纠错效果评估如下:
- Sentence Level: acc:0.6400, recall:0.5067
`shibing624/macbert4csc-base-chinese` 在 SIGHAN2015 测试集纠错效果评估如下:
- Char Level: precision:0.9372, recall:0.8640, f1:0.8991
- Sentence Level: precision:0.8264, recall:0.7366, f1:0.7789
由于训练使用的数据使用了 SIGHAN2015 的训练集(复现paper),在 SIGHAN2015 的测试集上达到SOTA水平。
#### 评估case
- run `python tests/macbert_corrector_test.py`
![result](../../docs/git_image/macbert_result.jpg)
在 SIGHAN2015 的测试集上达到了SOTA水平。
## 训练
### 安装依赖
```shell
pip install transformers>=4.1.1 pytorch-lightning==1.4.9 torch>=1.7.0 yacs
```
### 训练数据集
#### toy数据集(约1千条)
```shell
cd macbert
python preprocess.py
```
得到toy数据集文件:
```shell
macbert/output
|-- dev.json
|-- test.json
`-- train.json
```
#### SIGHAN+Wang271K中文纠错数据集
| 数据集 | 语料 | 下载链接 | 压缩包大小 |
| :------- | :--------- | :---------: | :---------: |
| **`SIGHAN+Wang271K中文纠错数据集`** | SIGHAN+Wang271K(27万条) | [百度网盘(密码01b9)](https://pan.baidu.com/s/1BV5tr9eONZCI0wERFvr0gQ)| 106M |
| **`原始SIGHAN数据集`** | SIGHAN13 14 15 | [官方csc.html](http://nlp.ee.ncu.edu.tw/resource/csc.html)| 339K |
| **`原始Wang271K数据集`** | Wang271K | [Automatic-Corpus-Generation dimmywang提供](https://github.com/wdimmy/Automatic-Corpus-Generation/blob/master/corpus/train.sgml)| 93M |
SIGHAN+Wang271K中文纠错数据集,数据格式:
```json
[
{
"id": "B2-4029-3",
"original_text": "晚间会听到嗓音,白天的时候大家都不会太在意,但是在睡觉的时候这嗓音成为大家的恶梦。",
"wrong_ids": [
5,
31
],
"correct_text": "晚间会听到噪音,白天的时候大家都不会太在意,但是在睡觉的时候这噪音成为大家的恶梦。"
}
]
```
下载`SIGHAN+Wang271K中文纠错数据集`,下载后新建output文件夹并放里面,文件位置同上。
#### 自有数据集
把自己数据集标注好,保存为跟训练样本集一样的json格式,然后加载模型继续训练即可。
1. 已有大量业务相关错误样本,主要标注错误位置(wrong_ids)和纠错后的句子(correct_text)
2. 没有现成�
没有合适的资源?快使用搜索试试~ 我知道了~
课程(大三下学期).zip
共753个文件
xml:177个
flat:146个
json:137个
需积分: 0 0 下载量 178 浏览量
2024-05-14
21:44:04
上传
评论
收藏 154.41MB ZIP 举报
温馨提示
课程(大三下学期).zip
资源推荐
资源详情
资源评论
收起资源包目录
课程(大三下学期).zip (753个子文件)
events.out.tfevents.1680088070.LAPTOP-TIQ05PA7.14148.0 526B
events.out.tfevents.1680252114.LAPTOP-TIQ05PA7.16316.0 218B
events.out.tfevents.1680319743.LAPTOP-TIQ05PA7.17964.0 136B
3lsb1VK+jAV1AjsLojK8h6vtmdg= 62KB
3lsb1VK+jAV1AjsLojK8h6vtmdg= 62KB
6Pg9mtRH83y3xBEeD1XxSqSLnes= 31KB
6Pg9mtRH83y3xBEeD1XxSqSLnes= 31KB
7wYD7am14c2kDC5K6Q2QUYxKlzQ= 8KB
7wYD7am14c2kDC5K6Q2QUYxKlzQ= 8KB
AeJAQ2R7W3h7hoBSHPAOzbvZiC4= 10KB
AeJAQ2R7W3h7hoBSHPAOzbvZiC4= 10KB
androidResources 25KB
resources-debug.ap_ 868KB
app-debug.apk 2.03MB
gradlew.bat 2KB
executionHistory.bin 569KB
fileHashes.bin 68KB
classAnalysis.bin 67KB
jarAnalysis.bin 64KB
taskHistory.bin 26KB
outputFiles.bin 20KB
resourceHashesCache.bin 18KB
last-build.bin 1B
BaseAdapterActivity.class 6KB
MyAdapter3.class 3KB
DatabaseTools.class 3KB
NewsDetailActivity.class 2KB
BaseAdapterActivity$1.class 2KB
Login$1.class 2KB
Register$1.class 2KB
Login.class 2KB
Register.class 2KB
MyDatabaseHelper.class 1KB
ItemBean.class 1KB
BaseAdapterActivity$2.class 1KB
NewsDetailActivity$1.class 1KB
User.class 1KB
Login$2.class 1002B
User$1.class 993B
BuildConfig.class 689B
MyAdapter3$ViewHolder.class 682B
绘制Bezier曲线.cpp 5KB
TestGL.cpp 4KB
形式二.cpp 3KB
B样条.cpp 2KB
双三次bezier曲面片.cpp 2KB
绘制Nurbs曲线.cpp 2KB
形式一.cpp 1KB
透视投影.cpp 1KB
投影.cpp 750B
classes.dex 2.58MB
classes.dex 2.39MB
BaseAdapterActivity.dex 5KB
MyAdapter3.dex 3KB
BaseAdapterActivity$1.dex 2KB
DatabaseTools.dex 2KB
Login$1.dex 2KB
NewsDetailActivity.dex 2KB
Register$1.dex 2KB
Login.dex 2KB
Register.dex 1KB
ItemBean.dex 1KB
NewsDetailActivity$1.dex 1KB
MyDatabaseHelper.dex 1KB
BaseAdapterActivity$2.dex 1KB
Login$2.dex 1KB
User$1.dex 1KB
User.dex 1KB
MyAdapter3$ViewHolder.dex 1KB
BuildConfig.dex 976B
实验报告三.doc 15.73MB
20190590208苏宗泓+实验一 黑盒测试.doc 2.64MB
20200310113吴铿+实验二 白盒测试.doc 1.92MB
20200310124林锐蓝-实验二-白盒测试.doc 1.13MB
20200310124林锐蓝-实验三-综合测试.doc 1.12MB
实验三.doc 1.01MB
实验一.doc 935KB
20200310124林锐蓝-实验一-黑盒测试.doc 917KB
20200310113吴铿+实验一 黑盒测试.doc 724KB
实验二.doc 531KB
20200310125欧阳佳鹏+实验二 白盒测试(2).doc 505KB
作业4.doc 354KB
实验报告一.doc 308KB
20200310125欧阳佳鹏+实验一 黑盒测试(1).doc 289KB
作业3.doc 214KB
作业6.doc 206KB
作业2.doc 55KB
作业5.doc 33KB
作业7.doc 19KB
软件测试实验报告模板.doc 15KB
作业1.doc 14KB
计算机图形学复习.docx 1.57MB
20190310112何政宇软件测试技术实验三.docx 869KB
20200310113吴铿+实验三 综合测试.docx 783KB
20200310124-林锐蓝-软件工程第十一章作业.docx 762KB
20200310124林锐蓝-软件工程第六章.docx 605KB
20190310112何政宇软件测试技术实验二.docx 593KB
20200310124-林锐蓝-软件工程综合报告.docx 576KB
20200310123林康+实验二 白盒测试.docx 520KB
20200310124-林锐蓝-软件工程第四章作业.docx 458KB
共 753 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
2301_82112072
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 宜搭低代码开发时(高级)题库
- 51单片机设计-交通灯与串口模拟.zip,可作参考
- OPENCV学习总结,包含图像处理常用的数据类型和库函数
- [MacOS (AppleSilicon)] Proxyman-5.2.0
- 20240414-开源证券-开源证券量化评论-形态识别,均线的收敛与发散.txt
- 2023-04-06-项目笔记 - 第一百六十一阶段 - 4.4.2.159全局变量的作用域-159 -2024.06.11
- 数字图像处理-基于Qt 5.8.0.zip
- 2023-04-06-项目笔记 - 第一百六十一阶段 - 4.4.2.159全局变量的作用域-159 -2024.06.11
- 集群机器人Matlab仿真.zip
- 第十届蓝桥杯大赛选手资源数据包(电子类)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功