缘起
最近去听王统尚老师的《对联欣赏与写作》课程, 得到一个上联:
照面井,井照面,面面相觑。
其中,「照面井」是一处位于宜昌市屈原村伏虎山腰的井, 相传为屈原幼年照影梳洗之处。 而「面面相觑」则是写人面与水中倒影相映之趣。
由此我们得到下联大概的格式:
[景点名字] [景点名字调个个] [AABC 式成语]
看起来并不困难。
从景点名字下手,我们很快得到了这样一句:
伏虎山,山伏虎,虎虎生风。
但问题来了,「虎」都被「山」给「伏」住了, 还怎么「生风」呢? 这是为了对上对子而说的「虎」言乱语罢了, 和「我应该在车底」是同一流。
我的朋友王铭煜先生随即给了我一个建议, 那就是从那个叠字成语而不是景点入手。 因为「AABC」式的成语相对少, 而景点更多时候似乎是包罗万象什么都可凑合的。
在一通无意义的搜罗过后,我们注意到我们应该首先分析上联。
「照面井」是一个偏正短语,「照面」是偏,「井」是正。 而「照面」又是一个动宾短语,「照」是动,「面」是宾。 只有满足这样的嵌套结构,我们才能对景点名进行 「ABC -> CAB」式的置换。
由此我们知道我们需要找一个这样的「AABC」式成语, 它的「A」是一个可用作宾语的名词。
然后我们有了第二稿:
悬空寺,寺悬空,空空如也。
然后我们注意到音律的问题,「空空如也」末尾是仄声。
于是我们再加上一条,成语的结尾需要是平声。
在对照成语数据库和景点数据库进行查找后,我们又得到:
叶落岭,岭落叶,落落大方。
但问题在于「叶落岭」结构与「照面井」不完全一致, 如果它叫「落叶岭」就会好一些。
接着我们又找到:
藏字石,石藏字,字字珠玑。
且不论「藏字石」这个景点,「字字珠玑」和「面面相觑」也对不上号。 让我们继续搜索。 我们注意到有一个词叫「洋洋大观」, 而澳门恰好有一个「東望洋炮台」,我们可以将它简称为「望洋台」, 于是有:
望洋台,台望洋,洋洋大观。
但是毕竟我们还是用了个缩写,而且「炮台」和「井」…… 但天无绝人之路,我们注意到澳门还有个地方叫「東望洋山」, 似乎更加可以缩写为「望洋山」了。
在一番检索之后,我们注意到我国台湾省有山名「望洋山」, 一字不差。好了,由此我们得到最终的答案:
望洋山,山望洋,洋洋大观。
照面井算法
显然我们不会满足于只对出这一条下联。 经过上面的长思考,我们发现对于这样的「机关对」, 求解下联的过程关键在于搜索。 意即,这样的过程具有相当的自动化潜力。
我们将刚刚的求解过程抽象如下:
-
Pattern Analysis
详细分析解读上联的成句规则, 并由此推知下联的预期组成方式。
-
Keyword Formation
将分析所得 pattern 进行符号化描述, 确定搜索方式,构建查询语句。
前两步应当需要人工或具备极高文学能力的 LLM 通过反复迭代完成。
-
Searching
依据上步所得查询语句, 在一组广罗万象的数据库中进行查询, 并进行排列组合得到可能下联。
这些数据库应当至少包括:
-
世界知识
-
文学文化常识
-
语言知识,包括词性、褒贬等
-
-
Checking and Grading
根据上一步所得出的海量结果进行清洗, 筛除质量过差的,并对剩余条目打分, 最终按照分数倒序输出。
此处清洗打分的可能方式有:
-
语义向量分析
-
特化艺术模型
-
LLM 分析
-
人在回路
-
该系统应当可以实现相当程度的自动化, 配合人在回路亦可实现极高的输出质量。
同时,由于其配备了极其广博的数据库, 基本可以认为有能力穷举不过于生僻的一切可能, 由此带来的「诗云」式效果具有解决诸多「千古绝对」的潜力, 亦可对一些对联的可解性作出相当程度的说明。
当然了,这个算法的瓶颈在于世界知识库。 我们很难得到如此广博又如此高质量的一群数据库。 知识的存储与快速索引始终是最大的难点, 这也解释了为何许多机关对成为千古绝对。
(注:由于机关对本身就很难创作, 理论上讲我们暂不会遇到需要大批量对出下联的用例, 算法效率暂且不是问题。)
为表示对王统尚老师的感谢, 我将此流程命名为「照面井算法」。
应用
让我们尝试用照面井算法来直接解决照面井问题。 在使用 Github 上的 chinese-xinhua 项目 作为成语库, 使用 Overpass 地名库进行交叉索引后, 我们另得到了如下的几条下联:
放生池,池放生,生生不息。
思源亭,亭思源,源源不绝。
升官坪,坪升官,官官相为。
当然了,还有更多的地名可用, 例如「聚源峰」「养生亭」之类。 此外,我们也并未进行真正的全量索引。
但我们注意到这些下联与「望洋山」联的质量存在明显差距, 这体现出我们目前原型验证算法在数据库索引程度和排序方式上存在改进空间, 也同样说明了 在二零二六年的九月,机器仍不能完全代替人类对出机关对。