阅读:630回复:1

合并用户码表

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

返回顶部