04月29, 2019

搜狗输入法固定字序

解决拼音输入效率问题的关键

双拼在日常输入环境下比五笔更快已是不争的事实。而在其他写作工作中,例如写文档,因拼音重码率太高导致输入效率下降。解决拼音输入效率问题的关键在于如何提高选字效率。

动态调频是一个不好的设计。为什么这么说?如果我打同一个字,而它每次所在的位置不一样,那我每次都得看一下它到底在哪,然后按下相应的数字。很显然这样效率太低。

类似地,上下文调频也是一个不好的设计。它的功能是根据上一次输入的字词句决定这次的输入中,哪个字词句排在第一个。在人机交互得到革命性发展之前,输入法这种自作聪明的做法可以说是严重降低了输入效率。主要原因是它的正确率很低。在我看来,这一功能在达到99.99%正确率之前不应该被使用。事实上,根据上下文来调频在理论上就达不到这种正确率,你凭什么根据前面的信息就能认定我下面一定要打什么字呢?

因此,固定字序对提高选字效率很有帮助。但很显然目前流行的所有输入法都不支持自定义字序。

在搜狗输入法中如何解决

虽然本例中针对的是搜狗输入法,但在其他输入法应该也有类似的功能。

我之前在搞搜狗输入法日期时间加前导零的时候,发现这个自定义短语的功能还可以。我突然想到,只要我把所有字的都设置成自定义短语,不就可以固定字序了吗?

因此,我手动对常用的一千多个汉字规定了顺序,设置成自定义短语。设计了该列表(UTF-8编码)。使用了一段时间,感觉良好。

PS: 在搜狗输入法中,如果自定义短语与固定首位冲突(字不一样),则以固定首位优先,自定义短语排在后面。搜狗不会出现一个字词出现两次的情况

适配双拼

该表适用于全拼,如果是双拼,需要对按键做修改。我简单写了个php脚本进行处理,支持读取搜狗中的双拼方案对应输出。如下是读取了自然码方案:

<?php

$mp = array();
$fp = fopen('C:\Program Files (x86)\SogouInput\8.2.0.9094\ShuangPinSchemes\ZiRanMa.ini', 'r');
while (1) {
    $line = fgets($fp);
    if ($line == false || strstr($line, "[零声母音节的韵母]")) {
        break;
    }
    if (preg_match('/(\w+)\=([\w;])/', $line, $res)) {
        $mp[strtolower($res[1])] = strtolower($res[2]);
    }
}
$mp['a'] = 'a';
$mp['o'] = 'o';
$mp['e'] = 'e';
$mp['i'] = 'i';
$mp['u'] = 'u';
$mp['v'] = 'v';
$mp['b'] = 'b';
$mp['c'] = 'c';
$mp['d'] = 'd';
$mp['f'] = 'f';
$mp['g'] = 'g';
$mp['h'] = 'h';
$mp['j'] = 'j';
$mp['k'] = 'k';
$mp['l'] = 'l';
$mp['m'] = 'm';
$mp['n'] = 'n';
$mp['p'] = 'p';
$mp['q'] = 'q';
$mp['r'] = 'r';
$mp['s'] = 's';
$mp['t'] = 't';
$mp['w'] = 'w';
$mp['x'] = 'x';
$mp['y'] = 'y';
$mp['z'] = 'z';
fclose($fp);

$fp = fopen('C:\Users\fz\Desktop\sogou_input_custom_phrase.txt', 'r');
echo 'rq,3=#$year-$month_mm-$day_dd' . "<br>";
echo 'sj,3=#$year-$month_mm-$day_dd $fullhour_hh:$minute:$second' . "<br>";
while (1) {
    $line = fgets($fp);
    if ($line == false) {
        break;
    }
    list($quanpin, $info) = split(",", $line);
    $quanpin = trim($quanpin);
    $info = trim($info);
    $flag = 0;
    foreach ($mp as $key1 => $value1) {
        if ($key1 == $quanpin) {
            $flag = 1;
            echo $key1 . ',' . $info . "<br>";
            break;
        }
    }
    foreach ($mp as $key1 => $value1) {
        if ($flag) {
            break;
        }
        foreach ($mp as $key2 => $value2) {
            if ($flag) {
                break;
            }
            if ($key1 . $key2 == $quanpin) {
                $flag = 1;
                echo $value1 . $value2 . ',' . $info . "<br>";
            }
        }
    }
    if ($flag == 0) echo 'ERROR: ' . $quanpin . ' ' . $info . "<br>";
    // echo $quanpin . ' ' . $info . "<br>";
}
fclose($fp);

美中不足的是,搜狗不支持导入带分号;的自定义短语,因为在这个文件中分号会被认为是注释。因此有些双拼方案例如搜狗双拼方案就凉凉了。

拼音输入如何更快

解决方案一定是利用形码,这在智能ABC、自然码等中都有相关支持,但任何一款现代流行输入法都不支持,都喜欢搞人工智能。关键是你要做到有机结合,不能什么都靠算法。等技术发展了再修改侧重点也不迟。

个人认为双拼+固定字序+形码+字词/短句输入才能让拼音输入效率最大化。

题外话

目前流行的输入法还有很多伪功能,比如“智能调整数字后标点”。凭什么数字后就一定是半角字符.

我并不是反对输入法加上这些功能,只要你提供开关,就是好的做法。但是最新的搜狗已经去除了上下文调频的开关,这意味着你无法关闭这一功能。

通过手写一个字序表,我发现现代普通话有410左右个音节。

本文链接:https://debug.fanzheng.org/post/fix-character-order-in-sogou-input.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。