训练问答机器人,语料集的清洗是非常重要的,直接决定了模型的效果,甚至会影响模型的收敛。通过训练,模型把语料集的知识学会了,如果语料集质量不好,比如语料集存在答非所问,回答有语法错误等,模型不具备纠正这些错误的能力,而是把这些错误学会了,因此,模型输出有时就不像人话了。
>存在相同的提问不同的回答
训练语料集中存在多条相同的提问,但回答不同。LSTM网络通过训练,找到合适的权重,在提问与回答之间建立映射关系,当语料集存在多条相同的提问,但回答不同的对话组时,模型训练过程中,权重会在上面几条对话组中来回调整,loss值震荡,无法收敛。
当训练语料集中有几组相同的提问但回答不同的对话时,模型训练了200轮不收敛。
删除了相同的提问但回答不同的对话,模型训练200轮,loss值降到接近0.0,准确率达到100%。
清洗相同的提问不同的回答的python代码
>对话组答非所问,有缺失
对于语料集质存在答非所问,有缺失的情况,模型不具备纠正这些错误的能力,而是把这些错误学会了,因此,预测时输入错误对话组的提问,模型输出就不像人话了。那么如何判断对话组是否是答非所问呢?可以通过提问句与回答句的相似度来判断,如果相似度大于阀值(一般0.1-0.3),可以认为提问句与回答句是相关的。python代码如下:
>妥善处理超长的语料
为了减少计算量,缩短训练时间,结合问答机器人需求,需要设置LSTM网络模型输入与输出最大的字符长度。对于超过最大长度的语料,一般做法是截断,截断会导致语义不完整,甚至语法错误,所以建议使用过滤法,把超长的语料去掉,选取长度符合要求的语料。
>标点符号的处理
在自然语言中,标点符号用来辅助表达语义,但在LSTM网络中,没有对标点符号做特别的处理,把它当做文字同等处理。这样处理,同一句话,有标点与没有标点对于LSTM网络来说,语义是不同的,而对于自然语言来说,语义差异是比较小的,甚至语义是一样的。因此,标点符号是不等同于字符的。具体的处理方法是把语料集的提问语句的标点符号用空格代替,回答语句不用替换。python代码如下:
>中英文混合语句处理
模型是针对中文设计的,英文是作为单个字母处理的,没有做英文分词处理,当输入是中英文混合时,会偏离语义,因此需要把提问句包含英文字母的样本清除。python代码如下:
问答机器人训练语料清洗完整的python代码CSDN资源下载。
代码下载链接:https://download.csdn.net/download/u013705518/11350976