spencermountain/compromise

modest natural-language processing

compromise – 轻量级 JavaScript NLP 库

是什么compromise(原名 nlp-compromise)是一个小型、快速、纯 JavaScript 的库,可将原始英文文本转换为可操作的数据结构。它专注于实用的规则基础处理,而非深度学习,提供分词、词性标注、词干提取以及一些高级辅助功能(数字、日期、缩写等)。

为何重要 – 对于许多面向 Web 的项目,你不需要引入几百兆的模型,就能实现快速、即时的语言处理。compromise 正是为此而生:最小化后的包体积约为 250 KB,可在浏览器或 Node.js 中运行,每秒可处理约 1 MB 的文本。

主要功能(如 README 所述)

  • 三层 APIcompromise/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.mddocs/match-syntax.md 等)和一系列 Observable 笔记本,展示性能、内部机制和标签图。


所有陈述均直接取自仓库的 README;未添加任何外部主张。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目