Giter Club home page Giter Club logo

pycorrector's Introduction

🇨🇳中文 | 🌐English | 📖文档/Docs | 🤖模型/Models


pycorrector: useful python text correction toolkit

PyPI version Downloads GitHub contributors License Apache 2.0 python_vesion GitHub issues Wechat Group

pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正,python3.8开发。

pycorrector实现了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型的文本纠错,并在SigHAN数据集评估各模型的效果。

Guide

Introduction

中文文本纠错任务,常见错误类型:

当然,针对不同业务场景,这些问题并不一定全部存在,比如拼音输入法、语音识别校对关注音似错误;五笔输入法、OCR校对关注形似错误, 搜索引擎query纠错关注所有错误类型。

本项目重点解决其中的"音似、形字、语法、专名错误"等类型。

News

[2023/11/07] v1.0.0版本:新增了ChatGLM3/LLaMA2等GPT模型用于中文文本纠错,发布了基于ChatGLM3-6B的shibing624/chatglm3-6b-csc-chinese-lora拼写和语法纠错模型;重写了DeepContext、ConvSeq2Seq、T5等模型的实现。详见Release-v1.0.0

Features

  • Kenlm模型:本项目基于Kenlm统计语言模型工具训练了中文NGram语言模型,结合规则方法、混淆集可以纠正中文拼写错误,方法速度快,扩展性强,效果一般
  • DeepContext模型:本项目基于PyTorch实现了用于文本纠错的DeepContext模型,该模型结构参考Stanford University的NLC模型,2014英文纠错比赛得第一名,效果一般
  • Seq2Seq模型:本项目基于PyTorch实现了用于中文文本纠错的ConvSeq2Seq模型,该模型在NLPCC-2018的中文语法纠错比赛中,使用单模型并取得第三名,可以并行训练,模型收敛快,效果一般
  • T5模型:本项目基于PyTorch实现了用于中文文本纠错的T5模型,使用Langboat/mengzi-t5-base的预训练模型finetune中文纠错数据集,模型改造的潜力较大,效果好
  • ERNIE_CSC模型:本项目基于PaddlePaddle实现了用于中文文本纠错的ERNIE_CSC模型,模型在ERNIE-1.0上finetune,模型结构适配了中文拼写纠错任务,效果好
  • MacBERT模型【推荐】:本项目基于PyTorch实现了用于中文文本纠错的MacBERT4CSC模型,模型加入了错误检测和纠正网络,适配中文拼写纠错任务,效果好
  • GPT模型:本项目基于PyTorch实现了用于中文文本纠错的ChatGLM/LLaMA模型,模型在中文CSC和语法纠错数据集上finetune,适配中文文本纠错任务,效果好

Demo

run example: examples/macbert/gradio_demo.py to see the demo:

python examples/macbert/gradio_demo.py

Evaluation

提供评估脚本examples/evaluate_models/evaluate_models.py

  • 使用sighan15评估集:SIGHAN2015的测试集pycorrector/data/sighan2015_test.tsv ,已经转为简体中文
  • 评估标准:纠错准召率,采用严格句子粒度(Sentence Level)计算方式,把模型纠正之后的与正确句子完成相同的视为正确,否则为错

评估结果

评估数据集:SIGHAN2015测试集

GPU:Tesla V100,显存 32 GB

Model Name Model Link Base Model GPU Precision Recall F1 QPS
Kenlm-CSC shibing624/chinese-kenlm-klm kenlm CPU 0.6860 0.1529 0.2500 9
BART-CSC shibing624/bart4csc-base-chinese fnlp/bart-base-chinese GPU 0.6984 0.6354 0.6654 58
Mengzi-T5-CSC shibing624/mengzi-t5-base-chinese-correction mengzi-t5-base GPU 0.8321 0.6390 0.7229 214
MacBERT-CSC shibing624/macbert4csc-base-chinese hfl/chinese-macbert-base GPU 0.8254 0.7311 0.7754 224
ChatGLM3-6B-CSC shibing624/chatglm3-6b-csc-chinese-lora THUDM/chatglm3-6b GPU 0.5574 0.4917 0.5225 4

结论

Install

pip install -U pycorrector

or

pip install -r requirements.txt

git clone https://github.com/shibing624/pycorrector.git
cd pycorrector
pip install --no-deps .

通过以上两种方法的任何一种完成安装都可以。如果不想安装依赖包,可以拉docker环境。

  • docker使用
docker run -it -v ~/.pycorrector:/root/.pycorrector shibing624/pycorrector:0.0.2

Usage

本项目的初衷之一是比对、调研各种中文文本纠错方法,抛砖引玉。

项目实现了kenlm、macbert、seq2seq、 ernie_csc、T5、deepcontext、LLaMA等模型应用于文本纠错任务,各模型均可基于已经训练好的纠错模型快速预测,也可使用自有数据训练、预测。

kenlm模型(统计模型)

中文拼写纠错

example: examples/kenlm/demo.py

from pycorrector import Corrector
m = Corrector()
print(m.correct_batch(['少先队员因该为老人让坐', '你找到你最喜欢的工作,我也很高心。']))

output:

