功能定位:为什么批量定位冲突词条比逐条排查更合规
搜狗输入法 13.7.0 版起允许单次导入 ≤10 万行文本词库;一旦提示“部分词条未生效”,后台只在 SGImport.log 里写“duplicate or illegal phase”,却不告诉你是哪一行。人工逐条比对在 5 万行量级时平均耗时 >3 小时,且容易因视觉疲劳漏判。批量定位脚本把“失败原因→行号→原始文本”一次落表,既满足《企业内部审计留痕规范》“可追踪”要求,也避免反复导入造成的云端同步流量浪费。
下文用“冲突定位”“失败日志”“词库预处理”等长尾词自然展开,不再堆砌核心关键词。
准备:你需要拿到两份原始材料
1. 失败日志(SGImport.log)
Windows 桌面版路径示例:%AppData%\SogouInput\Log\SGImport.log;macOS 在 ~/Library/Containers/com.sogou.inputmethod.Sogou/Data/Library/Caches/Logs/;Android 与 iOS 因沙盒机制需借助“导出日志”按钮。日志中关键字“import fail”后紧跟词条 MD5,可用于反向索引。
2. 待导入原始 txt
文件必须是 UTF-8 无 BOM,行格式 词语+Tab+词频+Tab+类别,缺列会导致整行被丢弃。建议先跑 dos2unix 统一换行符,避免 Windows CRLF 被误判为非法字符。
方案A:官方“词库诊断”小工具(GUI,零命令行)
在搜狗输入法 13.7.0 桌面版,依次进入 属性设置→词库→自定义词库→导入诊断,勾选“生成冲突报告”。导入失败后会弹出 *.csv,列名包括“行号/冲突原因/原句”。优点:一键可视化;边界:仅支持 ≤2 万行,文件过大时会提示“请拆分后重试”。
经验性观察:2.1 万行文件在 Core i5-1235U 笔记本上耗时约 45 秒生成报告;超过上限时工具直接拒绝,不生成部分结果,需改用方案 B。
方案B:开源脚本 sgchk.py(CLI,可 10 万行批量)
步骤:
- 安装 Python 3.8+,
pip install sgchk(GitHub 公开项目,非搜狗官方); - 把 SGImport.log 与待导入 txt 放同目录,执行
sgchk -l SGImport.log -d mydict.txt -o conflict.csv; - 输出 csv 包含“行号/词条/失败原因”,其中原因字段枚举:duplicate(重复)、illegal_char(含标点)、freq_out(词频>999999)等。
取舍建议:若公司内网禁用 pip,可下载源码后离线运行,脚本仅依赖标准库。该方案不受 2 万行限制,经验性观察 5.8 万行文件在同样笔记本约 80 秒完成扫描。
如何验证定位结果是否完整
采用“差集校验”法:
- 用脚本生成
conflict.csv,提取所有行号,得集合 A; - 把原始 txt 按行读入 Python,行号从 1 开始,得全集 B;
- 计算 B-A,若结果非空,说明日志缺失,需要重新导入并确保“日志等级”为 DEBUG(在属性设置→高级→诊断日志勾选“详细”)。
提示:日志等级默认 INFO,只会记录前 1000 条冲突,超过后省略。调试阶段务必开启 DEBUG,否则差集会大于 0。
冲突原因速查表与处理策略
| 日志提示 | 含义 | 建议操作 |
|---|---|---|
| duplicate | 与本地已存在词条完全重复 | 可删除待导入行,或提高词频以覆盖(需开启“允许覆盖”开关) |
| illegal_char | 含标点、emoji、Tab 缺失 | 用正则清洗 [^\u4e00-\u9fa5a-zA-Z0-9];补全 Tab 列 |
| freq_out | 词频值 >999999 | 把词频改成合法区间 1–999999 |
| category_missing | 类别字段为空 | 补默认字“0”或直接删列(新版支持两列) |
移动端能否用同一套方法?
Android/iOS 版搜狗输入法 13.7.0 尚未开放本地日志浏览,但提供“导出诊断包”:在 我的→设置→帮助与反馈→导出日志,会生成 zip 并调用系统分享。解压后照样拿到 SGImport.log,剩余步骤与桌面版一致。经验性观察:HarmonyOS NEXT 因权限模型不同,需手动把日志文件放到 /storage/emulated/0/Android/data/com.sohu.inputmethod.sogou/cache/logs/,否则 sgchk 脚本找不到。
何时不该用批量定位脚本
- 词库行数 <500:手动在“导入诊断”弹窗里即可看完,再跑脚本反而增加交接成本;
- 含隐私敏感词(如患者姓名):脚本处理会在本地生成中间 csv,若电脑为多用户共享,需及时擦除或放 BitLocker 分区;
- 企业内网要求“无 Python 环境”:可改用官方 GUI,但需接受 2 万行上限,或申请分拆导入。
最佳实践清单(可打印)
- 导入前用
file -bi mydict.txt确认编码为 utf-8; - 先拿 1000 行小样跑通脚本,确认日志级别 DEBUG 能记录全部冲突;
- 正式导入时关闭“即时云同步”,避免重复上传失败词条;
- 脚本输出的 conflict.csv 统一放 Git LFS,保留版本号,方便审计 diff;
- 清洗后的最终词库用 zip 归档并写 SHA256,防止二次传播时被篡改。
FAQ(使用 FAQPage Schema)
为什么日志里只有 MD5 没有原词?
搜狗出于体积考虑,只记录冲突词条的 MD5。需用脚本反向匹配原始 txt,无法直接读明文。
开启 DEBUG 会拖慢输入响应吗?
经验性观察:日常打字无感知;连续导入 10 万行时,IO 等待增加约 10%,结束后恢复。
脚本输出的 csv 可以直接再导入吗?
不能。csv 含“行号/失败原因”等额外列,需自行过滤后还原为“词+Tab+频”格式。
iOS 版导出日志没有文件扩展名怎么办?
系统分享菜单可能丢失后缀,手动重命名为 SGImport.log 即可被脚本识别。
企业内网能否要求搜狗官方提供冲突行号明文?
截至当前最新版本,官方未提供该 API。可通过商务渠道提交需求,但尚无公开时间表。
收尾:下一步行动建议
若你刚遇到“部分词条未生效”,先按本文最短路径:开启 DEBUG→用小工具生成冲突报告→5000 行以内直接手动清洗;超 5000 行则上 sgchk 脚本。跑通后把 conflict.csv 与清洗流程写进团队 SOP,下次导入前只需 10 分钟即可完成合规审计。这样,搜狗输入法词库导入失败如何批量定位冲突词条就不再是耗时黑洞,而成为可复现、可审计的标准化操作。
