textlens vs text-readability vs natural:哪个 npm 包用于文本分析?
Source: Dev.to
请提供您希望翻译的正文内容,我将按照要求保留源链接并进行简体中文翻译。
功能比较
| 功能 | textlens | text‑readability | natural |
|---|---|---|---|
| 可读性公式 | 8(全部主要) | 7 | 0 |
| 共识等级 | 是 | 否 | 否 |
| 情感分析 | AFINN‑165 | 否 | 贝叶斯 + AFINN |
| 关键词提取 | TF‑IDF | 否 | TF‑IDF |
| 关键词密度(n‑grams) | 单词、二元组、三元组 | 否 | N‑grams |
| SEO 评分 | 是 | 否 | 否 |
| 文本摘要 | 抽取式 | 否 | 否 |
| 阅读时间 | 是 | 否 | 否 |
| 分词 | 基础(英文) | 基础 | 高级(多语言) |
| 词干提取 | 否 | 否 | Porter、Lancaster 等 |
| 分类 | 否 | 否 | 朴素贝叶斯、逻辑回归 |
| 音系学 | 否 | 否 | Soundex、Metaphone 等 |
| 依赖 | 0 | 0 | 1(webworker‑threads,可选) |
| TypeScript | 原生 | 否(DefinitelyTyped) | 否(DefinitelyTyped) |
| CLI | 是 | 否 | 否 |
| 捆绑大小(最小) | ~45 KB | ~8 KB | ~2 MB+ |
何时使用每个包
使用 textlens 的情况
您需要 内容分析 —— 可读性评分、情感检测、关键词提取、SEO 评分 —— 并且希望通过一个包、一个 API 完成所有功能。
const { analyze } = require('textlens');
const result = analyze(articleText);
console.log(result.readability.consensusGrade); // 7.2
console.log(result.sentiment.label); // 'positive'
console.log(result.keywords[0].word); // 'javascript'
console.log(result.readingTime.minutes); // 4
最佳适用场景: 博客文章质量检查、内容流水线、文档 lint、SEO 工具、内容管理系统。
使用 text‑readability 的情况
您 仅 需要可读性评分,其他功能不需要。它体积更小(约 8 KB 对比约 45 KB),只专注于一件事。
const rs = require('text-readability');
const grade = rs.fleschKincaidGrade(text);
const ease = rs.fleschReadingEase(text);
最佳适用场景: 对体积有要求的简单可读性检查,且不需要情感、关键词或其他分析。
权衡取舍: 没有统一的等级(需自行选择公式),包中不提供 TypeScript 类型,也没有 CLI。
使用 natural 的情况
您需要 超出文本分析的 NLP 功能 —— 带词干提取的分词、朴素贝叶斯分类、音标匹配、字符串距离算法或多语言支持。
const natural = require('natural');
const tokenizer = new natural.WordTokenizer();
const classifier = new natural.BayesClassifier();
classifier.addDocument('great product', 'positive');
classifier.addDocument('terrible service', 'negative');
classifier.train();
console.log(classifier.classify('good experience'));
最佳适用场景: 聊天机器人、搜索引擎、语言处理流水线、文本分类、拼写检查。
权衡取舍: 包体积大(约 2 MB 以上),完全没有可读性公式,也没有内置内容评分。它是通用的 NLP 库,而非内容分析工具。
可读性公式覆盖
| 公式 | textlens | text‑readability | natural |
|---|---|---|---|
| Flesch Reading Ease | 是 | 是 | 否 |
| Flesch‑Kincaid Grade | 是 | 是 | 否 |
| Gunning Fog Index | 是 | 是 | 否 |
| Coleman‑Liau Index | 是 | 是 | 否 |
| SMOG Index | 是 | 是 | 否 |
| Automated Readability Index | 是 | 是 | 否 |
| Dale‑Chall | 是 | 是 | 否 |
| Linsear Write | 是 | 否 | 否 |
| Consensus Grade | 是 | 否 | 否 |
textlens 添加了 Linsear Write 公式以及一个共识等级,该等级将所有等级公式的结果取平均,得到一个单一的数值。
情感分析比较
textlens 和 natural 都提供情感分析,但采用不同的方法。
textlens
使用 AFINN‑165 词典(约 3,300 个词,情感分值从 –5 到 +5)。它返回归一化分数、标签、置信度值,以及匹配的正面/负面词列表:
const { sentiment } = require('textlens');
const result = sentiment('The product is great but the support is terrible.');
console.log(result.label); // 'neutral' (mixed)
console.log(result.positive); // ['great']
console.log(result.negative); // ['terrible']
console.log(result.confidence); // 0.18
natural
提供基于 AFINN 的分析和朴素贝叶斯分类。贝叶斯方法是可训练的——你可以向它提供自己的标记数据:
const natural = require('natural');
const Analyzer = natural.SentimentAnalyzer;
const stemmer = natural.PorterStemmer;
const analyzer = new Analyzer('English', stemmer, 'afinn');
const score = analyzer.getSentiment(['great', 'but', 'terrible']);
// Returns a single number
结论: textlens 开箱即用提供更结构化的输出(标签、置信度、词列表)。natural 在需要可训练分类器时提供更大的灵活性。
关键词提取
textlens 与 natural 都支持 TF‑IDF 关键词提取。
textlens
const { keywords } = require('textlens');
const kw = keywords(articleText, { topN: 5 });
// [{ word: 'javascript', score: 4.2, count: 8, density: 2.1 }, ...]
natural
const natural = require('natural');
const TfIdf = natural.TfIdf;
const tfidf = new TfIdf();
tfidf.addDocument(articleText);
tfidf.listTerms(0).slice(0, 5);
textlens 通过单独的 density() 函数提供关键词密度百分比和 n‑gram(双词组、三词组)分析。natural 需要更多的设置,但提供了稳健的 TF‑IDF 实现。
支持多文档 TF‑IDF 原生
包大小和依赖
| 包 | 安装大小 | 依赖 | 最小包体积 |
|---|---|---|---|
| textlens | ~180 KB | 0 | ~45 KB |
| text‑readability | ~45 KB | 0 | ~8 KB |
| natural | ~10 MB+ | 多个 | ~2 MB+ |
如果你在构建无服务器函数或浏览器端工具,体积很重要。
- text‑readability 是最小的。
- textlens 是一个合理的折中。
- natural 较为庞大。
TypeScript 支持
textlens 自带原生 TypeScript 类型 — 无需 @types 包:
import { readability, ReadabilityResult } from 'textlens';
const result: ReadabilityResult = readability(text);
text‑readability 和 natural 通过 DefinitelyTyped 提供社区维护的类型(@types/text-readability、@types/natural),但这些类型可能会落后于新版本的发布。
重叠问题
在使用 textlens 之前,构建内容分析流水线需要安装多个包:
# 旧的做法
npm install text-readability # 可读性评分
npm install sentiment # 情感分析
npm install keyword-extractor # 关键词提取
npm install reading-time # 阅读时间
四个包、四套 API、四份文档。
textlens 将这些功能合并为一个包:
npm install textlens
const { analyze } = require('textlens');
const result = analyze(text);
// result.readability, result.sentiment, result.keywords, result.readingTime
您应该选择哪一个?
- 选择
textlens如果您想要从单个零依赖包获得可读性 + 情感 + 关键词 + SEO 评分。它端到端覆盖“内容分析”用例。 - 选择
text‑readability如果您只需要可读性评分并希望包体积尽可能小。 - 选择
natural如果您需要更广泛的 NLP 功能,如分类、词干提取、音标或多语言分词。它属于不同类别的工具。
没有错误的选择——这取决于您在构建什么。三者均采用 MIT 许可证并积极维护。
链接
披露: 我构建了 textlens。此比较反映了我的诚实评估,但请阅读其他包的文档并自行决定。
这是 textlens 系列 的一部分——关于 JavaScript 和 TypeScript 中文本分析的教程。