Skip to content

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation


No dictionary. No data-driven model. Just white-box algorithm for 中文实体抽取 & 中文专用分词器

项目团队介绍

技能 名称 职责
🤦‍♀️能工智人 💡🔬🎨🧩🛠️⚖️📝📈 y-in-gb 原型设计、算法研发、测试评估、指派调研与编程任务
🤖人工智能 🛠️ deepseek-v4-pro 一级编程辅助
🤖人工智能 🔍📝🛠️🎨 deepseek-v4-flash 一级调研辅助、二级编程辅助

💫 核心优势

  • 极速轻量:专为超长文本、企业级知识库设计,纯 CPU 运算,实测处理速度达 5万字/秒
  • 低维护成本:无需维护任何专业术语词典,无需调用 Embedding 模型,所有计算完全基于用户输入的文本数据
  • 白盒可解释:每一个切分边界与关联判定均有明确依据

🌲 适用领域与场景

  • 垂直领域泛化性:算法与语义无关,仅依赖统计特征,可丝滑迁移至文学、法律、医药生物、工业制造等任意领域
  • AI场景:企业知识库精准检索、专业术语自动发现与对齐、LLM 推理前的分词策略等

🚀 极速安装

  • Python3.10+

算法只需调用Python 标准库,无需额外pip install,具体说明如下:

是否为Python标准库 说明
sys 系统相关参数和函数,如命令行参数等
re 正则表达式操作
collections 特殊容器数据类型,如 Counterdefaultdict

📜 研究价值与未来影响

1. 重构垂直领域 LLM 的 Tokenizer 范式

当前主流大语言模型(LLM)的 Tokenizer 多基于公开语料(如维基百科、新闻)预训练,且内部逻辑为黑盒状态。这导致在垂直领域中,高频专有名词极易被割裂为无意义的碎片化子词(Sub-word),造成语义失真

  • 算法突破:本算法实验了仅依赖输入语料自身的字符频次统计与邻接聚合模式,即可在无外部模型辅助的情况下,自动推导出该领域的最优语义原子单元
  • 颠覆性可能:本算法有望发展为一种白盒化、可热插拔的领域动态 Tokenizer。未来垂直领域 LLM 可在训练或推理前置环节,利用本算法重新编码输入序列,从根本上改变 Transformer 架构的注意力分布,提升领域理解精度

2. 重塑 RAG 的知识召回路径

传统 RAG 体系严重依赖稠密向量检索(Dense Retrieval),需将文档切片后通过 Embedding 模型转为高维向量。这种模式存在三大痛点:数据偏差、计算资源消耗巨大、长尾实体召回率低

  • 算法突破:本算法将文本重新定义为由“关键字符锚点”及其“强关联邻接片段”组成的关系结构
  • 颠覆性可能:未来的知识检索或将完全专为“Grep式精准定位”,检索时,系统只需扫描目标实体与其关系结构,即可在毫秒级内完成证据片段(Evidence Chunks)的召回,从而绕过庞大的向量数据库与 Embedding 模型,实现极度轻量、完全可解释的检索模式

📖 功能简介与示例

🏷️ 中文实体抽取

Nodicta Entity Extractor V0 提供对中文小说/文章的分章节、多粒度统计以及高频字符的左右邻接语境分析功能。支持从全文、章节、段落、行、句子、半句(子句)六个粒度统计中文字符频次,并能自动挖掘与高频字符存在强关联的上下文字符。

功能概览

  1. 自动分章:识别以“第X章”或“第X回”开头的标题,将文本分割为章节。
  2. 多粒度统计
    • full:全文
    • chapter:章节
    • paragraph:段落(以空行分隔)
    • line:行(以换行符分隔)
    • sentence:句子(按。!?;!?;等结束标点分割)
    • clause:半句/子句(按,、:;等内部标点再细分)
  3. 字符频次统计:对每个单元统计中文字符总数、唯一字符数及频率列表。
  4. 基于高频字符语境分析的中文实体抽取

依赖

  • Python 3.10+
  • 仅使用标准库:sys, re, collections

命令行参数

python nodicta-entity-extractor-v0.py <输入文件路径> [--unit <粒度>] [--analyze-top-n <N> | --analyze-all]

参数 说明
输入文件路径 必需,UTF-8 编码的 txt 文件
--unit <粒度> 可选,指定统计粒度,可选值:full, chapter, paragraph, line, sentence, clause,默认值为 paragraph
--analyze-top-n <N> 可选,执行语境分析,只分析全文出现次数最高的前 N 个字符(N 为正整数)
--analyze-all 可选,执行语境分析,分析所有出现次数 >1 的字符

注意--analyze-top-n--analyze-all 互斥,不能同时使用。若不提供任何分析参数,则默认执行统计。

使用示例

1. 基本统计(默认段落粒度)

python nodicta-entity-extractor-v0.py 小说.txt

输出示例:

识别到 20 章
统计粒度:段落
index 0: [第1章、第1段] 中文字符总数=72, 唯一字符个数=61
  唯一字符频率列表: [('的', 6), ('着', 4),...]
  (共 61 个唯一字符,仅显示前 20 个)
  ...
所有单元合并唯一字符频率列表(共 2547 个唯一字符,显示前 20 个):
[('的', 1988), ('了', 1277), ('不', 687), ('一', 657), ('儿', 554),...]
(其余 2527 个未显示)
2. 按句子粒度统计

python nodicta-entity-extractor-v0.py 小说.txt --unit sentence

3. 分析前 N 个最高频字符的语境,显示潜在实体

python nodicta-entity-extractor-v0.py 小说.txt --analyze-top-n 5

输出会依次显示每个目标字符的:

  • 出现总次数
  • 包含它的半句数量
  • 左/右部分的字符频率列表
  • 关键关联字符及其占比

