赛题 A 中文文本纠错
中文文本纠错的任务主要是针对中文文本中出现的错误进行检测和纠正,属 于人工智能自然语言处理的研究子方向。中文文本纠错通常使用的场景有政务公 文、裁判文书、新闻出版等,中文文本纠错对于以中文作为母语的使用者更为适 用。基于此,本赛题主要选取中文母语者撰写的网络文本为校对评测数据,要求 参赛者从拼写错误、语法错误、语病错误等多个方面考察中文文本纠错系统的自 然语言理解能力和纠错能力。
【数据说明及其使用方法】
1、本次赛题选择网络文本作为纠错数据,要求参赛者从中检测并纠正错误, 实现中文文本纠错系统。数据中包含的错误类型有:拼写错误,包括别字和别词;语法错误,包括冗余、缺失、乱序;语病错误,包括语义重复及句式杂糅。
2、本赛题提供的训练数据及验证数据见“数据集.zip”,训练集规模为 10 万 句,验证集规模为 1000 句。参赛队伍也可以使用公开数据集及其他开放型数据 对模型进行训练。
3、训练数据使用方法:训练数据文件中,每一行为一条训练数据,每一条训练数据为json格式,ID 字段为数据ID,source字:段为待纠正文本,target字段为纠正后的文本。
4、验证集使用方式:
具体的输入、输出格式如下:
输入:输入文件每行包含句子ID及相对应的待校对句子,句子ID及相对应的 待校对句子之间用“\t”进行分割。
输出:输出文件每行包含句子ID及对应的纠错结果。纠错结果中每处错误包 含错误位置、错误类型、错误字词及正确字词。每处错误及多处错误间均以 英文逗号分隔,文件编码采用utf-8 编码。
【相关评价标准】
采用字级(Character Level)评价标准,基于整个测试集所有汉字的错误检 测或纠正结果确定。错误检测(Error Detection)评估的是错误位置的侦测效果, 错误纠正(Error Correction)评估的是对应位置错误修正的效果。对于每个维度 的评测,统一使用准确率(Precision)、召回率(Recall)和F1 作为评价指标。
基于赛题提供的数据,请自主查阅资料,选择合适的方法完成如下任务:
任务一:分析数据集“train_large_v2.json”,自主进行数据预处理,选择合适 的指标用于中文文本纠错,并说明选择指标的原因。
任务二:根据赛题的描述,请分析问题,并对比业界主流的解决问题方案, 提出你的解决问题的思路,并设计相关模型。
任务三:使用任务二所构建的模型,对所提供的数据集进行模型训练,并纠 正验证集中文本的中文错误。
任务四:对比分析优化过程中各个模型、训练方案的优劣势,自主选取评价 方式和评价指标评估模型的优劣,并总结分析相关内容。任务五:探究中文文本中每类错误的主要原因,找出相关的特征属性,并进 行模式识别,挖掘可能存在的模式和规则。
第一种思路是直接调用大模型API进行中文纠错,这里推荐一下百度AI大模型,网页搜索百度AI开放平台登录认证即可使用。认证以后就可以调用API了,具体的调用方式可以参考官方技术文档。
调用好API以后即可使用以下代码对验证集数据进行中文纠错:
from aip import AipNlp
# 初始化百度AI的客户端
APP_ID = '你的APP_ID'
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'
client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
# 读取文件并对每一行进行纠错
def correct_sentences_in_file(file_path):
corrected_sentences = []
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
line = line.strip()
if line: # 忽略空行
sentence = line.split('\t')[1] if '\t' in line else line
check_result = client.ecnet(sentence)
corrected_sentences.append(check_result)
return corrected_sentences
# 指定文件路径
file_path = 'qua_input.txt'
# 对文件中的句子进行纠错
corrected_sentences = correct_sentences_in_file(file_path)
# 打印纠错后的结果
for sentence in corrected_sentences:
print(sentence)
第二种思路当然就是自己动手搭建深度学习模型进行训练啦!训练集数据为'train_large_v2.json',验证集数据为'qua_input.txt', 'qua_labels.txt'。然后可以使用TensorFlow或PyTorch框架,这里使用BERT模型进行训练。废话不多说,直接上代码:
def load_json_data(filename):
data = []
with open(filename, 'r', encoding='utf-8') as file:
for line in file:
data.append(json.loads(line))
return data
def preprocess_json_data(data, max_length=512):
inputs = [" ".join(jieba.cut(item['source'])) for item in data]
labels = [1 if item['source'] != item['target'] else 0 for item in data] # 标签为1表示有错误,0表示无错误
encodings = tokenizer(inputs, truncation=True, padding=True, max_length=max_length)
return encodings, labels
def load_text_data(input_filename, label_filename):
with open(input_filename, 'r', encoding='utf-8') as file:
inputs = file.readlines()
with open(label_filename, 'r', encoding='utf-8') as file:
labels = file.readlines()
return inputs, labels
def preprocess_text_data(inputs, labels, max_length=512):
processed_inputs = [" ".join(jieba.cut(line.split('\t')[1].strip())) for line in inputs]
processed_labels = [] # 初始化处理过的标签列表
for label in labels:
parts = label.strip().split(',')
if len(parts) > 1 and parts[1].strip() != '-1':
processed_labels.append(1) # 存在错误
else:
processed_labels.append(0) # 不存在错误
encodings = tokenizer(processed_inputs, truncation=True, padding=True, max_length=max_length)
return encodings, processed_labels
class TextDataset(Dataset):
def __init__(self, encodings, labels=None):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
if self.labels:
item['labels'] = torch.tensor(self.labels[idx])
return item
def __len__(self):
return len(self.encodings['input_ids'])
train_data = load_json_data('train_large_v2.json')
train_encodings, train_labels = preprocess_json_data(train_data)
train_dataset = TextDataset(train_encodings, train_labels)
qua_inputs, qua_labels = load_text_data('qua_input.txt', 'qua_labels.txt')
qua_encodings, qua_labels = preprocess_text_data(qua_inputs, qua_labels)
qua_dataset = TextDataset(qua_encodings, qua_labels)
完整代码请前往文末公众号文章内进行查看哦!