- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
文本纠错(Text Error Correction)技术旨在自动修正输入文本中的拼写、语法、标点符号等错误,以提高文本的准确性、通顺性和规范性。该技术可以通过自然语言处理技术实现,基于上下文和语言规则对文本进行分析和推断,发现其中的错误,并给出正确的替换或修改建议.
pycorrector是一个开源中文文本纠错工具,它支持对中文文本进行音似、形似和语法错误的纠正。此工具是使用Python3进行开发的,并整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型来实现文本纠错功能。pycorrector官方仓库地址为: pycorrector 。pycorrector安装命令如下:
pip install -U pycorrector 。
本文旨在介绍如何调用pycorrector提供的函数接口来进行文本纠错。事实上,pycorrector官方仓库已经提供了详尽的使用教程,可进一步深入了解pycorrector的使用方法。此外,文章 PyCorrector文本纠错工具实践和代码详解 也系统性地介绍了pycorrector的使用.
# jupyter notebook环境去除warning
import warnings
warnings.filterwarnings("ignore")
本节一些内容和图片来自: pycorrector源码解读 .
应用背景 。
中文文本纠错任务的应用背景和常见错误类型如下图所示,pycorrector专注于解决"音似、形字、语法、专名错误"等类型的错误.
数据集 。
在文本纠错任务中,数据集的质量和数量往往比模型本身更为重要。这也是许多实际场景任务所面临的共同问题。因为模型之间的差别并不大,文本纠错模型的精度更多取决于训练数据规模.
技术思路 。
一般文本纠错任务有两种技术实现方式:基于规则的文本纠错和基于机器学习/深度学习的文本纠错。由于大语言模型效果很好,所以现有文本纠错方法了解即可.
基于规则的中文文本纠错技术思路如下:
基于机器学习/深度学习的文本纠错技术思路如下:
工业解决方案 。
尽管以GPT为代表的大语言模型在文本纠错方面展现出潜力,但其计算资源要求较高,需要训练数据和强大的计算能力。目前,工业界已有的文本纠错技术仍然具备优势和广泛应用场景.
pycorrector中基于规则的中文文本纠错接口默认使用Kenlm模型。具体来说,pycorrector基于Kenlm统计语言模型工具训练了中文NGram语言模型,结合规则方法、混淆集可以快速纠正中文拼写错误,但效果一般.
文本纠错 。
用于文本纠错的correct函数会从路径 ~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm 加载kenlm语言模型文件,如果检测没有该文件, 则模型会自动联网下载。当然也可以手动下载 klm模型文件 (2.8G)并放置于该位置.
import pycorrector
# include_symbol: 是否包含标点符号,默认为True
# threshold: 纠错阈值,默认为57
corrected_sent, detail = pycorrector.correct("人群穿流不息,少先队员因该为老人让坐!",include_symbol=True,threshold=60)
# corrected_sent: 纠错后的句子
# detail: 纠错信息,[wrong, right, begin_pos, end_pos]
corrected_sent, detail
('人群川流不息,少先队员应该为老人让座!',
[('穿流不息', '川流不息', 2, 6), ('因该', '应该', 11, 13), ('坐', '座', 17, 18)])
错误检测 。
pycorrector提供detect函数来检测并返回输入文本中可能存在的语言错误和错误类型.
import pycorrector
idx_errors = pycorrector.detect('人群穿流不息,少先队员因该为老人让坐!')
print(idx_errors)
[['穿流不息', 2, 6, 'proper'], ['因该', 11, 13, 'word'], ['坐', 17, 18, 'char']]
成语、专名纠错 。
pycorrector提供了专门用于对成语和专名进行纠错的函数,如下所示:
from pycorrector.proper_corrector import ProperCorrector
from pycorrector import config
m = ProperCorrector(proper_name_path=config.proper_name_path)
x = [
'这块名表带带相传',
'这块名表代代相传',
'这场比赛我甘败下风',
'这场比赛我甘拜下封',
'早上在拼哆哆上买了点葡桃',
]
for i in x:
print(i, ' -> ', m.proper_correct(i))
这块名表带带相传 -> ('这块名表代代相传', [('带带相传', '代代相传', 4, 8)])
这块名表代代相传 -> ('这块名表代代相传', [])
这场比赛我甘败下风 -> ('这场比赛我甘拜下风', [('甘败下风', '甘拜下风', 5, 9)])
这场比赛我甘拜下封 -> ('这场比赛我甘拜下风', [('甘拜下封', '甘拜下风', 5, 9)])
早上在拼哆哆上买了点葡桃 -> ('早上在拼多多上买了点葡桃', [('拼哆哆', '拼多多', 3, 6)])
自定义混淆集 。
pycorrector通过加载自定义混淆集,支持用户纠正已知的错误,实际就是字符串替换.
from pycorrector import ConfusionCorrector, Corrector
if __name__ == '__main__':
error_sentences = [
'买iphonex,要多少钱', # 漏召回
'哪里卖苹果吧?请大叔给我让坐', # 漏召回
'共同实际控制人萧华、霍荣铨、张旗康', # 误杀
'上述承诺内容系本人真实意思表示', # 正常
'大家一哄而伞怎么回事', # 成语
]
m = Corrector()
for i in error_sentences:
print(i, ' -> ', m.detect(i), m.correct(i))
print('*' * 42)
# 自定义混淆集
custom_confusion = {'得事': '的事', '天地无垠': '天地无限', '交通先行': '交通限行', '苹果吧': '苹果八', 'iphonex': 'iphoneX', '小明同学': '小茗同学', '萧华': '萧华',
'张旗康': '张旗康', '一哄而伞': '一哄而散', 'happt': 'happen', 'shylock': 'shylock', '份额': '份额', '天俺门': '天安门'}
m = ConfusionCorrector(custom_confusion_path_or_dict=custom_confusion)
for i in error_sentences:
print(i, ' -> ', m.confusion_correct(i))
买iphonex,要多少钱 -> [['钱', 12, 13, 'char']] ('买iphonex,要多少钱', [])
哪里卖苹果吧?请大叔给我让坐 -> [] ('哪里卖苹果吧?请大叔给我让坐', [])
共同实际控制人萧华、霍荣铨、张旗康 -> [['霍荣铨', 10, 13, 'word'], ['张旗康', 14, 17, 'word']] ('共同实际控制人萧华、霍荣铨、张启康', [('张旗康', '张启康', 14, 17)])
上述承诺内容系本人真实意思表示 -> [['系', 6, 7, 'char']] ('上述承诺内容系本人真实意思表示', [])
大家一哄而伞怎么回事 -> [['一哄', 2, 4, 'word'], ['伞', 5, 6, 'char']] ('大家一哄而散怎么回事', [('伞', '散', 5, 6)])
******************************************
买iphonex,要多少钱 -> ('买iphoneX,要多少钱', [['iphonex', 'iphoneX', 1, 8]])
哪里卖苹果吧?请大叔给我让坐 -> ('哪里卖苹果八?请大叔给我让坐', [['苹果吧', '苹果八', 3, 6]])
共同实际控制人萧华、霍荣铨、张旗康 -> ('共同实际控制人萧华、霍荣铨、张旗康', [['萧华', '萧华', 7, 9], ['张旗康', '张旗康', 14, 17]])
上述承诺内容系本人真实意思表示 -> ('上述承诺内容系本人真实意思表示', [])
大家一哄而伞怎么回事 -> ('大家一哄而散怎么回事', [['一哄而伞', '一哄而散', 2, 6]])
自定义语言模型 。
pycorrector提供了用于加载自定义语言模型的代码,如下所示:
# 自定义模型路径
lm_path = './custom.klm'
model = Corrector(language_model_path=lm_path)
英文拼写纠错 。
pycorrector也提供英文拼写纠错,效果很一般.
sent = "what happending? how to speling it, can you gorrect it?"
corrected_text, details = pycorrector.en_correct(sent)
print(sent, '=>', corrected_text)
print(details)
what happending? how to speling it, can you gorrect it? => what happening? how to spelling it, can you correct it?
[('happending', 'happening', 5, 15), ('speling', 'spelling', 24, 31), ('gorrect', 'correct', 44, 51)]
pycorrect也支持自定义的词频字典设置,以防止误纠错。如下所示,shylock被纠错为shock,可以设置shylock出现频率比shock高来避免纠错.
from pycorrector.en_spell import EnSpell
# # 定义一个字符串变量
sent = "what is your name? shylock?"
# 创建一个EnSpell类的实例对象
spell = EnSpell()
corrected_text, details = spell.correct(sent)
# shylock被纠错为shock
print(sent, '=>', corrected_text, details)
print('-' * 42)
# 定义一个包含词频信息的字典
# 设置shylock出现频次比shock高
my_dict = {'your': 120, 'name': 2, 'is': 1, 'shock': 2, 'shylock': 1, 'what': 1}
# 创建一个EnSpell类的实例对象,并传入自定义词频字典
spell = EnSpell(word_freq_dict=my_dict)
corrected_text, details = spell.correct(sent)
print(sent, '=>', corrected_text, details)
what is your name? shylock? => what is your name? shock? [('shylock', 'shock', 19, 26)]
------------------------------------------
what is your name? shylock? => what is your name? shylock? []
中文简繁互换 。
pycorrector支持中文简体和繁体的互换,如下所示:
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)
學而時習之,不亦說乎 => 学而时习之,不亦说乎
学而时习之,不亦说乎 => 學而時習之,不亦說乎
pycorrector提供多个基于深度学习的中文文本纠错模型,一般而言,使用深度学习进行中文文本纠错可以获得比基于规则纠错更好的效果。pycorrector在SIGHAN2015数据集数据集下对各种深度学习模型进行了评测,SIGHAN2015数据集是一个经典公开的用于中文文本纠错任务的数据集,并得出以下结论:
SIGHAN 2015
取得接近SOTA的效果 在pycorrector中调用MacBert-CSC模型进行文本纠错的代码如下,该代码将自动加载 macbert4csc-base-chinese 提供的纠错模型.
from pycorrector.macbert.macbert_corrector import MacBertCorrector
from pycorrector import ConfusionCorrector
if __name__ == '__main__':
error_sentences = [
'少先队员因该为老人让坐',
'机七学习是人工智能领遇最能体现智能的一个分知',
]
m = MacBertCorrector()
# add confusion corrector for postprocess
confusion_dict = {"喝小明同学": "喝小茗同学", "老人让坐": "老人让座", "平净": "平静", "分知": "分支"}
cm = ConfusionCorrector(custom_confusion_path_or_dict=confusion_dict)
for line in error_sentences:
correct_sent, err = m.macbert_correct(line)
print("query:{} => {} err:{}".format(line, correct_sent, err))
correct_sent, err = cm.confusion_correct(correct_sent)
if err:
print("added confusion: {} err: {}".format(correct_sent, err))
此外,pycorrector也推荐使用PaddleNLP进行文本纠错。PaddleNLP提供了覆盖包括文本纠错在内的多个产业级NLP预置模型。关于PaddleNLP的安装和使用见其官方仓库: PaddleNLP .
from paddlenlp import Taskflow
corrector = Taskflow("text_correction")
# 单条输入
corrector('遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇。')
[{'source': '遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇。',
'target': '遇到逆境时,我们必须勇于面对,而且要愈挫愈勇。',
'errors': [{'position': 3, 'correction': {'竟': '境'}}]}]
# 批量预测
corrector(['遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇。', '人生就是如此,经过磨练才能让自己更加拙壮,才能使自己更加乐观。'])
[{'source': '遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇。',
'target': '遇到逆境时,我们必须勇于面对,而且要愈挫愈勇。',
'errors': [{'position': 3, 'correction': {'竟': '境'}}]},
{'source': '人生就是如此,经过磨练才能让自己更加拙壮,才能使自己更加乐观。',
'target': '人生就是如此,经过磨炼才能让自己更加茁壮,才能使自己更加乐观。',
'errors': [{'position': 10, 'correction': {'练': '炼'}},
{'position': 18, 'correction': {'拙': '茁'}}]}]
实际上,无论是基于规则的中文文本纠错算法还是其他基于深度学习模型的文本纠错算法,它们的效果都不如深度学习大模型(例如ChatGPT)。即使是PaddleNLP提供的纠错模型,在中文自然语言处理任务中也有相当高的精度,但面对一些简单的纠错案例时,效果也可能不佳。如下所示,“穿流不息”被错误地纠正为“传流不息”。因此,在实际应用时,应该根据具体场景定制相应的模型。如果是工业应用,在算力要求不高的情况下,应该尽可能选择开源大语言模型.
corrector('人群穿流不息,少先队员因该为老人让坐')
[{'source': '人群穿流不息,少先队员因该为老人让坐',
'target': '人群传流不息,少先队员应该为老人让坐',
'errors': [{'position': 2, 'correction': {'穿': '传'}},
{'position': 11, 'correction': {'因': '应'}}]}]
最后此篇关于[自然语言处理]基于pycorrector实现文本纠错的文章就讲到这里了,如果你想了解更多关于[自然语言处理]基于pycorrector实现文本纠错的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
至少在某些 ML 系列语言中,您可以定义可以执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses -
这可能是其他人已经看到的一个问题,但我正在尝试寻找一种专为(或支持)并发编程而设计的语言,该语言可以在 .net 平台上运行。 我一直在 erlang 中进行辅助开发,以了解该语言,并且喜欢建立一个稳
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在寻找一种进程间通信工具,可以在相同或不同系统上运行的语言和/或环境之间使用。例如,它应该允许在 Java、C# 和/或 C++ 组件之间发送信号,并且还应该支持某种排队机制。唯一明显与环境和语言
我有一些以不同语言返回的文本。现在,客户端返回的文本格式为(en-us,又名美国英语): Stuff here to keep. -- Delete Here -- all of this below
问题:我希望在 R 中找到类似 findInterval 的函数,它为输入提供一个标量和一个表示区间起点的向量,并返回标量落入的区间的索引。例如在 R 中: findInterval(x = 2.6,
我是安卓新手。我正在尝试进行简单的登录 Activity ,但当我单击“登录”按钮时出现运行时错误。我认为我没有正确获取数据。我已经检查过,SQLite 中有一个与该 PK 相对应的数据。 日志猫。
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
这就是我所拥有的 #include #include void print(int a[], int size); void sort (int a[], int size); v
你好,我正在寻找我哪里做错了? #include #include int main(int argc, char *argv[]) { int account_on_the_ban
嘿,当我开始向数组输入数据时,我的代码崩溃了。该程序应该将数字读入数组,然后将新数字插入数组中,最后按升序排列所有内容。我不确定它出了什么问题。有人有建议吗? 这是我的代码 #include #in
我已经盯着这个问题好几个星期了,但我一无所获!它不起作用,我知道那么多,但我不知道为什么或出了什么问题。我确实知道开发人员针对我突出显示的行吐出了“错误:预期表达式”,但这实际上只是冰山一角。如果有人
我正在编写一个点对点聊天程序。在此程序中,客户端和服务器功能写入一个唯一的文件中。首先我想问一下我程序中的机制是否正确? I fork() two processes, one for client
基本上我需要找到一种方法来发现段落是否以句点 (.) 结束。 此时我已经可以计算给定文本的段落数,但我没有想出任何东西来检查它是否在句点内结束。 任何帮助都会帮助我,谢谢 char ch; FI
我的函数 save_words 接收 Armazena 和大小。 Armazena 是一个包含段落的动态数组,size 是数组的大小。在这个函数中,我想将单词放入其他称为单词的动态数组中。当我运行它时
我有一个结构 struct Human { char *name; struct location *location; int
我正在尝试缩进以下代码的字符串输出,但由于某种原因,我的变量不断从文件中提取,并且具有不同长度的噪声或空间(我不确定)。 这是我的代码: #include #include int main (v
我想让用户选择一个选项。所以我声明了一个名为 Choice 的变量,我希望它输入一个只能是 'M' 的 char 、'C'、'O' 或 'P'。 这是我的代码: char Choice; printf
我正在寻找一种解决方案,将定义和变量的值连接到数组中。我已经尝试过像这样使用 memcpy 但它不起作用: #define ADDRESS {0x00, 0x00, 0x00, 0x00, 0x0
我是一名优秀的程序员,十分优秀!