[ 关闭 ] @xixibufu 2018-08-15T06:01:40.000000Z 字数 4736 阅读 1103 基于 机器 翻译 输出 的 语法 错误 纠正 NLP 神经 机器 翻译 语法 错误 纠正 __________________________________________________________________ 介绍 背景 英语 , 作为 世界 上 使用 范围 最 广 的 语言 , 成为 众多 非 英语 国家 ( 地区 ) 的 人们 争相 学习 的 第二 语言 ( English as a Second Language , ESL ) 。 据 统计 , 全世界 有 超过 17.5亿 人 将 英语 作为 一 种 实用 工具 , 这 其中 , 母语 非 英语 的 人 已经 占据 多数 , 同时 , ESL 初学者 的 人 数 仍 在 持续 增长 。 然而 , 学习 一 门 新 的 语言 并非 易事 , 在 ESL 初学者 书写 的 文本 中 , 存在 大量 的 语法 错误 , 能否 利用 计算机 自动 地 纠正 这些 错误 , 辅助 ESL 初 学者 的 语言 学习 , 成为 一 个 现实 的 问题 。 任务 定义 简而言之 , 语法 错误 纠正 ( Grammatical Error Correction , GEC ) , 就是 自动 地 纠正 文本 中 存在 的 语法 错误 , 下图 给出 了 一 个 直观 的 例子 。 具体 的 , 一 个 GEC 系统 , 通过 分析 输入 句子 的 上下文 , 识别 并 纠正 其中 存在 的 任何 语法 错误 , 最终 输出 一 个 无 语法 错误 的 句子 , 且 保留 原 句 的 语义 不 变 。 当然 , 如果 输入 句子 中 不 存在 语法 错误 , GEC 系统 应 直接 返 回原 句 。 GEC 实例 GEC 方法 综述 近年 来 , GEC 这 一 任务 在 方法 上 经历 了 由 规则 到 统计 的 演变 , 大体 可 分为 3 个 阶段 , 下面 做 一 简单 介绍 。 基于 规则 的 方法 这 一 类 方法 通过 硬 编码 规则 来 进行 纠错 。 世界 上 第一 个 GEC 系统 , Writer ' s Workbench ( 1982年 ) , 就 完全 基于 字符串 的 匹配 和 替换 。 对于 某些 特定 类别 的 错误 , 基于 规则 的 方法 易于 实现 且 十分 有效 , 因此 , 直 到 今天 , 该 方 法 仍 被 广泛 使用 。 然而 , 考虑 到 语言 的 复杂性 , 基于 规则 的 方法 并不 适合 作为 GEC 的 通用 方法 。 数据 驱动 的 传统 机器 学习 方法 随着 语料 资源 的 不断 累积 , 从 20世纪 90年代 开始 , 数据 驱动 的 方法 成为 GEC 的 主流 , 人们 利用 机器 学习 技术 ( SVM 、 朴素 贝叶斯 ) , 为 不同 错误 类别 设计 单独 的 分类器 。 这 类 方法 对 冠词 、 介词 等 错误 的 纠正 效果 十分 明显 , 但 也 存在 一些 问题 。 其 仅 利用 了 句子 中局 部 的 上下文 信息 , 且 只 能 独立 地 考虑 不同 的 错误 类别 , 对于 一些 交互式 错误 则 无能为力 。 下面 给出 一 个 例子 。 假设 原 句 为 : 显然 , 句子 中 network 需 改为 networks , plays 需 改为 play 。 而 采用 对 多 个 分类器 做 pipeline 组合 的 纠错 方法 , 假设 主谓 不 一致 先于 名词 单复数 纠正 , 则 纠正 后 的 句子 为 : 仍然 存在 主谓 不 一致 错误 。 基于 机器 翻译 的 方法 将 语法 错误 纠正 看成 是 把 “ 坏 ” 句子 翻译 成 “ 好 ” 句子 的 思想 最早 来源于 Brockett 等人 ( 2006年 ) 。 这 是 一 个 天才 的 想法 , 但 直 到 2014年 , 该 方 法 才 逐渐 成为 GEC 的 主流 , 并 迅速 发展 、 迭代 。 在 CoNLL 2014年 ( CoNLL 是 NLP 领域 的 一 个 年度 评测 会议 ) 的 GEC 评测 中 , 剑桥 大学 提交 的 基 于 统计 机器 翻译 ( Statistical Machine Translation , SMT ) 的 GEC 系统 一举 夺冠 。 之后 , 许多 改进 的 方法 被 陆续 提出 , 其中 一 个 方法 , rerank , 即 提取 语言学 特征 对 SMT 解码 得到 的 若干 候选 句子 进行 重 排序 , 对 纠错 性能 提升 十分 明显 , 基本 成为 GEC 的 一 个 必备 环节 。 而 随着 神经 机器 翻译 ( Neural machine translation , NMT ) 逐渐 取代 SMT , NMT 被 很 自然 地 引入 到 GEC , 成为 state-of-the-art GEC 系统 的 核心 组件 。 基于 NMT 输出 的 GEC 系统 ( a ) encoder-decoder 模型 假设 为 输入 句子 , 为 纠正 后 的 句子 。 GEC 系统 通过 建模 , 试图 找出 , 并 将 其 作为 纠正 结果 。 encoder-decoder 模型 的 思想 很 简单 , 首先 , 用 一 个 神经 网络 ( encoder ) 将 输入 句子 编码 成 一 个 固定 长度 的 向量 , 接着 , 用 另 一 个 神经网 络 ( decoder ) 基于 该 向量 进行 解码 , 输出 纠正 后 的 句子 。 下图 给出 了 RNN encoder-decoder 模型 的 计算 图 。 RNN encoder-decoder 模型 典型 的 encoder 和 decoder 网络 均 使用 RNN , 这里 分别 记 为 和 。 模型 的 具体 计算 公式 如下 , 其中 , 、 分别 表示 源端 和 目标 端 的 词 向量 矩阵 。 encoder 网络 从 开始 计算 , 遍历 输入 句子 , 直 到 输出 最终 的 隐 状态 向量 。 因此 , 在 理论 上 可以 认为 编码 了 整个 输入 句子 的 信息 。 而 在 解码 阶段 , 将 每 一 个 时间 步 计算 得到 的 隐 状态 向量 通过 函数 , 转换 为 词汇 表上 的 概率 分布 向量 , 之后 , 利用 搜索 技术 ( 如 beam search ) 找出 一 个 输出 句子 。 encoder-decoder 模型 看似 简单 , 实则 非常 强大 。 其 能够 直接 、 有效 地 对 进行 建模 。 以 机器 翻译 为例 , 通过 做 模型 集成 、 采用 更加 复杂 的 encoder ( 如 双向 RNN ) 对 输入 句子 编码 , 仅 用 encoder-decoder 模型 也 能 取得 与 高度 工程化 的 翻译 系统 很 接近 的 性能 。 ( b ) 注意力 机制 ( attention mechanism ) 理论 上 , 一 个 充分 复杂 的 encoder-decoder 模型 , 可以 完美地 解决 像 翻译 、 纠错 这样 的 问题 。 但是 , 在 实际 应用 时 , 受 训练 数据 规模 的 限制 , 模型 不 能 无限大 , 这 使得 encoder-decoder 模型 面临 两 个 突出 的 问题 。 ( 1 ) 长 距离 依赖 输入 句子 和 输出 句子 中 的 某些 词 存在 长 距离 依赖 , 在 反向 传播 时 , 这 可能 引发 梯度 问题 , 造成 模型 学习 困难 。 ( 2 ) 输入 的 表示 这 一 问题 相比 于 长 距离 依赖 问题 更加 严重 。 想象 有 两 个 输入 句子 , 第一 个 仅 包含 3 个 单词 , 第二 个 包含 100 个 单词 , 而 encoder 居然 无 差别 地 将 它们 都 编 码成 相同 长度 的 向量 ( 比如说 50 维 ) 。 这 一 做法 显然 存在 问题 , 长度 为 100 的 句子 中 很多 信息 可能 被 忽略 了 。 注意力 机制 的 提出 就是 为了 解决 这 一 问题 。 在 encoder 对 输入 句子 编码 时 , 我们 保留 每 一 个 词 对应 的 隐 状态 向量 , 而 在 decoder 解码 时 , 我们 充分 利 用 这些 信息 ( 隐 状态 向量 ) , 而 不 是 仅仅 依赖 encoder 输出 的 最后 一 个 隐 状态 向量 。 下图 给出 了 注意力 机制 的 计算 图 。 注意力 机制 计算 图 首先 , 使用 双向 RNN 作为 encoder 编码 输入 句子 , 拼接 同 一 位置 两 个 方向 的 隐 状态 向量 , 得到 词 的 上下文 表示 。 在 解码 时 , 为 不同 隐 状态 向量 分配 不同 权重 , 加权 组合 得到 当前 时间 步 的 上下文 向量 , 和 decoder 当前 输出 的 隐状态 向量 拼接 在一起 , 通过 预测 下 一 个 词 。 注意力 机制 使 我们 可以 在 解码 过程 中 , 动态地 将 更 多 的 注意力 ( 本质 上 是 更大 的 权重 ) 分配 到 输入 句子 中 与 当前 时间 步 解码 更 相关 的 词 上 , 从未 提高 纠错 质量 。 下图 给出 了 在 GEC 中 使用 注意力 机制 的 一 个 实例 , 可以 看到 大部分 权重 都 集中 在 对角 线上 。 注意力 矩阵 ( c ) 重 排序 ( rerank ) encoder-decoder 模型 加 attention , 这 基本 就是 当前 state-of-the-art GEC 系统 的 核心 , 但 为了 进一步 提高 纠错 性能 , 还 有 一 个 重要 的 实用 步骤 — 重 排序 。 典型 的 端到端 Seq2 Seq , 直接 将 解码 ( 如 beam search ) 搜索 得分 最 高 的 结果 作为 输出 。 但 很多 时候 , 由于 encoder-decoder 模型 存在 误差 , 解码 时 得分 最 高 的 结果 并不 一定 是 最 好 的 , 重 排序 对 这 一 问题 做 了 优化 。 具体 做法 很 简单 , 比如说 , 使用 beam search 解码 , 保留 得分 最 高 的 前 k 个 候选 句子 , 然后 , 在 解码 得分 的 基础 上 , 引入 若干 特征 ( 如 输出 句子 在 外部 语言 模型 上 的 概率 得分 、 与 输入 句子 的 编辑 距离 ) , 对 这 k个 候选 句子 重新 排序 , 然后 选择 新 的 得分 最 高 的 句子 作为 最终 输出 。 结语 不可否认 , 目前 GEC 技术 离 实用 还有 一 段 距离 。 作为 辅助 语言 学习 的 工具 , GEC 会 更 多 地 关注 纠错 的 Precision , 如何 在 保证 Precision 的 情况 下 , 提高 纠错 的 Recall , 将 是 今后 GEC 研究 的 一 个 重要 方向 。 此外 , 目前 GEC 的 平行 语料 相对 较 少 , 能否 从 low resource 机器 翻译 研究 中 汲取 营养 , 利用 多 模态 数据 、 无 监督 方法 来 提高 GEC 的 性能 , 也 是 一 个 值得 关注 的 方向 。 学习 一 门 新 的 语言 并不 是 一 件 简单 的 事情 , 技术 为 我们 提供 了 丰富 的 资源 来 改善 我们 的 学习 体验 。 建立 实用 的 自动 语法 纠错 系统 将 深刻 影响 下 一 代 的 语言 学习 , 这 其中 不仅 蕴含 着 巨大 商机 , 还 极 具 教育 意义 。 参考 文献 1 . A Multilayer Convolutional Encoder-Decoder Neural Network for Grammatical Error Correction , Shamil Chollampatt et al . 2 . Grammatical error correction in non-native English , Zheng Yuan . 3 . To err is Human , to Correct is Divine , Mariano Felice et al . 4 . Neural Machine Translation and Sequence-to-sequence Models : A Tutorial , Graham Neubig . 5. Near Human-Level Performance in Grammatical Error Correction with Hybrid Machine Translation , Roman Grundkiewicz et al . * 内容 目录 ______________________________________________________________ * * + o NLP 1 o 基于 机器 翻译 输出 的 语法 错误 纠正 + o multi-label-classification 1 o 图片 标注 说明 文档 + o 业务 用 1 o 图片 标注 说明 文档 + o 日常 1 o 干 点 啥 + o 标注 规范 1 o 图片 标注 说明 文档 + o 神经 机器 翻译 1 o 基于 机器 翻译 输出 的 语法 错误 纠正 + o 语法 错误 纠正 1 o 基于 机器 翻译 输出 的 语法 错误 纠正 + o 面试 1 o 面试 记录 + o 未 分类 2 o 在线 填写 简历 o 我 的 编程 珠玑 + ____________________ + 以下 【 标签 】 将 用于 标记 这 篇 文稿 : * * * * + 下载 客户端 + 关注 开发者 + 报告 问题 , 建议 + 联系 我们 * 添加 新 批注 在 作者 公开 此 批注 前 , 只有 你 和 作者 可 见 。 [ default-head.jpg ] ( BUTTON ) 保存 ( BUTTON ) 取消 [ default-head.jpg ] ( BUTTON ) 修改 ( BUTTON ) 保存 ( BUTTON ) 取消 ( BUTTON ) 删除 * 私有 * 公开 * 删除 ( BUTTON ) 查看 更 早 的 5 条 回复 回复 批注 [ default-head.jpg ] ( BUTTON ) × 通知 ( BUTTON ) 取消 ( BUTTON ) 确认