Parsr SeparateWordsModule 单词拆分模块深度解析:从标点粘连到干净词序列
后端数据工程【免费下载链接】ParsrTransforms PDF, Documents and Images into Enriched Structured Data项目地址https://gitcode.com/gh_mirrors/pa/Parsr点击查看免费下载本篇技术指南以 Parsr 开源项目Transforms PDF, Documents and Images into Enriched Structured Data中的 Separate Words 模块 为核心讲解该处理模块如何修正被标点符号错误粘连的单词、其基于英文词典的动态规划拆分算法以及如何在 cleaner 流水线中启用它。读完本文你将掌握该模块的触发条件、核心算法细节、内置保护规则与局限性并能在自己的配置文件中正确使用separate-words模块。模块定位cleaner 流水线中的单词清洗工Parsr 的处理流水线由多个 processing module 串联而成每个模块对统一的文档表示Document执行一次特定操作产出新的合法 Document 后交给下一个模块继续处理见 Processing Modules 总览。Separate Words 模块在流水线中的职责非常单一——分离那些被标点符号错误粘连在一起的单词。在 PDF 文本抽取如 pdfminer、pdfjs或 OCR 结果中常出现 hello.world、end. 这类单词与标点紧贴、甚至两个词被一个标点粘成单个 token 的情况。如果不加处理后续的段落合并、键值对识别、阅读顺序检测等模块都会因为这些脏 token 而降低准确率。SeparateWordsModule 正是为此设计的轻量清理步骤。从源码结构看该模块被注册在 Cleaner 的模块登记表cleaningToolRegister中SeparateWordsModule位于其中因此它与其他 20 余个处理模块一样可通过配置文件的cleaner数组按名称启用。工作原理三步走的词典查证 动态规划拆分模块的核心实现位于 SeparateWordsModule.ts其main方法在运行时对文档中每个 Word 执行如下逻辑遍历所有页面的所有 Worddoc.pages.forEach(p p.getElementsOfTypeWord(Word).forEach(...))即逐个取出每个词。判断是否值得处理仅当单词长度大于 8 个字符、且其小写形式不在英文词典中时才进入拆分流程——长度阈值用于避免频繁处理短词词典命中则说明该词本身是合法英文单词。调用拆分逻辑并回写通过addSpaces(word.toString() .)得到带空格的结果去掉末尾补上的.后写回word.content。源码注释里明确标注了Hack with dot to make it works——补一个点是为了让算法能正确处理以标点结尾的字符串。词典的构建与内置补充词模块启动时init()会把 NPM 包an-array-of-english-words导出的英文单词数组全部装入一个内存字典对象englishDictO(1) 查找。值得注意的是除了标准词典外源码还硬编码补充了abc、axa、allianz、chubb等品牌词以及s/’s两种撇号形式避免拆分时误伤专有名词与英文所有格。核心算法带记忆化的递归拆分与评分breakWords(str)是整个模块的算法核心可以理解为一种轻量动态规划标点强制切分用/\W/匹配非单词字符一旦遇到标点即视为天然分隔符直接切分并赋予固定分数 10然后递归处理剩余部分。词典/数字前缀匹配从左向右扫描每当str.substr(0, i 1)命中词典、或恰好是一段完整数字isNumber判定且下一个字符不是数字就把它作为候选词继续递归处理剩余部分。候选词的得分是其长度立方wordScore (i 1) * (i 1) * (i 1)——长词优先这保证 know.ledge 这类歧义输入更倾向于拆成较长的合法词而非一堆短词。记忆化MEMORY_SENTENCE每个子串的拆分结果都被缓存避免重复计算保证在多词长字符串上的效率。全局最优选取遍历所有候选拆分方案选择总分最高的方案作为最终结果——这是一个典型的以分数排序的贪心回溯组合。标点集合与保护规则addSpaces首先对输入做两类保护性短路不拆 URL以www或http:开头的字符串直接原样返回避免把链接切碎不拆邮箱同时包含和.的字符串直接返回保护电子邮件地址。随后它按.,,(();?!-#£$€¥元/$*:这一标点集合把字符串切成子段再对每个子段调用breakWords恢复空格。可见模块对标点列表的处理是标点独立成 token、词间补空格最终得到类似hello world .的干净序列。配置方式在 cleaner 数组中以名称启用该模块的模块名是 kebab-case 的separate-words见 defaultConfig.json 与源码中的public static moduleName separate-words。它的默认配置只有名称与描述两项没有任何可调参数。在 Parsr 的配置文件中结构详见 configuration.md 第 3 节 Cleaner Configcleaner数组的每一项可以是字符串或[模块名, 参数对象]二元组。启用本模块只需在cleaner数组中加一行{ version: 0.9, cleaner: [ drawing-detection, words-to-line-new, separate-words, lines-to-paragraph ] }由于模块没有可配置参数建议以纯字符串形式加入位置放在 words-to-line 类合并模块之后、段落合并之前较为合理——即先保证单词层面正确再做更高层结构推断。仓库根目录的 server/defaultConfig.json 展示了完整 cleaner 流水线的真实编排方式可供参考。需要说明的是当前仓库默认配置并未启用该模块它属于按需启用的清理工具在 Cleaner 中未知的模块名会抛出Module called xxx not found错误见 Cleaner.ts因此配置时必须严格使用separate-words这个名称。依赖与局限性明确的英语限定模块唯一的运行依赖是 NPM 包an-array-of-english-words在源码中以import * as englishDictArray from an-array-of-english-words方式引入其余处理全部在内存中完成无外部服务调用。正因词典是纯英语词表模块只能对英文文档生效非英语文本中的单词因无法命中词典要么不被处理长度 ≤ 8 或恰好在词典中要么可能被拆出错误的结果。这是其文档明确声明的限制。结合源码还可以补充以下隐性约束长度门槛长度 ≤ 8 的疑似粘连词会被直接跳过因此 end. 这类短 token 不会被处理词典边界不在词典中的专有名词、缩写、混合数字串可能无法正确拆分URL / 邮箱保护虽然防止了链接被破坏但也意味着这些 token 内的粘连不会被修正。源码验证建议若想进一步验证模块行为可以直接阅读 SeparateWordsModule.ts 的三个核心方法breakWords、addSpaces、isNumber并结合 Word 类型定义word.content支持字符串或字符数组两种形态、toString()会 trim理解数据写回方式。模块属于 Parsr 处理层 Module.ts 基类的实现之一符合输入 Document、输出 Document的流水线契约。总结Separate Words 模块是 Parsr 中一个轻量、零配置、纯英语的单词级清洗器通过词典查证 带记忆化的递归拆分 评分择优把标点粘连的词恢复为空格分隔的干净序列并内置 URL/邮箱保护将其正确加入 cleaner 流水线可有效提升下游段落、键值对与阅读顺序检测的输入质量。赞分享后端数据工程【免费下载链接】ParsrTransforms PDF, Documents and Images into Enriched Structured Data项目地址https://gitcode.com/gh_mirrors/pa/Parsr点击查看免费下载相关推荐单词拆分LeetCode 139序列 DP 解法全解析——LogicStack-LeetCode 仓库实战单词拆分LeetCode 139序列 DP 解法全解析——LogicStack LeetCode 仓库实战 本篇技术指南以 LogicStack LeetC教程文档PaddleNLP SKEP 模型全解析从配置、分词器到情感分析/序列标注实战PaddleNLP SKEP 模型全解析从配置、分词器到情感分析/序列标注实战 SKEPSentiment Knowledge Enhanced Pre t人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPApache Beam Splittable DoFnSDF深度解析从 Source API 到模块化、可拆分的 IO 连接器Apache Beam Splittable DoFnSDF深度解析从 Source API 到模块化、可拆分的 IO 连接器 Splittable Do大数据批处理流处理数据工程上一篇Bifrost三星固件下载工具3分钟学会免费下载官方固件的完整指南下一篇全面解析Dragonfly如何通过P2P架构实现5倍下载加速创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考