之前想给语音助手增加一个猜字谜的功能,这两天不忙就读了一下这篇机器解谜语的论文。
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+的笔画,古代诗词和对联等用于训练语言模型
- 使用准确率评价解谜的效果,使用人工评测来评价生成谜题