全部文章
    提高

    ScanChess 怎么处理读不清的那一步

    6 分钟阅读English
    ScanChess 怎么处理读不清的那一步的流程示意图

    每张记谱单上都有那么几步是真的难认:笔没下去、读秒时写得潦草、两个字符连在了一起。真正值得问的不是「第一次能不能认对」,而是认不对的时候会怎么样

    这段时间我们做的正是这件事。改动分三类:把墨迹读得更仔细、抓住规则永远抓不到的那类错误、以及把剩下的疑点问得更好。这里没有任何一项会在你背后改动棋谱——那是有意保留的。

    「错」不是一件事

    在最终的 PGN 里长得一模一样的三种失败,其实要分开看:

    1. 墨迹认错。 笔画看到了,字符挑错了。
    2. 记法意外。 墨迹认对了,但写法不在标准代数记谱法的定义里,于是整步被当成无效丢掉。
    3. 合法的误读。 这一步读起来干净、走起来合法,但不是当时实际下的那一步。

    三种要用三种办法。规则校验只解决了前两种,而且只解决了一部分。

    有些字更容易混,有些不会

    识别结果要和候选着法比对,而以前这个比对对所有字符一视同仁:1 认成 7,和 1 认成 9,代价完全一样——尽管前者是手写里极常见的混淆,后者几乎不发生。

    现在这个比对是分级的。手写里真正容易混的成对字符——1/7a/gc/ek/r0/O——只计一小部分代价;没人会混的成对字符照旧计满。当两个候选着法和墨迹的距离本来相当时,那个「像是笔误」的会胜出。

    有一种情况值得单独立规矩。吃子符号是棋手最常漏写的东西——赶时间时把 Bxf3 写成 Bf3——而旧的算分方式为这一次遗漏罚了两次:一次算少了个字符,一次算吃子标记对不上。一次遗漏罚两次,足以把真正的着法压到旁边一格的安静着法后面。现在漏写的 x+# 只计一小部分代价,因为它几乎不携带「到底是哪一步」的信息。

    棋手真正会写的记法

    标准代数记谱法是裁判手册里写的东西,不总是记谱单上真正出现的东西——尤其是在别处学棋的人,或者几十年前学棋的人。下面这些写法,现在会拿到局面上去解析,而不是直接判为无效:

    写法 含义
    Pe4Pxd5Pe8=Q 兵前面加 P
    e2-e4Ng1-f3Bc1xf4Ng1f3 长代数记法,有没有横线都行
    BxNNxBc4 写被吃的子,而不是写格子
    cdcxdcd5c:d 线吃线

    解析前会先剥掉回合数、che.p. 和评注符号,以及大家用来表示「吃」的那好几种字符。如果剥完之后的读法只对应一步合法着法,它以高置信度进入候选池;如果对应好几步——比如两个马都能吃的时候写了 BxN——它以低置信度进入,因为这个读法本身没能定下是哪一步,剩下的交给整盘棋去判断。

    合法,但没人会这么下

    这是过去会漏网的那一类。识别错的着法,多半仍然是一步合法的着法。Nf3 认成 Nf5 可能走得通,规则挑不出毛病,PGN 导出得干干净净——而且是错的。

    但线索是有的,只不过它来自棋本身,而不是规则:误读之后,子力往往开始以真实对局里不会有的方式运动。皇后停在一个兵能吃掉它的位置上,而那个兵不吃。车白挂三步,双方都视而不见。

    现在 ScanChess 会在每一步的真实局面上做一次静态兑子评估,问一句:这一方是不是被白送了一个子甚至更多,而他没要?两道保险防止误报:

    • 被将军的一方没有在选择。 必须应将时放着白子不吃,那是被迫,不是荒谬。
    • 真正的弃子在被应对之后就不再「挂着」。 只有当这块子力整整一回合之后仍然可以拿——机会一直摆在那里,对手有时间去拿,却没拿——才会报出来。

    同一处的连续荒谬会收敛到它开始的那一步,所以一个挂了六个半回合的车只产生一个标记,不是六个。两步都会被标:把子送过去的那一步,和从旁边走过去的那一步。两步都不会被改写。 你看到的是一个琥珀色标记和它的理由,怎么处理由你决定。

    问得更好,而不是问得更多

    复核环节过去是把可疑的着法作为开放式问题交回来:我们读成了这样,应该是什么?这种问法很容易得到一个既不是你写的、在当前局面也不合法的答案。

    现在的问题是封闭的。在一个可疑的半回合上,ScanChess 取出当前局面全部的合法着法——通常三四十步——把每一步拿去和识别引擎给出的所有读法比对:最优读法和它的备选,各自按自己的置信度加权。得到的是一份既在此处合法、又贴近墨迹的着法短名单,问题于是变成了选择题。

    有两条规则保证答案是可信的:不在名单上的答案会被丢弃,而不是被接受;如果被接受的这些选择合在一起会让整盘棋走不通,那么它们会被整体撤销,而不是留下一盘修了一半的棋。

    双方都记了谱的时候

    一盘正式棋里,有两个人写下了同一串着法。那是对同一盘棋的两次独立读取,而两者之间的分歧本身就是信息。

    现在 ScanChess 可以合并两张记谱单。两条着法流是对齐的,不是硬拼在一起的,所以一方漏记一行只会让对齐往后错一格,而不会让之后每一步都变成冲突。两边一致的地方,置信度提高一半——两只手写下、两次读出的 Nf3,比一次要有力得多。两边不一致的地方,置信度下降,两种读法都作为候选留给复核环节,并记住各自来自哪张单子。

    有意没有改的部分

    自动纠错依然是关闭的。 扫出来什么就显示什么;棋走不下去的地方,标出断掉的那一步;有疑点的地方,标出来并说明理由。上面这些做的是让标记更聪明、让问题更短,没有任何一项会悄悄改你的棋谱——因为一份被默默「修好」的记谱单,比一份你知道要检查的记谱单更糟。

    最好的输入依然是一张清晰的照片,我们的拍摄清单只要三十秒,胜过本文里的任何算法。但当墨迹真的两可时,扫描记谱单失败得更有用了:它会告诉你它怀疑哪一步、为什么怀疑,以及局面允许它是什么。

    几秒内把你的棋谱变成 PGN

    上传一张照片,让 ScanChess 完成转录。

    扫描你的棋谱

    继续阅读