2023年高校大数据挑战赛A题中文文本纠错求解全过程文档及程序

2023年高校大数据挑战赛

A题 中文文本纠错

原题再现:

  中文文本纠错的任务主要是针对中文文本中出现的错误进行检测和纠正,属于人工智能自然语言处理的研究子方向。中文文本纠错通常使用的场景有政务公文、裁判文书、新闻出版等,中文文本纠错对于以中文作为母语的使用者更为适用。基于此,本赛题主要选取中文母语者撰写的网络文本为校对评测数据,要求参赛者从拼写错误、语法错误、语病错误等多个方面考察中文文本纠错系统的自然语言理解能力和纠错能力。
  【数据说明及其使用方法】
  1、本次赛题选择网络文本作为纠错数据,要求参赛者从中检测并纠正错误,实现中文文本纠错系统。数据中包含的错误类型有:拼写错误,包括别字和别词;语法错误,包括冗余、缺失、乱序;语病错误,包括语义重复及句式杂糅。
  2、本赛题提供的训练数据及验证数据见“数据集.zip”,训练集规模为10万句,验证集规模为1000句。参赛队伍也可以使用公开数据集及其他开放型数据对模型进行训练。
  3、训练数据使用方法:
  训练数据文件中,每一行为一条训练数据,每一条训练数据为json格式,ID字段为数据ID,source字:段为待纠正文本,target字段为纠正后的文本。训练数据样例:{“ID”: “ID18423310”, “source”: “洛赞曾经看到安妮在她的头发上戴着一条红色缎带,并称这对她来说太“年轻化”,郡钩位骄傲小姐回答说:“我队伍中的人总是年轻”。”,“target”: “洛赞曾经看到安妮在她的头发上戴着一条红色缎带,并称这对她来说太“年轻化”,这位骄傲的小姐回答说:“我的队伍中的人总是年轻”。”}
   4、验证集使用方式:
  具体的输入、输出格式如下:
  输入:输入文件每行包含句子ID及相对应的待校对句子,句子ID及相对应的待校对句子之间用“\t”进行分割。
  输出:输出文件每行包含句子ID及对应的纠错结果。纠错结果中每处错误包含错误位置、错误类型、错误字词及正确字词。每处错误及多处错误间均以英文逗号分隔,文件编码采用utf-8编码。
  输入文件示例:pid=0011-1 关于瑞典时装公司拒绝使用新疆产品的言轮在华引发广泛声讨和抵制浪潮。pid=0011-2 给老百姓包括少数民族群众提供更多的就业机会,一般正常人都都会觉得是件好事。pid=0012-1 第三局比赛俄罗女排的气势被完全压制。pid=0011-4 因为他们自己上历史真的就这么干了上百年,所以现在以己度人;
  输出文件示例,:pid=0011-1, 20, 别字, 轮, 论, pid=0011-2, 28, 冗余, 都, , pid=0012-1, 7, 缺失, , 斯, pid=0011-4, 6, 乱序, 上历史, 历史上,
  【相关评价标准】
  采用字级(Character Level)评价标准,基于整个测试集所有汉字的错误检测或纠正结果确定。错误检测(ErrorDetection)评估的是错误位置的侦测效果,错误纠正(ErrorCorrection)评估的是对应位置错误修正的效果。对于每个维度的评测,统一使用准确率(Precision)、召回率(Recall)和F1作为评价指标。
在这里插入图片描述
  0 基于赛题提供的数据,请自主查阅资料,选择合适的方法完成如下任务:
  任务一:分析数据集“train_large_v2.json”,自主进行数据预处理,选择合适的指标用于中文文本纠错,并说明选择指标的原因。
  任务二:根据赛题的描述,请分析问题,并对比业界主流的解决问题方案,提出你的解决问题的思路,并设计相关模型。
  任务三:使用任务二所构建的模型,对所提供的数据集进行模型训练,并纠正验证集中文本的中文错误。
  任务四:对比分析优化过程中各个模型、训练方案的优劣势,自主选取评价方式和评价指标评估模型的优劣,并总结分析相关内容。
  任务五:探究中文文本中每类错误的主要原因,找出相关的特征属性,并进行模式识别,挖掘可能存在的模式和规则。

