一、句子的检错纠错,如下四种方法:
1、检错部分:
1.1. 序列标注:
本来的序列标注是进行命名实体识别的任务,在检错任务中将其改成01标注,使用O标注正确的词,使用S-1标注错误的词。
数据处理:
保证了错误的句子占全部句子的25%; sent: right_sent:342803; wrong_sent:101565;(3:1)
vocab_num:102674;word: right_word 4816307; wrong_word:125748(40:1)
效果:40轮 f=0.6
2、纠错部分:
3、使用seq2seq:
3.1. 流畅度提升推断机制:
https://www.jiqizhixin.com/articles/2018-07-05-12 微软亚研院 未开源
3.2. 有偏解码:
https://cloud.tencent.com/developer/article/1109177 腾讯 开源tensorflow
https://github.com/atpaino/deep-text-corrector
This project reuses and slightly extends TensorFlow's Seq2SeqModel
, which itself implements a sequence-to-sequence model with an attention mechanism as described in https://arxiv.org/pdf/1412.7449v3.pdf.
4、纠错+检错:
4.1. 基于n-gram语言模型和困惑集:
https://cloud.tencent.com/developer/article/1156792 腾讯云社区 未开源
二、在目前项目已完成检错部分的前提下,继续进行该项目有以下三种方式:
1)丢弃已完成的检错,使用3.2 (tensorflow开源)
2)使用4.1的方法 补全2(pytorch)
困惑集替换 -〉生成候选句 -〉候选句打分 -〉分数不高于原句则认为没错
3)自行 使用上下文➕错误词信息➕attention的方式 补全2(pytorch)
用lstm/cnn分别 表示 错误词前的context 和 后面的context 然后拼上错误词的embedding:
[ softmax( cat( lstm(W(n-1)) , emb(Wn) , lstm(W(n+1)) ) ) ]
或者 用错误词对上下文进行attention后得到的 context vector:
[ softmax( bmm( context , softmax( linear( linear(context)+linear(Wn) ) ) ) ) ]
其他:
常见30种NLP任务的练手项目:https://mp.weixin.qq.com/s/456iQhnNgPeqNYJxDss-DA
------------------------------------------------------------分割线------------------------------------------------------------
三、自己的具体实现步骤 // 实现3.2
1)seq2seq任务 首先把数据处理成input/output并train/val/test六个文件,每个文件的存放都是一行一个sent,word之间空格隔开。
已处理好,处理文件在/users4/zsun/pytorch/seq2seq/text-corrector/preprocess.py,
处理好的文件在/users4/zsun/pytorch/seq2seq/text-corrector/data/
2)下载源代码,存放在/users4/zsun/tensorflow/text-corrector/deep-text-corrector
3)代码要求TensorFlow version >= 0.11.
4)源代码使用的数据集是电影对话数据集Movie-Dialogs Corpus,30万样本数据,处理成小写。
python preprocessors/preprocess_movie_dialogs.py --raw_data movie_lines.txt \
--out_file preprocessed_movie_lines.txt
然后编写代码分为train/val/test
5)
1.对数据集的噪声/改错在train时每取一条原始数据更改为带有语法错误的句子;
操作有随机删去{"a", "an", "the", "'ll", "'s", "'m", "'ve", "to"}
和随机更改{"there": "their", "their": "there", "then": "than", "than": "then", "be":"to" }
2.在训练时学习正确的tokens:
代码在text_corrector_model.py的model.step()中
Training:
python correct_text.py --train_path /movie_dialog_train.txt --val_path /movie_dialog_val.txt \
--config DefaultMovieDialogConfig --data_reader_type MovieDialogReader \
--model_path /movie_dialog_model
6)
Testing:
python correct_text.py --test_path /movie_dialog_test.txt \
--config DefaultMovieDialogConfig --data_reader_type MovieDialogReader \
--model_path /movie_dialog_model \
--decode