[{'source': '少先队员因该为老人让坐', 'target': '少先队员应该为老人让座', 'errors': [('因该', '应该', 4), ('', '', 10)]}
{'source': '你找到你最喜欢的工作,我也很高心。', 'target': '你找到你最喜欢的工作,我也很高兴。', 'errors': [('', '', 15)]}]
  • Corrector()类是kenlm统计模型的纠错方法实现,默认会从路径~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm加载kenlm语言模型文件,如果检测没有该文件, 则程序会自动联网下载。当然也可以手动下载模型文件(2.8G)并放置于该位置
  • 返回值: correct方法返回dict,{'source': '原句子', 'target': '纠正后的句子', 'errors': [('错误词', '正确词', '错误位置'), ...]},correct_batch方法返回包含多个dictlist

错误检测

example: examples/kenlm/detect_demo.py

from pycorrector import Corrector
m = Corrector()
idx_errors = m.detect('少先队员因该为老人让坐')
print(idx_errors)

output:

[['因该', 4, 6, 'word'], ['坐', 10, 11, 'char']]
  • 返回值:list, [error_word, begin_pos, end_pos, error_type]pos索引位置以0开始。

成语、专名纠错

example: examples/kenlm/use_custom_proper.py

from pycorrector import Corrector
m = Corrector(proper_name_path='./my_custom_proper.txt')
x = ['报应接中迩来', '这块名表带带相传',]
for i in x:
    print(i, ' -> ', m.correct(i))

output:

报应接中迩来  ->  {'source': '报应接踵而来', 'target': '报应接踵而来', 'errors': [('接中迩来', '接踵而来', 2)]}
这块名表带带相传  ->  {'source': '这块名表代代相传', 'target': '这块名表代代相传', 'errors': [('带带相传', '代代相传', 4)]}

自定义混淆集

通过加载自定义混淆集,支持用户纠正已知的错误,包括两方面功能:1)【提升准确率】误杀加白;2)【提升召回率】补充召回。

example: examples/kenlm/use_custom_confusion.py

from pycorrector import Corrector

error_sentences = [
    '买iphonex,要多少钱',
    '共同实际控制人萧华、霍荣铨、张旗康',
]
m = Corrector()
print(m.correct_batch(error_sentences))
print('*' * 42)
m = Corrector(custom_confusion_path_or_dict='./my_custom_confusion.txt')
print(m.correct_batch(error_sentences))

output:

('买iphonex,要多少钱', [])   # "iphonex"漏召,应该是"iphoneX"
('共同实际控制人萧华、霍荣铨、张启康', [('张旗康', '张启康', 14)]) # "张启康"误杀,应该不用纠
*****************************************************
('买iphonex,要多少钱', [('iphonex', 'iphoneX', 1)])
('共同实际控制人萧华、霍荣铨、张旗康', [])
  • 其中./my_custom_confusion.txt的内容格式如下,以空格间隔:
iPhone差 iPhoneX
张旗康 张旗康

自定义混淆集ConfusionCorrector类,除了上面演示的和Corrector类一起使用,还可以和MacBertCorrector一起使用,也可以独立使用。示例代码 examples/macbert/model_correction_pipeline_demo.py

自定义语言模型

默认提供下载并使用的kenlm语言模型zh_giga.no_cna_cmn.prune01244.klm文件是2.8G,内存小的电脑使用pycorrector程序可能会吃力些。

支持用户加载自己训练的kenlm语言模型,或使用2014版人民日报数据训练的模型,模型小(140M),准确率稍低,模型下载地址:shibing624/chinese-kenlm-klm | people2014corpus_chars.klm(密码o5e9)

example:examples/kenlm/load_custom_language_model.py

from pycorrector import Corrector
model = Corrector(language_model_path='people2014corpus_chars.klm')
print(model.correct('少先队员因该为老人让坐'))

英文拼写纠错

支持英文单词级别的拼写错误纠正。

example:examples/kenlm/en_correct_demo.py

from pycorrector import EnSpellCorrector
m = EnSpellCorrector()
sent = "what happending? how to speling it, can you gorrect it?"
print(m.correct(sent))

output:

{'source': 'what happending? how to speling it, can you gorrect it?', 'target': 'what happening? how to spelling it, can you correct it?', 'errors': [('happending', 'happening', 5), ('speling', 'spelling', 24), ('gorrect', 'correct', 44)]}

中文简繁互换

支持中文繁体到简体的转换,和简体到繁体的转换。

example:examples/kenlm/traditional_simplified_chinese_demo.py

import pycorrector

traditional_sentence = '憂郁的臺灣烏龜'
simplified_sentence = pycorrector.traditional2simplified(traditional_sentence)
print(traditional_sentence, '=>', simplified_sentence)

simplified_sentence = '忧郁的**乌龟'
traditional_sentence = pycorrector.simplified2traditional(simplified_sentence)
print(simplified_sentence, '=>', traditional_sentence)

output:

憂郁的臺灣烏龜 => 忧郁的**乌龟
忧郁的**乌龟 => 憂郁的臺灣烏龜

命令行模式

支持kenlm方法的批量文本纠错

python -m pycorrector -h
usage: __main__.py [-h] -o OUTPUT [-n] [-d] input

@description:

positional arguments:
  input                 the input file path, file encode need utf-8.

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        the output file path.
  -n, --no_char         disable char detect mode.
  -d, --detail          print detail info

case:

python -m pycorrector input.txt -o out.txt -n -d
  • 输入文件:input.txt;输出文件:out.txt ;关闭字粒度纠错;打印详细纠错信息;纠错结果以\t间隔

MacBert4CSC模型

基于MacBERT改变网络结构的中文拼写纠错模型,模型已经开源在HuggingFace Models:https://huggingface.co/shibing624/macbert4csc-base-chinese