整体求解过程概述(摘要)

  随着国际交流的多元化,中文变得越来越具有吸引力。由于中文文本的语序与其他语序差别较大,许多中文学习者很难掌握中文的语序规则。因此,中文文本的词语语序纠错变得越来越重要。中文语法中文文本错误纠错通常分为两类:一类为拼写错误纠错,另一类为语法错误纠错并包含词语冗余、词语缺失、词语选择和词语语序(乱序)。本文针对中文文本的错误纠错进行研究,从经典的神经网络入手解决中文文本错误的问题。
  针对问题1,首先分析数据集“train_large_v2.json”,其次构建数据集预处理的流程:语料清洗、去停用词、繁转简体、切分字词、生成标签。最后采用词向量表示和序列到序列的文本纠错的相关技术,为后续词语语序纠错模型及其改进打下了基础。
  针对问题 2,构建了基于经典神经网络模型的词语语序纠错模型。鉴于人工提取特征过程中易造成信息丢失,而经典神经网络模型在特征提取中取得的优异性能,本文分别采用Bi-GRU、CNN和Transformer 经典神经网络用于序列到序列的词语语序纠错任务,并详细的分析模型的结构及原理。
  针对问题3,在问题2所构建模型的基础上,首先在阿里云服务器上进行实验,基于Python3.6 和 Torch1.4.0 的 Linux 环境中进行模型的训练,其次对基于经典神经的词语语序纠错模型相关参数进行设定,最终纠正验证集中的中文错误,具体结果在附录所示。
  针对问题4,采用字级(Character Level)评价标准,基于整个测试集所有汉字的错误检测或纠正结果确定。由于本文中文拼写纠错模型集检错与纠错为一体,因此根据具体实验设置了一些特定指标,分别为:误报率/错误识别率(FPR),检测准确率(DA),检测精确率(DP),检测召回率(DR),检测F值(DF),纠错准确率(CA),纠错精确率(CP),纠错召回率(CR)和纠错F值(CF)。其次引入了动态规划提高模型纠错效率,使用平滑技术应对数据稀疏问题。最后结果表明本文提出的基于Transformer模型实验结果接近平均水平,误报率/错误识别率FPR为0.1218较低,表现较好,其余指标也皆优于其他模型。
  针对问题5,通过对前几个问题的分析总结,采用K-means算法进行聚类,验证集输入句子数为969条,含有错误的句子数480条,别字错误280个,冗余错误59个,缺失错误88个,乱序错误11个,语义重复73个,句式杂糅27个。结果显示中文文本中每类错误的主要原因为:别字错误排名第一(35%),词语缺失错误排第二(32%),语义重复排第三(20.5%)。
  本文最后讨论了模型的优缺点,并对模型的应用与推广做了进一步的思考。

模型假设:

  假设1:假设数据预处理之后的数据均为准确数据。
  假设2:假设未在给出数据集内的其他因素对文本错误无显著影响。
  假设3:假设所调查的相关影响因素数据都比较准确。
  假设4:给定的数据集可全面体现整体情况。

问题重述:

  针对于问题一,使用附件中的数据,进行数据预处理,选择合适的指标用于中文文本纠错,并说明选择指标的原因。
  针对于问题二,分析问题,并对比业界主流的解决问题方案,并提出解决问题的思路,并设计相关模型。
  针对于问题三,使用问题二所构建的模型,对所提供的数据集进行模型训练,并纠正验证集中文本的中文错误。
  针对于问题四,对比分析优化过程中各个模型、训练方案的优劣势,自主选取评价方式和评价指标评估模型的优劣,并总结分析相关内容。
  针对于问题五,探究中文文本中每类错误的主要原因,找出相关的特征属性,并进行模式识别,挖掘可能存在的模式和规则。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

部分程序如下:
import torch 
import torch.nn as nn 
import torch.optim as optim 
from transformers import BertTokenizer, BertModel 
# 超参数 
MAX_LEN = 128 
BATCH_SIZE = 32 
EPOCHS = 10 
LEARNING_RATE = 0.001 
 
# 加载BERT模型和tokenizer 
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') 
bert_model = BertModel.from_pretrained('bert-base-chinese') 
  
