论文阅读:《Solving and Generating Chinese Character Riddles》

之前想给语音助手增加一个猜字谜的功能,这两天不忙就读了一下这篇机器解谜语的论文。

参考:
https://www.aclweb.org/anthology/D16-1081.pdf

Introduction

  • 解谜语类似于下面的过程:

图片

  • 解谜的pipeline
    • 解题过程
      • 学习谜语中的短语和部首的对齐关系
      • 学习谜语和rule的关系
      • 使用上面两个关系,用算法得到候选答案
      • 使用Ranking-SVM来对candidate进行排序
    • 生成谜语过程
      • 使用模版方法
      • 使用替代的方法
      • 使用Ranking-SVM来对candidate进行排序
    • 整体过程如下图:

图片

Phrase-Radical Alignments and Rules

Alignment

  • 希望将“千里”和“马”进行对齐
  • 方法一
    • 将谜语分词$\left(w_{1}, w_{2}, \ldots, w_{n}\right)$
    • 将答案分成不同部首$\left(r_{1}, r_{2}, \ldots, r_{m}\right)$
    • 统计对齐$\left(\left[w_{i}, w_{j}\right], r_{k}\right)(i, j \in[1, n], k \in[1, m])$
  • 方法二
    • 谜语中两个连续字符$\left(w_{1}, w_{2}\right)$,如果w1是w2的部首,且w2的其余部分r出现在答案q中,则$\left(\left(w_{1}, w_{2}\right), r\right)$是一个对齐
  • 统计所有的对齐,并过滤掉出现频次小于3的
  • 特别常见的对齐如下图:

图片

Rules

  • 总结了6类规则

图片

  • 对于$\left(\left[w_{1}, w_{n}\right], r\right)$,如果r是wi的部首,则$\left(w_{1}, \dots, w_{i-1},(.), w_{i+1}, \dots, w_{n}\right)$就是一个潜在的规则,我们从数据中最终总结193条规则,归纳为上面6类
  • 1000个汉字有至少1个alignment,27个汉字有至少100个alignment

Riddle Solving and Generation

Solving Chinese Character Riddles

  • 解谜算法的伪代码如下

图片

  • 以“上岗必戴安全帽”为例,“上岗”通过规则“上(up) (.)”和山对齐,“必” 和 “戴”跟自己对齐,“安全帽”因为analogical shape和“宀”对齐,最终得到结果“密”

图片

  • 对答案进行排序,排序时使用的特征如下:

图片

Generating Chinese Character Riddles

  • 基于模板的方法
  • 基于替换的方法
  • 对候选的description进行排序,排序使用的特征如下:

图片

Ranking Model

  • score的计算:$\text { Score }(c)=\sum_{i=1}^{m} \lambda_{i} * g_{i}(c)$,其中c表示一个候选,gi(c)表示c的第i个特征,m是特征的总数,$\lambda_{i}​$表示特征的权重
  • 使用Ranking SVM算法求解特征权重参数

Experiment

  • 数据:从网络上爬取的7w+谜语,3k+的笔画,古代诗词和对联等用于训练语言模型
  • 使用准确率评价解谜的效果,使用人工评测来评价生成谜题