模型网络结构:

  • 本项目是 MacBERT 改变网络结构的中文文本纠错模型,可支持 BERT 类模型为 backbone
  • 在原生 BERT 模型上进行了魔改,追加了一个全连接层作为错误检测即 detection , MacBERT4CSC 训练时用 detection 层和 correction 层的 loss 加权得到最终的 loss,预测时用 BERT MLM 的 correction 权重即可

macbert_network

详细教程参考examples/macbert/README.md

pycorrector快速预测

example:examples/macbert/demo.py

from pycorrector import MacBertCorrector
m = MacBertCorrector("shibing624/macbert4csc-base-chinese")
print(m.correct_batch(['今天新情很好', '你找到你最喜欢的工作,我也很高心。']))

output:

{'source': '今天新情很好', 'target': '今天心情很好', 'errors': [('', '', 2)]}
{'source': '你找到你最喜欢的工作,我也很高心。', 'target': '你找到你最喜欢的工作,我也很高兴。', 'errors': [('', '', 15)]}

transformers快速预测

examples/macbert/README.md

T5模型

基于T5的中文拼写纠错模型,模型训练详细教程参考examples/t5/README.md

pycorrector快速预测

example:examples/t5/demo.py

from pycorrector import T5Corrector
m = T5Corrector()
print(m.correct_batch(['今天新情很好', '你找到你最喜欢的工作,我也很高心。']))

output:

[{'source': '今天新情很好', 'target': '今天心情很好', 'errors': [('新', '心', 2)]},
{'source': '你找到你最喜欢的工作,我也很高心。', 'target': '你找到你最喜欢的工作,我也很高兴。', 'errors': [('心', '兴', 15)]}]

GPT模型

基于ChatGLM3、LLaMA、Baichuan、QWen等模型微调训练纠错模型,训练方法见examples/gpt/README.md

在ChatGLM3-6B上SFT微调的纠错模型,已经release到HuggingFace Models: https://huggingface.co/shibing624/chatglm3-6b-csc-chinese-lora

pycorrector快速预测

example: examples/gpt/demo.py

from pycorrector import GptCorrector
m = GptCorrector()
print(m.correct_batch(['今天新情很好', '你找到你最喜欢的工作,我也很高心。']))

output:

[{'source': '今天新情很好', 'target': '今天心情很好', 'errors': [('', '', 2)]},
{'source': '你找到你最喜欢的工作,我也很高心。', 'target': '你找到你最喜欢的工作,我也很高兴。', 'errors': [('', '', 15)]}]

ErnieCSC模型

基于ERNIE的中文拼写纠错模型,模型已经开源在PaddleNLP。 模型网络结构:

详细教程参考examples/ernie_csc/README.md

pycorrector快速预测

example:examples/ernie_csc/demo.py

from pycorrector import ErnieCscCorrector

if __name__ == '__main__':
    error_sentences = [
        '真麻烦你了。希望你们好好的跳无',
        '少先队员因该为老人让坐',
    ]
    m = ErnieCscCorrector()
    batch_res = m.correct_batch(error_sentences)
    for i in batch_res:
        print(i)
        print()

output:

{'source': '真麻烦你了。希望你们好好的跳无', 'target': '真麻烦你了。希望你们好好的跳舞', 'errors': [{'position': 14, 'correction': {'无': '舞'}}]}
{'source': '少先队员因该为老人让坐', 'target': '少先队员应该为老人让座', 'errors': [{'position': 4, 'correction': {'因': '应'}}, {'position': 10, 'correction': {'坐': '座'}}]}

Bart模型

基于SIGHAN+Wang271K中文纠错数据集训练的Bart4CSC模型,已经release到HuggingFace Models: https://huggingface.co/shibing624/bart4csc-base-chinese

from transformers import BertTokenizerFast
from textgen import BartSeq2SeqModel

tokenizer = BertTokenizerFast.from_pretrained('shibing624/bart4csc-base-chinese')
model = BartSeq2SeqModel(
    encoder_type='bart',
    encoder_decoder_type='bart',
    encoder_decoder_name='shibing624/bart4csc-base-chinese',
    tokenizer=tokenizer,
    args={"max_length": 128, "eval_batch_size": 128})
sentences = ["少先队员因该为老人让坐"]
print(model.predict(sentences))

output:

['少先队员应该为老人让座']

如果需要训练Bart模型,请参考 https://github.com/shibing624/textgen/blob/main/examples/seq2seq/training_bartseq2seq_zh_demo.py

Dataset

数据集 语料 下载链接 压缩包大小
SIGHAN+Wang271K中文纠错数据集 SIGHAN+Wang271K(27万条) 百度网盘(密码01b9)
shibing624/CSC
106M
原始SIGHAN数据集 SIGHAN13 14 15 官方csc.html 339K
原始Wang271K数据集 Wang271K Automatic-Corpus-Generation dimmywang提供 93M
人民日报2014版语料 人民日报2014版 飞书(密码cHcu) 383M
NLPCC 2018 GEC官方数据集 NLPCC2018-GEC 官方trainingdata 114M
NLPCC 2018+HSK熟语料 nlpcc2018+hsk+CGED 百度网盘(密码m6fg)
飞书(密码gl9y)
215M
NLPCC 2018+HSK原始语料 HSK+Lang8 百度网盘(密码n31j)
飞书(密码Q9LH)
81M
中文纠错比赛数据汇总 Chinese Text Correction(CTC) 中文纠错汇总数据集(天池) -
NLPCC 2023中文语法纠错数据集 NLPCC 2023 Sharedtask1 Task 1: Chinese Grammatical Error Correction(Training Set) 125M

