jieba-analysis(Java 版结巴分词)
jieba-analysisJava 版结巴分词虽然只有 9 个核心类但它完整复现了 Python jieba 的三大分词模式并高效实现了中文分词的核心流程。下面我用技术拆解 代码逻辑映射的方式告诉你它到底做了哪些事✅ 一、整体目标输入一段中文文本 → 输出一个词语列表带位置信息例如String text 小明硕士毕业于中国科学院;List tokens segmenter.process(text, SegMode.INDEX);// 输出: [小明, 硕士, 毕业, 于, 中国, 科学, 学院, 中国科学院]背后经历了 词典匹配 统计模型补漏 路径优化 三步。 二、核心工作流程对应你的 9 个类1️⃣ 加载词典WordDictionary- 干的事- 读取 dict.txt格式词语 词频 词性- 构建 双数组 Trie 树Double-Array Trie实现 O(1) 前缀查询- 同时加载 HMM 所需的四个概率文件- prob_start.txtB/M/E/S 初始概率- prob_trans.txt状态转移概率- prob_emit.txt发射概率- hmm_model.bin可选- 为什么重要Trie 树让“从任意位置开始能匹配哪些词”变得极快这是性能基石。2️⃣ 生成 DAG有向无环图JiebaSegmenter Node- 干的事- 对输入文本每个字符位置 i用 WordDictionary 查出所有以 i 开头的词- 构建 DAG节点是字符位置边是可能的词语如位置0→2 表示“小明”- 数据结构Map dag new HashMap();// key起始位置, value所有结束位置- 例子“中国科学院” → DAG 包含路径0→1(中), 0→3(中国), 0→6(中国科学院), 2→3(国)... 这一步把“所有可能的切分方式”编码成一张图。3️⃣ 计算最优路径动态规划DP- 干的事- 在 DAG 上跑 DP计算从每个位置到结尾的最大路径概率- 概率 词频来自 dict.txt的对数和避免浮点下溢- 关键公式route[i] max( log(freq(word)) route[j1] ) // for all j in dag[i]- 结果得到一个 route[] 数组记录每个位置的最佳切分终点。 这就是 精确模式cut_allFalse的核心——找最可能的词序列。4️⃣ 处理未登录词FinalSeg HMM Viterbi- 触发条件当 DAG 中某个片段没有匹配到任何词全是单字- 干的事1. 把连续单字交给 FinalSeg2. FinalSeg 调用 Viterbi 算法在 viterbi 包中实现3. 利用 HMM 的 B/M/E/S 四状态模型将单字序列重新组合成词- B: Begin词首- M: Middle词中- E: End词尾- S: Single单字词- 例子输入“阿巴斯”不在词典→ HMM 推断为 B-M-E → 合并为“阿巴斯”⚠️ 注意jieba-analysis 的 HMM 只用于处理连续单字不是全句重分析。5️⃣ 模式适配SegMode 控制输出粒度- INDEX 模式默认- 先按 DAG 最优路径切分- 再对长词做二次切分如“中国科学院” → 加入“科学”、“学院”- 适合搜索引擎提高召回率- SEARCH 模式- 同 INDEX在 jieba-analysis 中两者等价- OTHER 模式精确模式- 只输出 DAG 最优路径不做二次切分- 适合文本分析 这就是 Python jieba 的 cut() vs cut_for_search() 的 Java 实现。6️⃣ 结果封装SegToken- 干的事- 把每个词包装成 SegToken 对象包含- word: 词语本身- startOffset: 起始字符位置UTF-16- endOffset: 结束字符位置- 为什么重要支持 Lucene/Solr 集成需要位置信息做高亮、短语查询等。7️⃣ 辅助工具CharacterUtil Pair Hit- CharacterUtil判断字符类型中文/数字/英文/符号决定是否跳过或单独切分- HitTrie 树查询的返回状态完全匹配 / 前缀匹配 / 不匹配- Pair临时存储如词频率 三、完整调用链以 sentenceProcess 为例JiebaSegmenter segmenter new JiebaSegmenter();List tokens segmenter.sentenceProcess(小明去北京大学);// 内部流程1. WordDictionary.getSingleton().init() → 加载词典 HMM 模型2. CharacterUtil.cleanText() → 清理无效字符3. generateDAG() → 构建 DAG 图4. calc() → 动态规划求最优路径5. for each segment in path:if segment is single chars → FinalSeg.segment()6. wrap result into List✅ 四、总结这 9 个类到底做了什么类 核心职责 技术关键词JiebaSegmenter 总调度器 DAG 生成、模式选择、流程控制WordDictionary 词典引擎 Double-Array Trie、HMM 参数加载DictSegment / Hit Trie 节点与查询 前缀匹配、状态反馈Node DAG 节点 动态规划状态存储FinalSeg 未登录词处理器 HMM、Viterbi 解码SegToken 结果载体 词语 位置信息CharacterUtil 字符预处理 中英文判别、清洗Pair 临时数据结构 键值对存储 它没做所以代码少- 词性标注POS- 关键词提取TF-IDF/TextRank- 繁简转换- 句法分析- 深度学习模型 最终结论jieba-analysis 用 9 个类精准聚焦于“中文分词”这一件事通过- Trie 树高速词典匹配- DAG DP最优路径搜索- HMM Viterbi未登录词补全实现了 高性能、低内存、高兼容性 的工业级分词器。它的简洁不是“功能弱”而是恰到好处的工程取舍 —— 这正是它能在 Java 生态中广泛流行的原因。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2596360.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!