Skip to content

Latest commit

 

History

History
 
 

bert

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

BERT model correct error character with mask feature

Requirements

  • pip安装依赖包
pip install tokenizers==0.9.4 torch>=1.3.1 tqdm==4.50.2

使用说明

  1. 下载用中文文本fine-tuned3轮后的预训练BERT MLM模型(百度网盘链接: https://pan.baidu.com/s/14E7jtEgEtxWnwcggRBWeiw 提取码: dd9e;飞书链接: https://l6pmn3b1eo.feishu.cn/file/boxcnevzS1RYa1J7gLXz0Jtjwyf?from=from_qr_code 密码: KljQ), 解压后放置于~/.pycorrector/dataset/bert_models/目录下。
bert_models
└── chinese_finetuned_lm
    ├── config.json
    ├── pytorch_model.bin
    └── vocab.txt
  1. 运行bert_corrector.py进行纠错。
python3 bert_corrector.py
  1. 评估
  • run python tests/bert_corrector_test.py
  • result result

纠错结果还算可圈可点,速度有点慢,可以用albert-tiny之类的参数小些的模型加速预测。

Evaluate

提供评估脚本pycorrector/utils/eval.py,该脚本有两个功能:

  • 构建评估样本集:评估集pycorrector/data/eval_corpus.json, 包括字粒度错误100条、词粒度错误100条、语法错误100条,正确句子200条。用户可以修改条数生成其他评估样本分布。
  • 计算纠错准召率:采用保守计算方式,简单把纠错之后与正确句子完成匹配的视为正确,否则为错。

执行该评估脚本后,

Bert模型纠错效果评估如下:

  • 准确率:58.60%
  • 召回率:35.00%

规则方法(加入自定义混淆集)的纠错效果评估如下:

  • 准确率:320/500=64%
  • 召回率:152/300=50.67%

可以看出Bert模型对文本有强大的表达能力,仅仅依赖预训练的MLM模型,在纠错能力上就比优化良久的专家规则方法稍差而已,而且看结果细节一些纠正还挺靠谱。

看来选择一个好的模型,选择一个正确的方向真的很重要。我在这里只能希望规则的方法尽量做到扩展性好些,深度模型尽量做到调研各种模型全一些,深入一些。

快速加载

本项目迁移了Huggingface-Transformers 4.2.0dev0pycorrector/transformers,更新了兼容代码,可支持BERT模型,可通过如下命令调用。

example: predict_mask.py

from pycorrector.transformers import pipeline
pwd_path = os.path.abspath(os.path.dirname(__file__))

model_dir = os.path.join(pwd_path, "../data/bert_models/chinese_finetuned_lm/")
nlp = pipeline('fill-mask', model=model_dir)

i = nlp('今天[MASK]情很好')
print(i)

Fine-tuned BERT model with chinese corpus

chinese corpus

fine-tune

使用transformers(旧称pytorch-pretrained-BERT)的examples/language-modeling/run_language_modeling.py处理。

  • fine-tune模型
export CUDA_VISIBLE_DEVICES=0,1,2
export TRAIN_FILE=people2014_cged_wiki.txt
export TEST_FILE=people2014_cged_wiki.txt


python run_language_modeling.py \
    --output_dir=chinese_finetuned_lm \
    --model_type=bert \
    --model_name_or_path=bert-base-chinese \
    --do_train \
    --train_data_file=$TRAIN_FILE \
    --do_eval \
    --eval_data_file=$TEST_FILE \
    --mlm
  • 结果

该脚本自动从S3下载bert-base-chinese模型,然后fine-tune训练,完后的模型放置于data/bert_models目录下:

bert_models
└── chinese_finetuned_lm
    ├── config.json
    ├── pytorch_model.bin
    └── vocab.txt

使用以上方法fine-tune3轮后的中文bert模型,下载见使用说明的网盘链接。

附录

  • 训练时长:3块p40GPU训练3轮,超过24小时。
  • GPU机器配置:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.39       Driver Version: 418.39       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P40           On   | 00000000:00:0A.0 Off |                    0 |
| N/A   82C    P0   172W / 250W |  22747MiB / 22919MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P40           On   | 00000000:00:0B.0 Off |                    0 |
| N/A   25C    P8     9W / 250W |     10MiB / 22919MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla P40           On   | 00000000:00:0C.0 Off |                    0 |
| N/A   26C    P8    10W / 250W |     10MiB / 22919MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

  • chinese corpus数据示例

要求:人名日报数据以标题分段,即每个标题之前添加空行。(vim参考操作为 :%s/原标题/\r原标题

数据截图: corpus