说明:

  • SIGHAN+Wang271K中文纠错数据集(27万条),是通过原始SIGHAN13、14、15年数据集和Wang271K数据集格式转化后得到,json格式,带错误字符位置信息,SIGHAN为test.json, macbert4csc模型训练可以直接用该数据集复现paper准召结果,详见pycorrector/macbert/README.md
  • NLPCC 2018 GEC官方数据集NLPCC2018-GEC, 训练集trainingdata[解压后114.5MB],该数据格式是原始文本,未做切词处理。
  • 汉语水平考试(HSK)和lang8原始平行语料[HSK+Lang8]百度网盘(密码n31j),该数据集已经切词,可用作数据扩增。
  • NLPCC 2018 + HSK + CGED16、17、18的数据,经过以字切分,繁体转简体,打乱数据顺序的预处理后,生成用于纠错的熟语料(nlpcc2018+hsk) ,百度网盘(密码:m6fg) [130万对句子,215MB]

SIGHAN+Wang271K中文纠错数据集,数据格式:

[
    {
        "id": "B2-4029-3",
        "original_text": "晚间会听到嗓音,白天的时候大家都不会太在意,但是在睡觉的时候这嗓音成为大家的恶梦。",
        "wrong_ids": [
            5,
            31
        ],
        "correct_text": "晚间会听到噪音,白天的时候大家都不会太在意,但是在睡觉的时候这噪音成为大家的恶梦。"
    }
]

字段解释:

  • id:唯一标识符,无意义
  • original_text: 原始错误文本
  • wrong_ids: 错误字的位置,从0开始
  • correct_text: 纠正后的文本

自有数据集

可以使用自己数据集训练纠错模型,把自己数据集标注好,保存为跟训练样本集一样的json格式,然后加载数据训练模型即可。

  1. 已有大量业务相关错误样本,主要标注错误位置(wrong_ids)和纠错后的句子(correct_text)
  2. 没有现成的错误样本,可以写脚本生成错误样本(original_text),根据音似、形似等特征把正确句子的指定位置(wrong_ids)字符改为错字,附上 第三方同音字生成脚本同音词替换

Language Model

什么是语言模型?-wiki

语言模型对于纠错步骤至关重要,当前默认使用的是从千兆中文文本训练的中文语言模型zh_giga.no_cna_cmn.prune01244.klm(2.8G), 提供人民日报2014版语料训练得到的轻量版语言模型people2014corpus_chars.klm(密码o5e9)

大家可以用中文维基(繁体转简体,pycorrector.utils.text_utils下有此功能)等语料数据训练通用的语言模型,或者也可以用专业领域语料训练更专用的语言模型。更适用的语言模型,对于纠错效果会有比较好的提升。

  1. kenlm语言模型训练工具的使用,请见博客:http://blog.csdn.net/mingzai624/article/details/79560063
  2. 附上训练语料<人民日报2014版熟语料>,包括: 1)标准人工切词及词性数据people2014.tar.gz, 2)未切词文本数据people2014_words.txt, 3)kenlm训练字粒度语言模型文件及其二进制文件people2014corpus_chars.arps/klm, 4)kenlm词粒度语言模型文件及其二进制文件people2014corpus_words.arps/klm。

尊重版权,传播请注明出处。

Contact

  • Github Issue(建议):GitHub issues
  • Github discussions:欢迎到讨论区GitHub discussions灌水(不会打扰开发者),公开交流纠错技术和问题
  • 邮件我:xuming: [email protected]
  • 微信我:加我微信号:xuming624, 进Python-NLP交流群,备注:姓名-公司名-NLP

Citation

如果你在研究中使用了pycorrector,请按如下格式引用:

APA:

Xu, M. Pycorrector: Text error correction tool (Version 0.4.2) [Computer software]. https://github.com/shibing624/pycorrector

BibTeX:

@misc{Xu_Pycorrector_Text_error,
  title={Pycorrector: Text error correction tool},
  author={Ming Xu},
  year={2023},
  howpublished={\url{https://github.com/shibing624/pycorrector}},
}

License

pycorrector 的授权协议为 Apache License 2.0,可免费用做商业用途。请在产品说明中附加pycorrector的链接和授权协议。

Contribute

项目代码还很粗糙,如果大家对代码有所改进,欢迎提交回本项目,在提交之前,注意以下两点:

  • tests添加相应的单元测试
  • 使用python -m pytest来运行所有单元测试,确保所有单测都是通过的

之后即可提交PR。

References

pycorrector's People

Contributors

cabbagenoob avatar cclauss avatar codemayq avatar ghosthbl avatar gitabtion avatar james0128 avatar joe0120 avatar joey12300 avatar knightlancelot avatar liwenju0 avatar luozhouyang avatar majokiki avatar okcd00 avatar shibing624 avatar sullen777 avatar trellixvulnteam avatar treya-lin avatar vela-zz avatar xu-song avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pycorrector's Issues

How can i use the other listed model to correct sentence?

There are six models in your package, what is the default one in your sample code, and how can i choose others model to use? In my opinion, the sample code is not enough in readme.

Your sample code is

import pycorrector

corrected_sent, detail = pycorrector.correct('少先队员因该为老人让坐')
print(corrected_sent, detail)

改进建议

对于提高纠错效果,在下有些拙见。近音错误往往是由于我们使用输入法的时候不小心选错了序号造成的,而实际正确的词就在旁边。但是这种错误可能比较难通过博主的拼音纠错模块进行纠错,因为拼写的时候我们往往喜欢简拼,而相同简拼的词太多了,而且输入法还附带有词语联想功能,以至于有可能那些在拼音上完全不相关的词语也弄了进去,纠错根本找不出来。所以能不能有某种方式,当我们在拼写的时候,我们能获取到输入框里的候选词,用所有的候选词去跑一遍,感觉这样效率更高,而且效果应该更好。而且这个能在打字的时候实时纠错,实用性更强,用户体验更好

detector.py中的问题

楼主,您好,仔细研读了您detector.py中的代码,有一些可能比较简单的问题,请您有空的时候,回复一下,非常感谢。
(1)detector.py中的load_word_freq()函数为什么最后return只要频数,不要词性?
(2)detector.py中的_get_custom_confusion_dict()函数为什么return的confusion以变体作为字典的key,而不是本体?另外本体最后被加入到word_freq中,那意思是本体也过滤不检查了?
(3)detector.py中为什么set_language_model_path(),set_custom_confusion_dict(),ngram_score()等多个函数的第一句话是self.check_detector_initialized(),作用是什么?
(4)detector.py中的set_language_model_path()中的kenlm.Model(path)是在训练模型吗?
(5)detector.py中set_custom_confusion_dict()为什么有uodate()字典的逻辑?
(6)ngram_score()是用语言模型直接调用出来的分数?
(7)set_word_frequcy()为什么要更新在样本中的词频?
(8)_check_contain_error()和_add_maybe_error_item()逻辑不理解?
(9)_get_maybe_error_index()函数具体逻辑?
(10)detect()函数中是怎么体现用户混淆词优先级最高的?

请教您 rnn_crf rnn_lm seq2seq这三个文件夹

在程序运行时,这三个文件夹下的文件是不是独立的 并没有调用
因为 我在pip install pycorrector后查看源文件 并没有发现在这三个 文件
还是说我 安装的有问题?

蟹蟹。

用的哪个版本python啊?

安装报错,用得哪个版本python
from urllib.request import (urlopen, urlretrieve, Request, url2pathname,
ImportError: cannot import name 'HTTPSHandler' from 'urllib.request' (/usr/local/python3.7/lib/python3.7/urllib/request.py)

单字误杀case

楼主,您好!我运行您的代码,遇到如下两个badcase:
(1)为了解决召回率太高,召回本不应该召回的问题,可以把正确的不想召回的词语加入到word_freq字典,这样做确实有一部分效果,但是对于单个字的,不起作用,比如:【湿度怎样呢?水分多吗 ('湿度怎样呢?水分多么', [['吗', '么', 9, 10]])】这个例子,我把“吗”加入word_freq字典,还是没有输出我想要的结果,请楼主帮忙调试代码?
(2)在word_freq中多加入几个新词,就报下面的错
2018-10-16 18:51:08,632 - /Users/wangyingshuai/pycorrector-master/pycorrector/detector.py - DEBUG - Loaded language model: /Users/wangyingshuai/pycorrector-master/pycorrector/data/kenlm/people_chars_lm.klm, spend: 0.008133888244628906 s
Traceback (most recent call last):
File "/Users/wangyingshuai/pycorrector-master/examples/use_custom_confusion.py", line 35, in
pycorrector.set_custom_confusion_dict(path='./my_confusion.txt')
File "/Users/wangyingshuai/pycorrector-master/pycorrector/detector.py", line 85, in set_custom_confusion_dict
self.check_detector_initialized()
File "/Users/wangyingshuai/pycorrector-master/pycorrector/detector.py", line 46, in check_detector_initialized
self.initialize_detector()
File "/Users/wangyingshuai/pycorrector-master/pycorrector/detector.py", line 36, in initialize_detector
self.word_freq = self.load_word_freq_dict(self.word_freq_path)
File "/Users/wangyingshuai/pycorrector-master/pycorrector/detector.py", line 57, in load_word_freq_dict
word = info[0]
IndexError: list index out of range

求问seq2seq_attention训练显示acc问题

求问,想在seq2seq_att训练过程中显示acc,于是在seq2seq_attn_model.py中修改了
model.compile(optimizer=Adam(1e-3), metrics=['accuracy'])
但是训练工程中仍未显示acc,val_acc。

2019-01-11 09:42:54.750493: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Epoch 1/40 137/137 [==============================] - 135s 987ms/step - loss: 0.1134 - val_loss: 0.3633 Epoch 2/40 137/137 [==============================] - 132s 966ms/step - loss: 0.1064 - val_loss: 0.5050 Epoch 3/40 137/137 [==============================] - 132s 963ms/step - loss: 0.1033 - val_loss: 0.5974 Epoch 4/40 137/137 [==============================] - 131s 959ms/step - loss: 0.1013 - val_loss: 0.4981

求助怎么办……非常感谢!

confusion set建议 & n-gram模型疑问

您好!有幸拜读您的代码,发现同音字set中的语料都是繁体字,也许转成简体更好。另外我使用了sighan给出的同形字库进行扩充,效果有所提升。

想请教您一点:在使用kenlm训练是给入的是分好词的语料,是不是意味着kenlm认为一个词是一个gram,2-gram是两个词(based on words),而不是两个字(based on character)呢?如果是的话,会不会与detector中以字为单位(based on words)有所矛盾呢?

感谢您🙏

小白,请教下word和char训练结果的问题

您好,我跑了您的代码,发现基于人民日报语料的模型,char训练的效果比word的好,甚至对于例子“少先队员应该为老人让座”,word给出的结果是 “先对员因该为老人让坐 [[('队', '对', 2, 3)]] ” ,按照我的理解,语料中如果出现了词组,准确率不是应该更高吗?为什么反而低了呢?

误杀case:这纸=>这只

楼主,您好!今天新遇到一个badcase是:
第一次运行结果如下:
【这纸厚度如何?质量怎么样 ('这只厚度如何?质量怎么样', [['这纸', '这只', 1, 2]])】
然后我把“这纸”加入到word_freq字典中
第二次运行结果如下:
【这纸厚度如何?质量怎么样 ('这只厚度如何?质量怎么样', [['纸', '只', 1, 2]])】
然后我把“纸”加入到word_freq字典中
第三次运行结果如下:
这纸厚度如何?质量怎么样 ('这只厚度如何?质量怎么样', [['纸', '只', 1, 2]])

综上所述,这个badcase看来是通过加入word_freq解决不了的,请问楼主,有没有解决这个badcase的好方法?

seq2seq_attention出处问题

Hello, Thanks for your repo, it is very helpful for new beginner in CRC like me !
I am reading the code of "seq2seq_attention" part these days, I wonder if you can provide the paper or blog about the reference of your seq2seq_attention code? cause I find some difference in those blogs or paper I read. Thank you~

老哥你这个错误检测detector部分y_score的计算方式是不是有点复杂啊,ratio * margin_median/np.median(margin_median)不就相当于ratio乘以n吗

def _get_maybe_error_index(scores, ratio=0.6745, threshold=1.4):
    """
    取疑似错字的位置,通过平均绝对离差(MAD)
    :param scores: np.array
    :param threshold: 阈值越小,得到疑似错别字越多
    :return:
    """
    scores = np.array(scores)
    if len(scores.shape) == 1:
        scores = scores[:, None]
    median = np.median(scores, axis=0)  # get median of all scores
    margin_median = np.sqrt(np.sum((scores - median) ** 2, axis=-1))  # deviation from the median
    # 平均绝对离差值
    med_abs_deviation = np.median(margin_median)
    if med_abs_deviation == 0:
        return []
    y_score = ratio * margin_median / med_abs_deviation
    # 打平
    scores = scores.flatten()
    maybe_error_indices = np.where((y_score > threshold) & (scores < median))
    # 取全部疑似错误字的index
    return list(maybe_error_indices[0])

代码框架

请问楼主,pycorrector文件夹里面有很多模型,但是相互之间的关系我没有很明白,主函数是哪个啊,以及能否讲一下整个代码的框架啊

安装失败

执行:python3 setup.py install
running install
Checking .pth file support in /usr/local/lib/python3.5/dist-packages/
/usr/bin/python3 -E -c pass
TEST PASSED: /usr/local/lib/python3.5/dist-packages/ appears to support .pth files
running bdist_egg
running egg_info
writing pycorrector.egg-info/PKG-INFO
writing top-level names to pycorrector.egg-info/top_level.txt
writing dependency_links to pycorrector.egg-info/dependency_links.txt
writing requirements to pycorrector.egg-info/requires.txt
reading manifest file 'pycorrector.egg-info/SOURCES.txt'
writing manifest file 'pycorrector.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
报错: error: can't copy 'pycorrector/utils/pycache': doesn't exist or not a regular file

setup.py 中
package_data={'pycorrector': ['.py','pycache/','utils/','utils/pycache/','zhtools/', 'LICENSE', 'README.','data/.txt', 'data/.pkl','data/kenlm/', 'data/test/*'],},

请问是什么原因?

误杀case列举

楼主,您好!用您最新的模型跑了一些测试数据,部分badcase列举如下:
(1)这个跟 原木纯品 那个啥区别?不是原木纸浆做的? | 这个跟 原木唇品 那个啥区别?不是原木纸浆做的?' | [" [['纯品'", " '唇品'", ' 6', ' 8]]']
(2)能充几次呢? | '能重几次呢?' | [" [['能充'", " '能重'", ' 0', ' 2]]']
(3)这是酸奶还是像饮料一样的奶? | '这时酸奶还是像饮料一样的奶?' | [" [['这是'", " '这时'", ' 0', ' 2]]']
(4)现在银色的K2P是MTK还是博通啊? | '现在银色的K2P是MTK还是拨通啊?' | [" [['博通'", " '拨通'", ' 14', ' 16]]']
(5)是浓稠的还是稀薄的? | '是浓周的还是稀薄的?' | [" [['浓稠'", " '浓周'", ' 1', ' 3]]']
(6)这个到底有多辣? | '这个到底有多拉?' | [" [['有多辣'", " '有多拉'", ' 4', ' 7]]']
(7)U盘有送挂绳吗 | 'U盘又送挂绳吗' | [" [['盘有'", " '盘又'", ' 1', ' 3]]']
(8)果子酸吗?有烂的吗? | '果子酸吗?有蓝的吗?' | [" [['有烂'", " '有蓝'", ' 5', ' 7]]']
(9)刚下单买了一箱,需要明天到货,先问下味道如何😄 | '刚下单买了一箱,需要明天到货,现问下味道如何😄' | [" [['先问'", " '现问'", ' 15', ' 17]]']
(10)2周岁22斤宝宝用多大的啊? | '2周岁22斤宝宝用多达的啊?' | [" [['用多大'", " '用多达'", ' 8', ' 11]]']
(11)请问这茶是一条装的吗 | '请问这差是一条装的吗' | [" [['这茶'", " '这差'", ' 2', ' 4]]']
(12)有坏的果吗 | '有怀的果吗' | [" [['有坏'", " '有怀'", ' 0', ' 2]]']
(13)生产日期怎么样 新嘛 | '生产日期怎么样 心嘛' | [" [['新嘛'", " '心嘛'", ' 8', ' 10]]']
(14)插上去的时候是驱蚊液放下面的吗? | '插上去的时候是驱蚊以放下面的吗?' | [" [['液放'", " '以放'", ' 9', ' 11]]']
(15)橄榄的和这款哪个比较好用?味道都是一样的么? | '橄榄的和这款哪个比较好永?味道都是一样的么?' | [" [['好用'", " '好永'", ' 10', ' 12]]']

same_pinyin.txt 文件质量不佳

从数量上看,5000多个常用字不够,另外,试着查找"官"字,和它一致拼音的"关"字没有出现。
比如,"关网" --> "官网" 就不会被纠正。

代码版本?

请教下 用pip安装下 在___init__文件下
def get_confusion_char_set(c):
confusion_char_set = get_same_pinyin(c) # .union(get_same_stroke(c))
if not confusion_char_set:
confusion_char_set = set()
return confusion_char_set
与您现在的 公布的代码
def get_confusion_char_set(c):
confusion_char_set = get_same_pinyin(c).union(get_same_stroke(c))
if not confusion_char_set:
confusion_char_set = set()
return confusion_char_set

这里有些不一样 是不是版本的问题呢 ?

下载了您的word粒度模型,NLP小白想请教您几个问题。

(1)“【s】” 和 “【/s】”符号代表着什么意思?这里三角号打不出来....
(2)每行数据的第一个数字代表的是该词数量的log10统计概率吗?
(3)需要 对文本进行怎样的预处理?我参考您的博客只进行分词了,需不需要每句都要添加句子起止符?

关于seq2seq_attention的问题

您好,我使用您的代码和语料进行训练,但是我训练完进行测试的结果特别差,并不能和你截图的效果一样,想问一下除了按照您的使用说明上的要求,还有什么步骤吗
2018-11-19 09-12-23

自动安装失败

error: can't copy 'pycorrector/data/kenlm': doesn't exist or not a regular file

Command "/usr/bin/python -u -c "import setuptools, tokenize;file='/tmp/pip-install-D4lnto/pycorrector/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-record-kGC_ZP/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-D4lnto/pycorrector/
这是怎么回事,求解答,谢谢!

github上的bert目录是不是少传了文件?

作者你好,github上的bert目录是不是少传了文件?没看到这个包的init文件。另外,bert这个分支模型处于什么阶段了?效果如何?是不是可以直接拿来用在生产环境了?

No module named zhtools.langconv

  • 环境macos

  • 安装方法:pip install pycorrector

  • 安装成功后,import pycorrector的时候报错No module named zhtools.langconv

语言模型出错

您好,

我发现您提供的云盘里的语言模型people2014corpus_chars.klm和程序默认的语言模型people_chars_lm.klm是不一样的。然后我把云盘里的模型替换掉默认模型之后,程序就运行失败了,显示Illegal instruction (core dumped).
我想问下我该如何使用云盘里提供的语言模型,谢谢。

对于非常用词的误判

您好,
对于文档里如人名、公司名、地名等一些非常用词,模型一般都会误认为这些词是有问题的。对此请问您有什么建议?谢谢!

关于detector.py文件中的问题

您好,两个问题请教一下:
1) 关于detecor.py这个文件有个问题,在第282行开始,我理解的逻辑是结合2-gram和3-gram两个模型的评分,那么不应该是分别导入两个模型吗?但是在kenlm/文件夹下只有一个模型,即您这边只导入了一种模型做了两种情况的操作?
2) kenlm文件夹下的模型是基于charater切分后的文件训练的吗?n-gram中的n取的是几呢?

