spencermountain/compromise
modest natural-language processing
compromise – 轻量级 JavaScript NLP 库
是什么 – compromise(原名 nlp-compromise)是一个小型、快速、纯 JavaScript 的库,可将原始英文文本转换为可操作的数据结构。它专注于实用的规则基础处理,而非深度学习,提供分词、词性标注、词干提取以及一些高级辅助功能(数字、日期、缩写等)。
为何重要 – 对于许多面向 Web 的项目,你不需要引入几百兆的模型,就能实现快速、即时的语言处理。compromise 正是为此而生:最小化后的包体积约为 250 KB,可在浏览器或 Node.js 中运行,每秒可处理约 1 MB 的文本。
主要功能(如 README 所述)
- 三层 API –
compromise/one(分词器)、compromise/two(词性标注器与语法解释器)、compromise/three(短语级工具)。你可以仅加载所需层级。 - 标签集 – 内置 83 个标签(如
#Verb、#Noun、#FirstName)。标签具有层级结构,可通过debug()或verbose('tagger')检查。 - 匹配语法 – 一种微型语言(
doc.match('#Adjective of times'))允许你使用类似正则表达式但能识别标签的模式查询文档。 - 便捷转换 – 改变时态(
doc.verbs().toPastTense())、名词复数化、展开/缩写缩写词、加减数字等。 - 数据提取 –
doc.json()返回结构化表示(词汇、归一化形式、计算出的元数据如音节数、金额、分数)。 - 可扩展性 – 可插入额外模块,如
compromise-speech用于音节计数。 - 客户端就绪 – 可通过 CDN 从
<script>标签加载,轻松添加到静态页面中。
典型用例
- 在将数据发送到大型 AI 流水线前,进行简单的文本清洗或归一化。
- 构建需要快速意图识别但无需重型模型的聊天机器人或语音助手。
- 实时生成或编辑内容(如自动名词复数化、动词转过去时)。
- 在 Web 应用中从用户生成的文本中提取结构化信息(数字、日期、地点)。
优势
- 体积小、速度快 – 包体积极小,可实现每按键一次的实时运行。
- 零依赖、纯 JS – 只要支持 JavaScript 的环境即可运行。
- 确定性 – 基于规则的输出可预测,适用于模板化和规则驱动的代理。
- 模块化 – 仅加载所需层级,保持最小体积。
局限性
- 准确率权衡 – README 承认其“不如你想象的聪明”;在模糊或领域特定文本上,性能无法与现代基于 Transformer 的解析器相比。
- 以英语为中心 – 核心库针对英语;其他语言为独立分支(法语、德语、意大利语、西班牙语),可能滞后。
- 规则基础 – 除非手动扩展词典,否则无法学习新模式。
快速上手
npm install compromise # 或使用 CDN 脚本标签
import nlp from 'compromise'
let doc = nlp('she sells seashells by the seashore.')
console.log(doc.verbs().toPastTense().text()) // "she sold seashells by the seashore."
进一步阅读 – 仓库自带丰富的 Markdown 文档(docs/api.md、docs/match-syntax.md 等)和一系列 Observable 笔记本,展示性能、内部机制和标签图。
所有陈述均直接取自仓库的 README;未添加任何外部主张。
相关
- 项目
- 项目
- 项目
- 项目
- 项目