阅读:1720回复:9

合并用户码表

楼主#
更多 发布于:2025-12-06 14:35
灌水积分贴,合并用户码表逻辑
1、合并用户码表会将用户码表中的信息合并到主码表中;
2、当主码表和分词库中有相同的字词时,会将主码表中对应的字词删除;
3、执行“合并用户码表”时会对当前的“输入法”方案进行合并,不会影响其他“输入法”方案;
4、每执行一次“合并用户码表”时,只会对执行一次上面的判断逻辑,比如:
  1. 主码表中没有“祝愿”这个词,但在用户码表和分词库中都有这个词;
  2. 执行第一次”合并用户码表“时会将用户码表中的”祝愿“这个词合并到主码表中;
  3. 再次执行”合并用户码表“时会从主码表中删除”祝愿“这个词(因为这个词在分词库中已经有了)。

最新喜欢:

yanqianyanqia...
沙发#
发布于:2026-01-23 12:30
使用输入法自带的合并用户码表,发现了以下两点不太符合我习惯的地方。
1、合并拼音码表后,表头信息会改变。例如:会将辅助码表的配置从配置文件中写入码表文件;
2、会将词单字分开。
为了满足自定义格式,也就是保持表头不变,将单字和词放在一起这里提供一个手动合并码表的参考,使用的工具为awk和vim。这里提供三个脚本,一个是vim中去除重复行的脚本,另两个是用awk转换码表格式的脚本。三者配合即可手动实现”码表优化“和”合并用户码表“的功能。
码表格式1:
a 啊 阿 呵 腌 嗄 锕 吖
aba 阿坝 阿爸
abao 阿宝

码表格式2:
a 啊
a 阿
a 呵
a 腌
a 嗄
a 锕
a 吖
aba 阿坝
aba 阿爸
abao 阿宝

从格式1到格式2的awk脚本split.awk为:
{
    key = $1                   # 第一个字段是键
    for (i = 2; i <= NF; i++) { # 遍历剩余字段(合并后的值)
        print key, $i          # 输出键 + 单个值
    }
}

从格式2到格式1的awk脚本script.awk为(这也就是“码表优化”功能):
BEGIN {
    FS = "[ \t]+"  # 字段间可能有多个空格或制表符
}
 
{
    key = $1
    value = ""
    for (i = 2; i <= NF; i++) {
        value = value (i == 2 ? "" : " ") $i
    }
    if (!(key in key_index)) {
        # 第一次见到这个键,记录索引
        key_index[key] = ++key_count
        order[key_count] = key
        # 初始化值(不加前导空格)
        values[key] = value
    } else {
        # 追加值,确保格式整洁
        values[key] = values[key] " " value
    }
}
 
END {
    # 按原始顺序输出
    for (i = 1; i <= key_count; i++) {
        key = order[i]
        print key, values[key]
    }
}
awk的命令格式为:awk -f script <filename>
vim中去除重复的行
function! Remove()  " 不改变文件顺序删除重复靠后的行
  let i=1|g/^/s//\=i.'|'/|let i+=1
  sort! /^\d\{-}|/          " 将行号后面的内容进行倒序排列
  g/^\d\{-}|\(.*\)$\n\d\{-}|\1$/d   " 删除与下一行内容相同的行
  sort n
  %s/\d\{-}|//
endfunction
板凳#
发布于:2026-05-18 21:21
Hi,
请问你是在Linux下面执行awk的命令么?
码表文件是GB18030编码么?还是先将码表转为utf-8再处理的?
地板#
发布于:2026-05-18 22:32
主码表和分词库都有的词,这个词应该还是标记为主词库的更合适对吧。
也就是除了用户码表外,内部处理时不应修改所属词库。
4楼#
发布于:2026-05-19 08:30
看上去“盘古大陆”是按测试的情况写出来分享的,所以周大程序的处理逻辑实际上不一样?
我在论坛中搜索了下,现有帮助说明中也没有找到关于「码表优化」和「合并用户码表」的说明。
5楼#
发布于:2026-05-19 08:54
yanqian:Hi,
请问你是在Linux下面执行awk的命令么?
码表文件是GB18030编码么?还是先将码表转为utf-8再处理的?
回到原帖
我是在windows系统上执行的awk命令。对码表文件编码没要求,gb18030、utf-8都可以。需要注意的是码表文件的换行符,Linux默认使用的是"\n”作为换行符,Windows 默认使用的是"\r\n"。如果处理后发现没有达到预期的结果就检查一下是不是换行符导致的问题。

附:在Vim中强制设置文件格式:
:set ff=unix # 换行符设置为Unix格式
:set ff=dos # 换行符设置为为Windows格式
6楼#
发布于:2026-05-19 09:03
dgod:主码表和分词库都有的词,这个词应该还是标记为主词库的更合适对吧。
也就是除了用户码表外,内部处理时不应修改所属词库。
回到原帖
我也赞同这个逻辑。上面对词库的处理逻辑是当时使用输入法自带的“码表优化”和“码表合并”功能观察到的现象。发这个帖子的原因主要是软件中处理码表时要求码表格式必须是gb18030,但我码表中用到了utf-8。
7楼#
发布于:2026-05-19 09:09
yanqian:看上去“盘古大陆”是按测试的情况写出来分享的,所以周大程序的处理逻辑实际上不一样?
我在论坛中搜索了下,现有帮助说明中也没有找到关于「码表优化」和「合并用户码表」的说明。
回到原帖
描述的逻辑确实是当时观察到的现象。码表优化我当时观察到的现象是把码表从上面的“格式2(不一定排序整齐)”变为“格式1(严格按照字母顺序排列)”。
8楼#
发布于:2026-05-19 09:26
盘古大陆:我是在windows系统上执行的awk命令。对码表文件编码没要求,gb18030、utf-8都可以。需要注意的是码表文件的换行符,Linux默认使用的是"\n”作为换行符,Windows 默认使用的是"\r\n"。如果处理后发现没有达到预期...回到原帖
谢谢分享,awk在windows下能自动识别编码处理,这还挺好的。
顺便提下,之前在Linux下(默认locale是utf-8)忘记转换文件编码,试过用grep直接处理GB18030编码的文件,导致卡死,所以在Linux下建议应该是要先转换下编码比如转为UTF-8,再用相关文本处理工具处理可能问题少些。
9楼#
发布于:2026-05-19 10:00
yanqian:看上去“盘古大陆”是按测试的情况写出来分享的,所以周大程序的处理逻辑实际上不一样?
我在论坛中搜索了下,现有帮助说明中也没有找到关于「码表优化」和「合并用户码表」的说明。
回到原帖
应该和他测试的情况一致,但这不太好,我后续应该会修改
游客

返回顶部