需要用tensorflow?

在 requirements中有tensorflow,但是代码中没有 import,是将来用么?

detector_test.py 中import出错

from pycorrector.corrector import *
from pycorrector.utils.text_utils import *

报错:
ImportError: No module named 'pycorrector.corrector'

请问如何修改?
谢谢!

1. load word model报错 2. 关于char模型的误报

  1. 我修改了config.py,下载了您训练的word模型,准备load模型:
    language_model_path = 'data/kenlm/people2014corpus_words.klm'
    但爆出了错误,people2014corpus_words.klm
    OSError: Cannot read model 'data/kenlm/people2014corpus_words.klm' (lm/read_arpa.cc:65 in void lm::ReadARPACounts(util::FilePiece&, std::vector&) threw FormatLoadException. first non-empty line was "" not \data. Byte: 7)

请问一下,您有试过word模型吗?是不是模型本身的格式问题,char模型,我load是没有问题的。

  1. 使用char模型进行文本纠错,会出现很多把正确的句子改错的情况,举个例子:
    借款额度可以提现吗 借款额度可以提现马: 把“吗”错误地改成了“马”
    您怎么看待这个问题,是否要调节一下阈值threshold?

多谢了!

运行模型badcase记录

楼主,您好!我在运行examples下面的use_custom_confusion.py文件时,遇到下面两个badcase,第一个badcase是:我把iPhone 差=>iPhoneX这一对词语加到了my_confusion.txt中,但是运行结果把iPhone差纠正为iPhone查,并没有输出我期待的iPhoneX,运行结果如下【original sentence:iPhone差。 => correct sentence:('iPhone查。', [['差', '查', 6, 7]])】;
第二个badcase是我把 小明同学=>小茗同学这一对词语也加入到了my_confusion.txt中,然后我输入一句话“我想喝小明同学”,尽管模型正确地把“小明同学”改成了“小茗同学”,但是整句话的分词显然不正确,运行结果如下【original sentence:我想喝小明同学。 => correct sentence:('我像喝小茗同学。', [['我想', '我像', 0, 2], ['喝小明', '喝晓明', 2, 5], ['小明同学', '小茗同学', 3, 7]])