class EntityModel(nn.Module): 
    def __init__(self, bert_model, hidden_size, num_tags): 
        super(EntityModel, self).__init__() 
        self.bert = bert_model 
        self.dropout = nn.Dropout(0.1) 
        self.bilstm = nn.LSTM(bidirectional=True, input_size=hidden_size, hidden_size=hidden_size // 2, 
batch_first=True) 
        self.fc = nn.Linear(hidden_size, num_tags) 
        self.crf = CRF(num_tags) 
  
    def forward(self, input_ids, attention_mask, labels=None): 
        outputs = self.bert(input_ids, attention_mask=attention_mask) 
        sequence_output = outputs[0] 
        sequence_output = self.dropout(sequence_output) 
        lstm_output, _ = self.bilstm(sequence_output) 
        logits = self.fc(lstm_output) 
        if labels is not None: 
            loss = -self.crf(logits, labels, mask=attention_mask.byte()) 
            return loss 
        else: 
            tags = self.crf.decode(logits, mask=attention_mask.byte()) 
            return tags 
# 数据预处理 
with open('train_large_v2.json', 'r', encoding='utf-8') as file: 
    lines = file.readlines() 
 
# 转换每一行的内容并写入新的txt文件 
with open('output.txt', 'w', encoding='utf-8') as file: 
    for line in lines: 
        data = eval(line)  # 将字符串转换为字典 
        source = data['source']  # 获取source字段的值 
        target = data['target']  # 获取target字段的值 
        source = source.replace(" ", "")  # 去除source字段中的空格 
        target = target.replace(" ", "")  # 去除target字段中的空格 
        file.write(f"{source} {target}\n")  # 将转换后的内容写入新文件 
 
def tokenize_and_preserve_labels(text, labels): 
    tokenized_text = [] 
    token_labels = [] 
    for word, label in zip(text, labels): 
        tokenized_word = tokenizer.tokenize(word) 
        n_subwords = len(tokenized_word) 
  
        tokenized_text.extend(tokenized_word) 
        token_labels.extend([label] * n_subwords) 
  
    return tokenized_text, token_labels 
  
def pad_sequences(sequences, max_len, padding_value=0): 
    padded_sequences = torch.zeros((len(sequences), max_len)).long() 
    for i, seq in enumerate(sequences): 
        seq_len = len(seq) 
        if seq_len <= max_len: 
            padded_sequences[i, :seq_len] = torch.tensor(seq) 
        else: 
            padded_sequences[i, :] = torch.tensor(seq[:max_len]) 
    return padded_sequences 
  
def train(model, optimizer, train_dataloader): 
    model.train() 
    total_loss = 0 
    for step, batch in enumerate(train_dataloader): 
        input_ids = batch['input_ids'].to(device) 
        attention_mask = batch['attention_mask'].to(device) 
        labels = batch['labels'].to(device) 
        loss = model(input_ids, attention_mask, labels) 
        total_loss += loss.item() 
  
        optimizer.zero_grad() 
        loss.backward() 
        optimizer.step() 
  
    avg_train_loss = total_loss / len(train_dataloader) 
    return avg_train_loss 
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915937.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用CNN进行验证码识别:深度学习与图像预处理教程

验证码&#xff08;CAPTCHA&#xff09;广泛用于区分人类和自动化程序&#xff08;如机器人&#xff09;&#xff0c;通常由扭曲的字母、数字或符号组成。为了实现验证码的自动识别&#xff0c;深度学习尤其是卷积神经网络&#xff08;CNN&#xff09;非常有效。本文将带你一起…

基于 Python Django 的二手房间可视化系统分析

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

探索 Sentinel 服务容错

Sentinel 是阿里巴巴开源的一款高可用防护组件,主要用于分布式系统中的流量控制、熔断降级和系统负载保护。它在 Java 微服务架构中扮演着重要的角色,帮助开发者确保系统的稳定性和可靠性。 以下是 Sentinel 的一些关键特性: 流量控制(Flow Control):通过对请求进行限流…

DBeaver 连接 OceanBase Oracle 租户

DBeaver 是一款通用的数据库工具软件&#xff0c;支持任何具有JDBC驱动程序的数据库。DBeaver 需要 Java 运行环境的支持。截稿时 DBeaver 24.0.0 版本默认提供的 OceanBase 驱动是连接 MySQL 的&#xff0c;想连接 Oracle 租户需要新建一个驱动器使用。 下载数据库驱动包 1、…

Dubbo 3.x源码(24)—Dubbo服务引用源码(7)接口级服务发现订阅refreshInterfaceInvoker

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的MigrationRuleHandler这个处理器&#xff0c;它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现…