输出示例:

识别到 20 章
=== 前 5 个最高频字符的语境分析 ===

【字符:的】 出现总次数:1988
包含该字符的半句数量:1803
具体半句位置:
左部分字符频率列表(1073 个唯一字符):
[('了', 322), ...]
  (其余 1053 个未显示)
右部分字符频率列表(994 个唯一字符):
[('了', 215), ('的', 185), ...]
  (其余 974 个未显示)
左右部分均无关键字符,将 '的' 标记为非关键字符。(后续循环将忽略该字符)
...
【字符:儿】 出现总次数:...
左部分关键字符(判定条件:半句内占比 ...):
  - ... (当前部分频率=499):半句内占比 = 499/554 = 0.90,全文占比 = 499/501 = 1.00 [判定依据:half_ratio]
  - ... (当前部分频率=498):半句内占比 = 498/554 = 0.90,全文占比 = 498/524 = 0.95 [判定依据:half_ratio]
右部分关键字符:
  无
...
=== 分析结果汇总 ===
非关键字符列表(左右均无关键字符的目标字符):['一', '不', '了', '的']
关联字符记录(共 2 条):
  目标字符='儿' 来源='left' ... 半句内占比=499/554=0.90 全文占比=499/501=1.00 [判定依据:半句内占比]
  目标字符='儿' 来源='left' ... 半句内占比=498/554=0.90 全文占比=498/524=0.95 [判定依据:半句内占比]
4. 分析所有出现超过 1 次的字符,显示潜在实体

python nodicta-entity-extractor-v0.py 小说.txt --analyze-all

输出说明

统计模式输出
  • 每个单元一行:index <编号>: [位置信息] 中文字符总数=..., 唯一字符个数=...
  • 下方显示该单元的字符频率列表(按频次降序,默认显示前20个,可修改代码中 max_freq_print 参数)
  • 最后汇总所有单元的合并频率列表
分析模式输出
  • 对每个目标字符输出:
    • 出现总次数、包含该字符的半句数
    • 左/右部分字符频率列表(显示前20个)
    • 判定出的关键关联字符,附带半句占比和全文占比
  • 最终汇总:
    • 非关键字符列表(左右均无强关联的字符)
    • 所有关联字符/实体记录

自定义调整

  • 修改 max_freq_print 默认值(代码中为20)可控制频率列表显示的条目数
  • 修改 split_chapters 中的标题正则表达式可适配不同章回格式

❗️注意事项

  • 输入文件必须为 UTF-8 编码(支持 utf-8-sig,可自动处理 BOM)
  • 分章依赖于标题行格式,若文本无章回标题,则整个文本视为一个章节
  • 粒度分割基于标点,标点符号(如引号、省略号)在句子/半句切分前会被移除,以避免干扰
  • 分析模式固定基于半句(clause)粒度

✂️ 中文专用分词器

Nodicta Tokenizer V0 基于字符左右邻接统计频次数字模式分组算法,对中文文本中的每个半句(子句)进行自动切分,在合适位置插入分隔符 |

分词器不依赖预置词典,而是利用字符在全文中出现的总频次,结合左右邻字符的出现情况,通过检测频次数字序列的多种组合模式,动态决定切分边界,从而将半句拆分为有意义的内部片段。

功能概览

  1. 自动分章:识别“第X章”或“第X回”标题,将文本划分为章节。
  2. 全文中文字符统计:对每个中文字符,统计其出现总次数,以及它在所有半句中左侧相邻字符和右侧相邻字符的频次。
  3. 基于统计的半句切分
    • 对每个半句(以逗号、顿号等内部标点切分),提取其中每个字符的总频次,形成一个数字序列。
    • 对数字序列应用分组算法,识别特定的数值模式,将序列切分为若干连续片段。
    • 每个片段对应半句中的一个子串,最终用 | 连接所有片段,输出切分结果。
  4. 输出结果带位置信息:每个切分后的半句都会显示其章节、段落、行、句子、半句序号,方便溯源。

依赖

  • Python 3.10+
  • 仅使用标准库:sys, re, collections

命令行参数

python nodicta-tokenizer-v0.py <输入文件路径>

参数 说明
<输入文件路径> 必需,UTF-8 编码的 txt 文件

使用示例

python nodicta-tokenizer-v0.py 小说.txt

输出示例:

识别到 20 章

--- 半句分割结果(加入 '|' 表示切分) ---
[第1章、第1段、第1行、第1句、第1个半句] 昏暗的|殿阁内
[第1章、第1段、第1行、第1句、第2个半句] ...

注意:实际输出取决于输入的文本内容和算法判断。

自定义调整

  • 修改 group_indices 函数参数的 max_char_in_split(默认5),控制每个片段最多包含多少个字符
  • 修改 split_chapters 中的 title_pattern 以适配其他标题格式

❗️注意事项

  • 输入文件必须为 UTF-8 编码(支持 utf-8-sig
  • 算法对半句的定义基于内部标点(逗号、顿号、分号等),若文本标点不规范可能影响半句切分质量
  • 由于算法完全基于统计运算,建议输入文本不少于1万字。对于超大型文本(数千万字),算法需遍历所有字符及半句可能耗时较长,建议先截取部分文本进行测试

🦾 Agent Skill 支持

  1. 选择任意Agent工具 (e.g. Deepseek Harness, Codex, Claude Code, Copilot, Open Code),调用pro级别的大语言模型

  2. 输入本仓库的README.md和2个.py作为上下文,让模型配置Skill


🏆 致敬 Acknowledgements

许可证

MIT © 2026 y-in-gb

About

No dictionary. No data-driven model. Just white-box algorithm-based entity extractor 中文实体抽取 & tokenizer 中文专用分词器

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages