文本纠错--N-gram--Macbert模型的调用以及对返回结果的处理

article/2024/3/2 10:37:10

文本根据词典进行纠错

输入一段可能带有错误信息的文字, 通过词典来检测其中可能错误的词。
例如:有句子如下:中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂
   有词典如下:中国人民,中央人民,澳门,西门
   检测时,根据词典可以得出句子中的中央人民可能为中国人民,澳门可能为西门,并返回结果

处理逻辑如下:

  • 首先对词典进行逐字打码,例如中国人民处理成:*国人民,中*人民,中国*民,中国人*,并返回一个index_list记录对应的位置和打码的位置(后面才可以根据这个index_list找到候选词)。
  • 接着对句子进行N-gram,比如检测第二个字时,设置n为4(一般都处理为4),处理成:中央,中央人,中央人民,央人,央人民,央人民政,并对央打码,处理成:中*,中*人,中*人民,*人,*人民,*人民政
  • 最后与上述处理完的词典进行对比,如果找到相同的比如:词典里面的 中*人民 与 检测时返回的N-gram里面的 中*人民相同,便根据index_list找到词典中的中国人民,由此可得,字的候选词为。如下:{‘correction’: ‘国’, ‘index’: 1, ‘candidate’: [‘中国人民’], ‘original’: ‘央’}

实现代码如下:

  • 对词典进行处理:
def get_new_dict(dict):'''将词典逐字打码:param dict::return: 新词典以及对应的index'''new_dict = []index_list = []for j in range(len(dict)):for i in range(len(dict[j])):if i < len(dict[j]):new_dic = dict[j][:i] + '*' + dict[j][i+1:]else:new_dic = dict[j][:i] + '*'new_dict.append(new_dic)index_list.append((j,i))return new_dict,index_list
#测试:
dicts = ['中国人民','中央人民','澳门','西门']
new_dict,index_list = get_new_dict(dicts)
print(new_dict)
print("**********************")
print(index_list)

输出:

index_list的元组第一个值表示词典的索引位置,第二个值表示对应这个词打码位置的索引

在这里插入图片描述

  • 对句子进行N-gram
def get_ngram(content,loc,n):'''切分Ngram.函数为根据索引位置切分,如果想切分整个content,只需要加一个循环使loc从0到len(conten)-1:param content: 原文:param loc: 想要检测的字的索引位置:param n: 切分长度:return: ngram'''i_min = loc-n+1 if loc-n+1 >= 0 else 0i_max = loc+1j_min = loc+1j_max = loc+1+n if loc+1+n < len(content) else loc+1+1ngram_list = []for i in range(i_min,i_max):for j in range(j_min,j_max):if j-i > 4 or j - i < 2:continuengram_list.append(content[i:j].replace(content[loc],'*'))return ngram_list
#测试
content = '中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂'
loc = 1
ngram_list = get_ngram(content,loc,n=4)
print(ngram_list)

输出:
在这里插入图片描述

  • 最后进行词典与N-gram的比对并返回相应结果:
def get_result(ngram_list,new_dict,index_list,loc,original,dicts):'''获取结果:param ngram_list: 原文分割后的Ngram:param new_dict: 打码处理后的字典:param index_list: 处理后的字典对应的索引位置:param loc: 检测字的索引位置:param original: 检测的字:param dicts: 原始词典:return:'''candidate = []error_dic = {}for word in ngram_list:if word in new_dict:indexs = [i for (i, v) in enumerate(new_dict) if v == word]for index in indexs:index = index_list[index]correction = dicts[index[0]][index[1]]if original == correction:continuecandidate.append(dicts[index[0]])error_dic['correction'] = correctionerror_dic['index'] = locerror_dic['candidate'] = candidateerror_dic['original'] = originalreturn error_dic
#测试
original = content[loc]
error_dic = get_result(ngram_list,new_dict,index_list,loc,original,dicts)
print(error_dic)

输出:

{‘correction’: ‘国’, ‘index’: 1, ‘candidate’: [‘中国人民’], ‘original’: ‘央’}

完整代码如下:

