偏旁过滤改md库驱动: bot只查Unicode列码点, md缺失才回退硬编码范围, 维护只改md不改代码

This commit is contained in:
youpaishidifu
2026-08-01 13:22:24 +08:00
parent ba0e6e2450
commit 733f12c45b
2 changed files with 48 additions and 11 deletions
+40 -6
View File
@@ -41,18 +41,52 @@ import difflib
import os
# ⭐ 偏旁部首 Unicode 库:用于 OCR 碎片过滤
# CJK Radicals Supplement: U+2E80-U+2EFF
# CJK Radicals Extended: U+2F00-U+2FDF
# 这些字符在正常中文聊天中不会出现,OCR 拆字碎片才会有
_RADICAL_RANGES = (
# 单一数据源 = unicode_radicals.md(人和机器共用):
# - 人用肉眼看「偏旁」列维护
# - bot 启动时解析「Unicode」列(U+XXXX)构建码点集合,比对只看码点
# 维护方式:编辑 md 添加/删除行即可,无需改代码。
# 仅当 md 缺失/解析失败时才回退到硬编码码位范围(保底,正常不触发)。
_RADICALS_MD = os.path.join(os.path.dirname(os.path.abspath(__file__)), "unicode_radicals.md")
# 保底范围:CJK Radicals Supplement U+2E80-U+2EFF + Extended-A U+2F00-U+2FDF
_RADICAL_RANGES_FALLBACK = (
(0x2E80, 0x2EFF), # CJK Radicals Supplement
(0x2F00, 0x2FDF), # CJK Radicals Extended-A
)
def _load_radical_codepoints() -> frozenset:
"""从 unicode_radicals.md 解析「Unicode」列,返回码点集合。
行格式: | 亻 | U+2E80 | 单人旁 | 件→亻牛 | 件 |
Unicode 列必须是 U+XXXX / U+XXXXX 十六进制;解析失败的行跳过。
"""
cps = set()
try:
with open(_RADICALS_MD, "r", encoding="utf-8") as f:
for line in f:
m = re.search(r"U\+([0-9A-Fa-f]{4,5})\b", line)
if m:
cps.add(int(m.group(1), 16))
except OSError as e:
logger.warning(f"[ocr] 偏旁库 {_RADICALS_MD} 读取失败({e}),回退码位范围")
return frozenset()
if not cps:
logger.warning("[ocr] 偏旁库为空,回退码位范围")
return frozenset()
logger.debug(f"[ocr] 偏旁库加载 {len(cps)} 个码点 <- {_RADICALS_MD}")
return frozenset(cps)
_RADICAL_CODEPOINTS = _load_radical_codepoints()
def _is_radical_char(ch: str) -> bool:
"""检查字符是否为 CJK 偏旁字符(U+2E80-U+2FDF)。"""
"""检查字符是否为 CJK 偏旁字符。
优先查 md 库的 Unicode 码点(维护只改 md);
库未加载成功时回退到硬编码码位范围(保底)。
"""
cp = ord(ch)
return any(lo <= cp <= hi for lo, hi in _RADICAL_RANGES)
if _RADICAL_CODEPOINTS:
return cp in _RADICAL_CODEPOINTS
return any(lo <= cp <= hi for lo, hi in _RADICAL_RANGES_FALLBACK)
import subprocess
import json
+8 -5
View File
@@ -218,8 +218,11 @@
## 使用说明
1. bot 启动时读取此文件,解析偏旁表构建偏旁→补充字符映射
2. OCR 结果检测偏旁字符:
- 若偏旁有补充字符(非空)→ 将偏旁替换为补充字符,继续处理
- 若偏旁无补充字符(空)→ 整段丢弃,不进知识库
3. 维护方式:编辑此文件添加/删除偏旁条目,填写补充字符(若已知正确汉字),重启 bot 生效
1. 人机共用本文件:人用肉眼看「偏旁」列,bot 只看「Unicode」列(U+XXXX 码点)
2. bot 启动时解析「Unicode」列构建码点集合;OCR 文本逐字符比对码点:
- 码点对得上 → 该字符是偏旁,整段丢弃
- 码点对不上 → 正常内容,继续后续流程
3. 维护方式:编辑此文件添加/删除偏旁行(改「Unicode」列即生效),重启 bot 即可,无需改代码
4. 注意:「偏旁」列显示字符仅供人看,可能与普通汉字同形(如 土/大/日),
bot 以「Unicode」列码点为准,正常汉字码点(CJK 统一汉字区段)不会误判
5. 维护时不要在其他说明文字中写 U+ 开头十六进制(bot 会当作码点解析),只改表格行即可