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

news2024/12/23 13:27:15

文本根据词典进行纠错

输入一段可能带有错误信息的文字, 通过词典来检测其中可能错误的词。
例如:有句子如下:中央人民政府驻澳门特别行政区联络办公室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 0
    i_max = loc+1
    j_min = loc+1
    j_max = loc+1+n if loc+1+n < len(content) else loc+1+1
    ngram_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:
                continue
            ngram_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:
                    continue
                candidate.append(dicts[index[0]])
                error_dic['correction'] = correction
                error_dic['index'] = loc
                error_dic['candidate'] = candidate
                error_dic['original'] = original
    return 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 0
    i_max = loc+1
    j_min = loc+1
    j_max = loc+1+n if loc+1+n < len(content) else loc+1+1
    ngram_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:
                continue
            ngram_list.append(content[i:j].replace(content[loc],'*'))
    return ngram_list

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


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:
                    continue
                candidate.append(dicts[index[0]])
                error_dic['correction'] = correction
                error_dic['index'] = loc
                error_dic['candidate'] = candidate
                error_dic['original'] = original
    return 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.coloradmin.cn/o/77525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红帽曹衡康:开源是企业数字化转型的机遇

在数据成为企业核心资产的今天&#xff0c;为了更好地降本增效&#xff0c;实现业务创新和增长&#xff0c;越来越多的企业都开启了数字化转型之路。然而对于绝大多数企业来说&#xff0c;这条转型之路都并非一帆风顺。事实上&#xff0c;数字化转型在为企业开启更多机遇的同时…

爆火Chatgpt注册 chatgpt使用 完全指南

1 chatgpt 简介 ChatGPT是一种语言模型&#xff0c;它被训练来对对话进行建模。它能够通过学习和理解人类语言来进行对话&#xff0c;并能够生成适当的响应。ChatGPT使用了一种叫做Transformer的神经网络架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;能够在输入…

Java System类

JavaSystem类\huge{Java \space System类}Java System类 System类概述 简而言之&#xff1a;SystemSystemSystem类就是一个工具类&#xff0c;直接调用对应的方法来使用即可&#xff0c;不需要也不能被实例化。 常用方法 ①. exit() 退出Java虚拟机 //执行这个exit(0)代码之…

[附源码]计算机毕业设计的花店售卖系统的设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

GPU——占用情况和进程情况的参数解读表

GPU——占用情况和进程情况的参数解读表一、GPU占用情况二、GPU的进程情况参考资料一、GPU占用情况 名称功能说明Fan风扇转速在0 (%) 到100 (%) 之间变动Temp摄氏温度CPerf性能状态从P0到P12&#xff0c;P0表示最大性能&#xff0c;P12表示状态最小性能Persistence-M持续模式的…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.2 流控模式【关联】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.2 流控模式【关联】31.2.1 流控模式31.2.2 流控模式 - 关联31.2.3 小结31 限流规则…

OpenCV入门(C++/Python)- 使用OpenCV色彩空间(七)

在本教程中&#xff0c;了解计算机视觉中使用的流行色彩空间&#xff0c;并将其用于基于颜色的分割。 使用OpenCV色彩空间不同的颜色空间RGB颜色空间LAB颜色空间YCrCB 颜色空间HSV颜色空间如何使用这些颜色空间进行分割简单方法文章内容如下&#xff1a;首先&#xff0c;我们将…

Linux线程的创建

用户态创建线程&#xff1a; 线程不是一个完全由内核实现的机制&#xff0c;它是由内核态和用户态合作完成的。pthread_create不是一个系统调用&#xff0c;是Glibc库的一个函数。 在nptl/pthread_creat.c里面找到了这个函数&#xff1a; int __pthread_create_2_1 (pthread…

直播预告 | SOFAChannel#31《RPC 框架设计的考和量》

SOFARPC 是蚂蚁集团开源的一款基于 Java 实现的 RPC 服务框架&#xff0c;为应用之间提供远程服务调用能力&#xff0c;具有高可伸缩性&#xff0c;高容错性&#xff0c;目前蚂蚁集团所有的业务的相互间的 RPC 调用都是采用 SOFARPC。SOFARPC 为用户提供了负载均衡&#xff0c;…