def get_ngram(content,loc,n):'''切分Ngram.函数为根据索引位置切分,如果想切分整个content,只需要加一个循环使loc从0到len(conten)-1:param content: 原文:param loc: 想要检测的字的索引位置:param n: 切分长度:return: ngram'''i_min = loc-n+1 if loc-n+1 >= 0 else 0i_max = loc+1j_min = loc+1j_max = loc+1+n if loc+1+n < len(content) else loc+1+1ngram_list = []for i in range(i_min,i_max):for j in range(j_min,j_max):if j-i > 4 or j - i < 2:continuengram_list.append(content[i:j].replace(content[loc],'*'))return ngram_listdef get_new_dict(dict):'''将词典逐字打码:param dict::return: 新词典以及对应的index'''new_dict = []index_list = []for j in range(len(dict)):for i in range(len(dict[j])):if i < len(dict[j]):new_dic = dict[j][:i] + '*' + dict[j][i+1:]else:new_dic = dict[j][:i] + '*'new_dict.append(new_dic)index_list.append((j,i))return new_dict,index_listdef get_result(ngram_list,new_dict,index_list,loc,original,dicts):'''获取结果:param ngram_list: 原文分割后的Ngram:param new_dict: 打码处理后的字典:param index_list: 处理后的字典对应的索引位置:param loc: 检测字的索引位置:param original: 检测的字:param dicts: 原始词典:return:'''candidate = []error_dic = {}for word in ngram_list:if word in new_dict:indexs = [i for (i, v) in enumerate(new_dict) if v == word]for index in indexs:index = index_list[index]correction = dicts[index[0]][index[1]]if original == correction:continuecandidate.append(dicts[index[0]])error_dic['correction'] = correctionerror_dic['index'] = locerror_dic['candidate'] = candidateerror_dic['original'] = originalreturn error_dic
#测试#测试
dicts = ['中国人民','中央人民','澳门','西门']
content = '中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂'
loc = 7
original = content[loc]
ngram_list = get_ngram(content,loc,n=4)
new_dict,index_list = get_new_dict(dicts)
error_dic = get_result(ngram_list,new_dict,index_list,loc,original,dicts)
print(error_dic)
'''
输出:
{'correction': '西', 'index': 7, 'candidate': ['西门'], 'original': '澳'}
'''

Macbert是什么?

原始 BERT 模型的缺点之一是预训练和微调阶段任务不一致,pretrain 有 [mask] 字符,而 finetune 没有。
MacBERT 用目标单词的相似单词,替代被 mask 的字符,减轻了预训练和微调阶段之间的差距。
输入一句话,给其中的字打上“mask”标记,来预测“mask”标记的地方原本是哪个字。

input: 欲把西[mask]比西子,淡[mask]浓抹总相宜
output: 欲把西[湖]比西子,淡[妆]浓抹总相宜

通过tensorformers使用macbert:


http://www.ngui.cc/article/show-747351.html

相关文章

网络安全观察报告恶意软件观察

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

OSI七层模型中各层网络协议

应用层: (典型设备:应用程序&#xff0c;如FTP&#xff0c;SMTP &#xff0c;HTTP) DHCP(Dynamic Host Configuration Protocol)动态主机分配协议&#xff0c;使用 UDP 协议工作&#xff0c;主要有两个用途&#xff1a;给内部网络或网络服务供应商自动分配 IP 地址&#xff0c…

详解Pytorch中的torch.nn.MSELoss函数(包括每个参数的分析)

一、函数介绍 Pytorch中MSELoss函数的接口声明如下&#xff0c;具体网址可以点这里。 torch.nn.MSELoss(size_averageNone, reduceNone, reduction‘mean’) 该函数默认用于计算两个输入对应元素差值平方和的均值。具体地&#xff0c;在深度学习中&#xff0c;可以使用该函数用…

数据结构之树相关概念的知识铺垫

文章目录前言1.树的相关介绍2. 树的表示3.二叉树概念及结构4.二叉树的性质5.二叉树相关概念练习6.总结前言 之前对数组结构中线性结构进行了相关的介绍&#xff0c;本文将开始对非线性结构进行相关的介绍&#xff0c;首先介绍的是树&#xff0c;会围绕树的相关概念进行初步的简…

FlinkCDC部署

文章目录Flink安装job部署1、测试代码2、打包插件3、打包4、测试测试结果JSON格式一览1、对监视的数据库表执行初始快照2、插入数据3、更新数据4、删除数据Flink安装 1、解压 wget -b https://archive.apache.org/dist/flink/flink-1.13.6/flink-1.13.6-bin-scala_2.12.tgz t…

Java最流行的Spring框架该怎么学?阿里、腾讯、字节跳动等大厂面试中关于Spring都会问什么?

Spring作为现在最流行Java 开发技术&#xff0c;其内部源码设计非常优秀。如果你不会Spring&#xff0c;那么很可能面试官会让你回家等通知。 Spring是什么&#xff1f; 有一个工地&#xff0c;几百号人在用铁锹铲子挖坑。 如果开一辆挖掘机来&#xff0c;用一天时间干的活就…

推荐系统基本问题及系统优化路径

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点大规模推荐类深度学习系统的设计实践.pdf荣耀推荐算法架构演进实践.pdf推荐系统在腾讯游戏中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf&…

Vue2基础篇-31-nextTick

1. 简介 语法&#xff1a;this.$nextTick(回调函数)作用&#xff1a;在下一次 DOM 更新结束后执行其指定的回调。什么时候用&#xff1a;当改变数据后&#xff0c;要基于更新后的新DOM进行某些操作时&#xff0c;要在nextTick所指定的回调函数中执行。 2. demo <template…

甲骨文蟾蜍 Toad for Oracle 16.2 注册版

使您的 Oracle 数据库操作现代化以实现业务敏捷性。 Toad for Oracle 是唯一一款可帮助您简化工作流程、减少代码缺陷并提高代码质量和性能同时支持团队协作的开发人员工具。自动化管理任务并主动管理您的数据库&#xff0c;同时实现性能优化和风险缓解。快速轻松地定义、搜索…

堪称零瑕疵!仅用了365页直接封神,我要吹爆这份RocketMQ笔记

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件&#xff0c;作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件&#xff0c;以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。 谁使用ApacheRocketMQ&#xff1f; …