希望您能对以上两个问题给出解决方法,非常感谢!

加载多个klm模型

您好,目前安装了pycorrector模块之后发现只能加载people_chars_lm.klm这个模型,想问一下我自己下载了维基百科的文本数据训练了一个模型,想放到安装目录的data/kenlm文件夹下面也让它同时加载这两个模型,应该如何更改呢,谢谢啦

想问rnn_crf infer 问题

为什么不像Seq2Seq 那个一样给他们输入文本,再做preprocess?
而是每次测些也要连Training Set做一次preprocess先。

谢谢您!你的代码及文章启发了很多!

安装失败

执行python setup.py install 
报错
copying pycorrector/init.py -> build/lib/pycorrector
copying pycorrector/eval.py -> build/lib/pycorrector
copying pycorrector/config.py -> build/lib/pycorrector
copying pycorrector/en_spell.py -> build/lib/pycorrector
creating build/lib/pycorrector/data
error: can't copy 'pycorrector/data/test': doesn't exist or not a regular file

源码安装和pip都是报这个错,请问什么原因?谢谢

文本纠错

您好,
请问这个模型暂时只能解决错字的情况么?对于多字和少字的情况可以解决么?
例如“**人民民银行”,纠正成“**人民银行”。

获取OOV词对应的id方式错误