企业如何提高招聘能力?

企业如何提高招聘能力&#xff1f; 许多企业在进行招聘工作时&#xff0c;常常会遇到各种问题和挑战。尽管付出了大量的时间和精力&#xff0c;但结果却并不总是如人意。例如&#xff0c;企业可能会经历一次又一次的面试&#xff0c;却仍然找不到一个能够适应岗位要求的合适人…

JAVA:探索 EasyExcel 的技术指南

1、简述 在 Java 开发中&#xff0c;Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案&#xff0c;特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景&#xff0c;并通过实例展示其基本用法…

AI制作ppt

1&#xff0c;kimi&#xff1a; 实际上也是AiPPT.cn这个网站&#xff08;但是有实际次数限制&#xff09; 2&#xff0c;其余专业AI ppt生成网站&#xff1a; &#xff08;1&#xff09;gamma&#xff1a;https://gamma.app/ 大概能制作7~10页左右 free的ppt&#xff0c;其余要…

穿越数据迷宫:C++哈希表的奇幻旅程

文章目录 前言&#x1f4d4;一、unordered系列关联式容器&#x1f4d5;1.1 unordered 容器概述&#x1f4d5;1.2 哈希表在 unordered 容器中的实现原理&#x1f4d5;1.3 unordered 容器的特点 &#x1f4d4;二、unordered_set 和 unordered_map 的基本操作&#x1f4d5;2.1 un…

数据结构 -二叉搜索树

一.什么是二叉搜索树 树插入删除方便比线性数组 二.二叉搜索树的查找操作 尾递归可以用循环递归 三.二叉树的插入操作 35要挂在33上面必须记住33的位置 解决方法&#xff0c;要求递归函数返回一个 结点插到33的右子树 四.二叉搜索树的删除 要是删除的是叶子节点之间删除 只有一…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想&#xff0c;即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…

使用 AMD GPU 推理 Mixtral 8x22B

Inferencing with Mixtral 8x22B on AMD GPUs — ROCm Blogs 2024年5月1日&#xff0c;由 Clint Greene撰写。 简介 自从Mistral AI’s AI发布了Mixtral 8x7B以来&#xff0c;专家混合&#xff08;MoE&#xff09;在AI社区重新获得了关注。受此发展启发&#xff0c;多个AI公…

前后端、网关、协议方面补充

这里写目录标题 前后端接口文档简介前后端视角对于前端对于后端代码注册路由路由处理函数 关于httpGET/POST底层网络关于前端的获取 路由器网关路由器的IP简介公网IP(WAN IP)私网IP(LAN IP)无线网络IP(WIFI IP)查询路由器私网IP路由器公网IP LAN口与WIFI简介基本原理 手动配置电…

leetcode104:二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

大语言模型理论基础

文章目录 前言大语言模型必需知识概述大语言模型目标模型上下文神经网络的神经元常见激活函数SigmoidTanhRelusoftmax 通用近似定理多层感知机&#xff08;MLP&#xff09;拟合最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们接下来对大语言模型一探究竟&#xff0c;…

关于VUE NPM安装失败的问题

最近使用 npm install --registryhttps://registry.npmmirror.com 安装一个新项目的依赖&#xff0c;各种失败。 最后发现是package-lock里面有老的淘宝的域名&#xff0c;整体替换掉就行了

【数据结构】宜宾大学-计院-实验七

实验七 二叉树 一、实验目的&#xff1a;二、实验内容&#xff1a;三、实验结果&#xff1a;1,2&#xff1b;3,4,5;6.数组顺序存储的优缺点二叉链表存储的优缺点 一、实验目的&#xff1a; 掌握二叉树的顺序存储结构 掌握二叉树的链式存储结构 二、实验内容&#xff1a; 1&am…

游戏如何应对内存修改

据观察&#xff0c;近年来游戏黑灰产攻击角度多样化趋势显著&#xff0c;主要面临工作室、定制注入挂、模拟点击挂、内存修改挂、破解版等多方面安全问题。 据FairGuard数据统计&#xff0c;在游戏面临的众多安全风险中&#xff0c;「内存修改」攻击占比约为13%&#xff0c;主…

git重置的四种类型(Git Reset)

git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件&#xff08;使用了…

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;再其他节点下用户建本地表成功&#…