web课程设计网页制作、基于HTML+CSS大学校园班级网页设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录刷题Day60 | 84. 柱状图中最大的矩形

代码随想录刷题Day60 | 84. 柱状图中最大的矩形 84. 柱状图中最大的矩形 题目&#xff1a; 定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: …

C++调用OpenCV实现图像阈值处理

1 前言 在计算机视觉技术中&#xff0c;阈值处理是一种非常重要的操作&#xff0c;它是很多高级算法的底层处理逻辑之一。比如在使用OpenCV检测图形时&#xff0c;通常要先对灰度图像进行阈值&#xff08;二值化&#xff09;处理&#xff0c;这样就得到了图像的大致轮廓&#…

English Learning - L1 站在高处建立灵魂 2022.12.5

English Learning - L1 站在高处建立灵魂 2022.12.51.1 到底什么是语法1.2 为什么要学习语法口语分广义和狭义讲母语的人为啥不学语法&#xff1f;作为一名二语习得者口语中可不可以没有有语法&#xff1f;1.3 英语&#xff08;听说读写&#xff09;的核心金字塔理论关于词汇量…

免费内网穿透工具测评对比,谁更好用 2

文章目录1. 前言2. 对比内容2.1 http协议功能及操作对比2.1.1 网云穿的http设置2.1.2 Cpolar的http设置2.2 使用感受对比3. 结语1. 前言 上篇文章&#xff0c;笔者对比了网云穿和Cpolar的直观内容&#xff0c;包括网站界面、客户端界面和内网穿透设置界面。总的来说&#xff0…

保姆级教程:手把手教你使用深度学习处理文本

大家好&#xff0c;今天给大家分享使用深度学习处理文本&#xff0c;更多技术干货&#xff0c;后面会陆续分享出来&#xff0c;感兴趣可以持续关注。 文章目录NLP技术历程准备数据标准化词元化Tokenization&#xff08;文本拆分&#xff09;技术提升建立索引表使用TextVectoriz…

开源开放 | 开源知识图谱抽取工具DeepKE发布更新

知识图谱是一种用图模型来描述知识和建模世界万物之间关联关系的大规模语义网络&#xff0c;是大数据时代知识表示的重要方式之一。近年来&#xff0c;知识图谱在辅助语义搜索、支持智能问答、增强推荐计算、提升语言语义理解和大数据分析能力等越来越多的技术领域得到重视&…

极客时间课程笔记:业务安全

业务安全 业务安全体系&#xff1a;对比基础安全&#xff0c;业务安全有哪些不同&#xff1f;业务安全和基础安全在本质上就有很大的不同&#xff1a;在基础安全中&#xff0c;黑客将技术作为核心竞争力&#xff1b;在业务安全中&#xff0c;黑产将资源作为核心竞争力。谁能够…

ADI Blackfin DSP处理器-BF533的开发详解23:SDRAM内存的设计和自检(含源代码)

硬件准备** ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-EDU-BF53x 板卡上采用的 SDRAM 型号为 MT48LC16M16A2,容量为 32Mbyte&#xff0c;采用 16Bit 模式连接ADSP-BF53x。通过配置 EB…

【STM32】详解嵌入式中FLASH闪存的特性和代码示例

一、存储器 我们正常编译生成的二进制文件&#xff0c;需要下载烧录到单片机里面去&#xff0c;这个文件保存在单片机的ROM(read only memory)中&#xff0c;所有可以完成这种特性的存储介质都可以称为ROM。 分类 ROM一般分为四大类 ①PROM&#xff1a;可编程只读存储器&#…

毫米波雷达系列 | 基于前后向空间平滑的MUSIC算法详解

毫米波雷达系列 | 基于前后向空间平滑的MUSIC算法详解 文章目录毫米波雷达系列 | 基于前后向空间平滑的MUSIC算法详解DOA阵列模型MUSIC算法空间平滑算法整体流程仿真代码忙了一阵子的中期和专利&#xff0c;基本上告一段落&#xff0c;简单的写一个比较常见的解相干MUSIC角度估…