vocab = (UNK_TOKEN,) + vocab[:len(vocab)]
word_to_int = dict(zip(vocab, range(len(vocab))))
if word_dict_path:
save_dict(word_to_int, word_dict_path)
data_vector = [list(map(lambda word: word_to_int.get(word, len(vocab)), i)) for i in data]

UNK标记在字典word_to_int的键值是0,那么下面取OOV词对应id时,不应该返回词典长度大小,而是应该返回0。

data_vector = [list(map(lambda word: word_to_int.get(word, len(vocab)), i)) for i in data]
# --->
data_vector = [list(map(lambda word: word_to_int.get(word,0), i)) for i in data]

讨论corrector.py细节

楼主,您好!详细读了您基于统计规则的纠错代码,关于corrector.py有以下问题,请您有空的时候,逐一回答一下,特别感谢!
(1)text_utils中的tokenize函数前一个版本是仅仅加入jieba.add_word(word),在最近的版本中您加入了jieba.add_word(k),有什么作用,可以具体解释一下吗?
(2)之前英文iPhoneX的问题,因为用户输入什么样的都有,可不可以在我们的代码中做一下这个英文的容错,做的话,代码怎么写?
(3)我试验了模型,有一个很大的问题是召回词语太多,一些本来不应该召回的字词,您的模型召回了,貌似把这些不想召回的词语加入word_freq可以解决一部分这个问题,请问原理是什么?有没有其它比较现实又有效果的方法?
(4)在corrector.py的文件中既有initialized_corrector这个属性,又有initialize_corrector()函数,请问两者的作用本质区别?
(5)corrector.py文件中的get_same_pinyin(),get_same_stroke()等函数的第一句话都是self.check_corrector_initialized(),为什么这么写?
(6)corrector.py文件中known()函数的作用是什么?
(7)corrector.py文件中_confusion_char_set()和_confusion_custon_set()不理解这两个函数的功能?
(8)corrector.py文件中_generate_items()函数对三种长度1,2,>2分别怎么处理,最后return的含义?
(9)_correct_item()函数的主要逻辑?
(10)correct()函数主要逻辑,为什么要分成_correct_item()和correct()两个函数处理?

关于使用rnn作为语言模型训练和预测的一些问题请教

您好,参考了下您的代码,最近在用biLSTM+attention的方式做中文检错,希望对于一个输入句子得到可能错误的位置。问下细节问题。

在训练的时候训练数据构造如下:
输入: "[start] 今 天 天 气 很 好"

label:"今 天 天 气 很 好 [end]"

  1. 预测的时候,假设输入句子为“今天添气横好”

把"[start] 今 天 添 气 横 好"输入模型, infer后可以得到各个字对应的概率,然后根据概率卡阈值得到可能错误的位置。

请问数据构造和预测的逻辑有问题吗?

我用上述的预测逻辑得到输入句子每个位置的概率基本上接近1.我想了下,因为训练的时候模型拟合的方向是将输入句子往其左移1位偏的,这样的话模型在forward的时候只要无脑使得预测输出为输入左移1位就行,所以对于输入句子不管有没错误,每个位置的预测概率基本接近1. 感觉是预测的逻辑有问题,应该如何预测呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.