Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

CeoxNim/wrong_sentence_recognition

Repository files navigation

互联网数据挖掘——错误语句识别

任务要求

针对给定语句,识别该语句是否包含错误。

使用提供的数据集,基于训练集训练分类模型,并在测试集上进行性能测试

数据分析

训练集共590000对正错句子对,分别存储在train.cor和train.err中,逐行对应

测试集为8229个句子,格式为01标签+句子内容

对训练集中的句子进行token分析,encoding之后的向量长度分布如下图所示

根据其分布,在encoding时统一将句子padding及truncation到128

baseline

数据处理

将训练集逐个读入合并,建立对应的dataframe框架,包含note和label两列

利用transform中的BertTokenizer进行encoding,将其得到的字典一并加入dataframe框架中,代码如下

# token and encoding
tokenizer = BertTokenizer.from_pretrained(config["model_name"]) 
df_note = list(df["note"])
encoding = tokenizer(df_note, truncation=True, padding=True, max_length=128)
# add columns to dataframe
df["input_ids"] = encoding["input_ids"]
df["attention_mask"] = encoding["attention_mask"]
df["token_type_ids"] = encoding["token_type_ids"]

将生成的dataframe框架用pickle进行dump保存为二进制格式,方便后续读取

模型搭建

训练基于pytorch-lightning框架,使用预训练的"Bert-base-chinese"模型,具体训练信息如下

model_name: "bert-base-chinese"
accelerator: ddp
train_batch_size: 64
val_batch_size: 64
n_splits: 5
num_workers: 4
gpus: 6
seed: 41
precision: 16
epochs: 20
lr: 0.00002					# get_linear_schedule_with_warmup
total_steps: 73750 		# 590000 * 2 / 5 / 64 * 20

optimizer采用AdamW,scheduler采用get_linear_schedule_with_warmup,loss采用CrossEntropyLoss时,score采用f1score

训练结果

在训练集中表现良好,train_score可以达到0.9,在验证集表现不好,只能达到近0.5

测试结果

训练时采用了五折交叉验证,故一共得到了五个模型

对五个模型的预测结果进行平均,若其值大于0.5,则认为该句子正确,否则则认为该句子错误

在测试集中表现良好,预测结果见result1.txt,各指标计算如下

accuracy_score: 0.727
f1_score: 0.756

结果分析

为何在训练集上有如此好的效果,验证集却不尽如人意呢?又为何在测试集上效果还可以(显著好于验证集)呢?

私以为应该是训练时数据分布的问题,baseline的方法是直接将两个文件的句子随机打乱进行fold的划分,这就没有充分利用到正错句子之间的信息,很可能在当前fold中验证集出现的句子在训练集并没有出现过而在其他的fold中,这在一定程度上可能会造成验证集的效果下降。但在测试的时候,因为是五折的模型综合来判断,相当于做了一个ensemble,利用到了所有的训练数据信息,故最终效果要显著好于验证集

方法改进

将正错句子文件分别逐行插入到新文件,这样可以保证句子对相邻

在五折交叉验证时不对其进行shuffle,使同一个句子对尽量出现在同一个fold中

改进后在验证集上的f1score分数可以达到0.7+,相比于之前的0.4+具有显著提升

在测试集上同样表现良好,预测结果见result2.txt,各指标计算如下

accurace_score: 0.723
f1_score: 0.755

至于测试集为何没有显著提升,见baseline章节的结果分析。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /