词频计数器,免费

分析文本以统计词频并识别最常出现的词。非常适合文本分析、内容研究和模式发现。

关于词频分析

词频是某个词在一段文本中出现的次数,是你能在一组文字上做的最简单的统计分析,然而它却开启了一整个学术领域。英文词频的实证研究始于George Kingsley Zipf,哈佛的一位语言学家,他 1935 年的著作 The Psycho-Biology of Language 和 1949 年的续作 Human Behavior and the Principle of Least Effort 记录下了如今被称为 Zipf 定律的事实:任何词的频率大致与它在频率表中的排名成反比。英文里最常见的词「the」在典型英文语料中大约占所有词元的 7%;第二常见的「of」约占 3.5%;第三常见的约占 2.8%。这一关系在几乎所有自然语言里都成立,对几乎所有文本类型(图书、报纸、转写的口语、代码注释、社交媒体)也都成立。它的反面同样成立:大多数词在任意一段文本里只出现一次或两次,无论文本多长都是如此。Zipf 把它归因于一种最省力原则:说话者最小化发音成本,听者最小化理解成本,平衡点是一种幂律分布。

第一份专为频率分析设计的计算语料库是 Brown Corpus,由 W. Nelson Francis 和 Henry Kučera 在布朗大学编纂,于 1961 年发布。它收录来自 500 个散文样本的 1,014,312 个词元,涵盖 15 个体裁(报纸报道、小说、宗教类写作、科学论文、流行学问、政府文件等),每个样本 2,000 词。Brown Corpus 是英语实证语言学的基石,每一项现代英文词频研究都直接或间接以它为基础。英国版的对应物 LOB Corpus(Lancaster-Oslo/Bergen)于 1976 年发布,结构相同,针对英式英语。今天工业规模的语料(取自 800 多万册书的 Google n-gram 数据、140 亿词规模的 iWeb Corpus、数千亿词规模的 OSCAR 网爬语料)方法论上都可以一路追溯到 Brown。

停用词:概念与词表

不做停用词过滤的频率分析会被功能词占据(冠词、介词、连词、助动词)这些词几乎在每个句子里都出现,却几乎不带主题意义。「stop words(停用词)」这一术语由 Hans Peter Luhn 在 1958 年的论文 «The Automatic Creation of Literature Abstracts» 中提出,该文写于 IBM Research 的 IBM 704 上。Luhn 把它们叫作「noise words(噪音词)」,它们太普通,掩盖了更具主题信息量的实词。现代的停用词表仍然相当小。Python 库 NLTK 的英文停用词表有 179 词;spaCy 的约有 326 词。具体规模取决于哲学:NLTK 偏保守(只放最普世的功能词);spaCy 更激进(包含许多常见动词与代词)。其他语言需要自己的列表,而这些列表本身也更难编。德语有很多复合词,会分解成更短的常见词块。中文、日语和泰语完全没有空格分隔,因此在问「这个词的频率是多少」之前,必须先做分词(决定词的边界)这比英文那种直白的「按空格分」要深刻得多。本工具的停用词表针对英文;对于非英文文本,case-insensitive 的原始频率输出会比停用词过滤版本更有用。

什么算作「一个词」,分词问题

数词听起来简单,直到你要严格指明什么才是「一个词」。«don't» 是一个词还是两个(do + n't)?«state-of-the-art» 是一个词还是四个?URL example.com 算一个词吗?U.S.A. 怎么算,是三个词、一个词、还是要归一化成 USA 的一个词?由宾夕法尼亚大学为 Penn Treebank 语料库(1989 年起)制定的 Penn Treebank 分词规则成为英文 NLP 的事实标准,它把缩写拆成不同 token(don'tdo + n't)。Unicode 标准的 UAX #29(Unicode Text Segmentation)定义了跨大多数文字脚本工作的、语言感知的词边界。现代 Web 平台把它暴露为 Intl.Segmenter,自 2024 年起 Chrome、Firefox 与 Safari 已 baseline 支持,给它一个字符串和一个 locale,得到一个尊重输入语言惯例的词边界迭代器。本工具采用基于正则的方法(带 Unicode flag 的 [\p{L}\p{N}][\p{L}\p{N}_'-]*),对多数情形处理得不错,但会把 state-of-the-art 当作四个词,对花式排版的弯撇号(U+2019,Word 默认输出的那种)也可能力不从心(直 ASCII 撇号 U+0027 工作正常)。

词干提取(stemming)与词形还原(lemmatisation)

朴素的频率统计会把 runrunsrunningran 当作四个不同的词。对某些问题这是对的(你确实想分开统计各种表面形式);对许多其他问题,你希望把它们归并成一个概念。词干提取按规则削去后缀,Martin Porter 1980 年提出的著名 Porter stemmer 用一套多步去后缀算法把词还原到词干:runningruncatscatgenerouslygenerous。Porter 后来把整个体系细化为 Snowball(2001 年),这是一种用于跨多语言写词干提取器的小型语言。词干提取速度快、语言无关,但会产出「非词」(arguesarguedarguing 都会变成 argu)。词形还原则是更复杂的替代方案:它借助词典和语法分析把每个表面形式映射到其规范词形,产出真正的词(ranrun,而不是 ra)。词形还原更慢、需要语言相关词典、能处理词干提取出错的不规则情形。NLTK 与 spaCy 都自带词形还原器;本工具有意不做这两件事,基于表面形式的频率分析对某些应用(风格分析、词汇多样性)比词形还原后的版本更有用。

TF-IDF:为什么单文档里的词频不够

单文档频率分析能告诉你哪些词在这篇特定文本里出现最多,但说不出哪些词对这篇文本而言是有区分度的The 在每一篇英文文档里都最常出现,所以它在你这篇里频率高,并没给你信息。TF-IDF(Term Frequency-Inverse Document Frequency)是经典解法:把每个词在文档中的频率,按该词在更广泛语料中出现频率的倒数加权。处处常见的词(the、of、and)权重小;在你这篇里常见、在别处罕见的词权重大。IDF 的概念由 Karen Spärck Jones 在 1972 年发表于《Journal of Documentation》的论文 «A Statistical Interpretation of Term Specificity and Its Application in Retrieval» 提出(Jones 是计算语言学与信息检索的奠基人之一,她对搜索引擎的贡献(从 PageRank 起的每一种搜索排序算法都欠 TF-IDF 一笔)被广为低估。本工具计算的是原始频率,不是 TF-IDF)TF-IDF 需要一个比较语料,而任意用户输入并没有一个「正确」的语料。

n-gram 与 Google Books Ngram Viewer

单词频率是 1-gram 分析的特例。二元组(bigram)(两词序列)和三元组(trigram)(三词序列)能捕捉多词短语,「machine learning」是一个二元组,它绝不会出现在单词频率分析里,但比 machinelearning 分开统计更有信息量。最大的公开 n-gram 数据集是 Google Books Ngram Viewer,于 2010 年 12 月 16 日上线,基于约 800 万册书的 OCR 文本(大约占人类出版过的所有图书的 6%。Viewer 让你绘制英文(以及若干其他语言)里任意 1-、2-、3-、4- 或 5-gram 从 1500 年到今天的频率曲线。它被用于一切)从追踪俚语的兴衰,到给无年代的手稿断代,到记录英文历史用法里的性别偏见。马尔可夫链文本生成(现代语言模型的前身)就是建立在 n-gram 统计之上:根据前 N 个词预测下一个词,正是 n-gram 频率表所告诉你的事。本工具计算单词;二元组与三元组分析在未来功能清单上。

词汇量与 Heaps 定律

一名成年英语母语者大致掌握 20,000 到 35,000 个词族(一个「词族」即一个基础词加上它的屈折形式,runrunsrunningran 算一族)。Brysbaert 等人 2016 年发表在 Frontiers in Psychology 的研究把受过大学教育的美国成年人的中位数定在约 42,000 个基础词。Heaps 定律(Heaps 1978;底层观察可追溯到 1950 年代)描述词汇随语料规模如何增长:V ∝ K · Nβ,其中 V 是不同词数(词汇量),N 是 token 总数(语料规模),K 是 10-100 区间的常数,英文里 β 在 0.4 到 0.6 之间。直白地说:文本越长,你遇到的新词越多,但下一个词是新词的概率越低。一篇 1,000 词的文章大约引入 400 个不同词;10,000 词的文章约引入 1,300 个;一部 100,000 词的小说约 4,500 个。这是一种亚线性但无上界的关系,自然语言没有理论上的「词汇上限」。给内容写作者的经验法则:典型 1,500 词的博客文章含约 500-600 个不同词,频次最高的前 20 个词(多为停用词)大约覆盖总出现次数的一半。

词频分析究竟在什么时候有用

本工具在你的浏览器里是如何工作的

实现很直白。文本走一遍 Unicode-aware 的正则([\p{L}\p{N}][\p{L}\p{N}_'-]*/gu),把字母与数字序列匹配为「词」;如果勾选了忽略大小写,匹配项被归一化为小写;每个词在 JavaScript 的 Map 里累加;条目随后按计数降序排列并渲染成图表与表格。在一台典型笔记本上,10 万词的文档总耗时不到一秒。Map 在这里是合适的数据结构,它保留插入顺序、查询与更新都是 O(1),并能干净地序列化为 2D 数组以便导出。更精细的实现会在词边界不平凡(尤其是 CJK)的语言上改用 Intl.Segmenter(Unicode-aware 的分词 API,2024 年 4 月起 baseline);正则方案对欧洲语系工作良好,但对没有空格分隔的中文、日语和泰语会力不从心。

隐私:为什么在这里也要「只在浏览器里跑」

未发表的写作草稿(博客文章、内部备忘录、客户交付物、书稿章节、在写的学术论文)恰恰是那种不该上传到第三方服务的文本。服务器端的词频工具需要把全文发送到远端,意味着它会留在服务器日志里、可能进 CDN 缓存、可能进分析管线、可能进备份。对已发表文本,问题无关紧要。对草稿、签了 NDA 的客户文案,或任何你还不愿团队之外任何人看见的稿件,架构就要紧。本工具在你的浏览器里通过 JavaScript 跑完整条流水线。文本绝不过网络,点 Analyze 时打开 DevTools 的 Network 选项卡核对,或加载完页面后切到离线(飞行模式),分析仍然能跑。对机密草稿、客户交付物,以及任何你不愿被复制到陌生人硬盘上的文本,都可放心使用。

常见问题

什么是停用词?

停用词是像「the」「a」「is」「and」「or」这样的常见词,在大多数文本中频繁出现但意义较少。过滤它们能让分析专注于更有意义的词。

百分比是如何计算的?

百分比按以下公式计算:(该词出现次数 ÷ 总词数)× 100。例如,一个词在总共 100 个词的文本中出现 5 次,其频率为 5%。

本计数器能处理短语(n-gram)吗?

目前只支持单词。二元组(如「machine learning」这样的两词序列)、三元组以及更长的 n-gram 都在未来功能清单上。Google Books Ngram Viewer(2010 年 12 月 16 日上线)是规模化 n-gram 分析的公开参考;做个人文本,NLTK 和 spaCy 用几行 Python 就能做 n-gram 抽取。

可以分析非常长的文本吗?

可以,此工具完全在您的浏览器中运行,可处理多 MB 的文本。非常大的文本可能需要几秒处理。您的数据从不离开设备。

对非英文文本能用吗?

部分可以。Unicode-aware 正则能正确识别拉丁、西里尔、希腊、希伯来或阿拉伯文系任何语言的词字符。对没有空格分词的中文、日语、泰语,按字符的原始频率能跑,但严格来说那不是语言学意义上的「词频」,需要先做分词(中文用 jieba、日语用 MeCab、浏览器端可用 ICU 的 Intl.Segmenter)。停用词过滤仅限英文。

我的文本会被上传吗?

不会。分析完全在你的浏览器里通过 JavaScript 运行。粘贴的文本绝不过网络,点 Analyze 时打开 DevTools 的 Network 选项卡核对,或者加载完页面后切到离线(飞行模式),工具仍能工作。对机密草稿、客户交付物、签了 NDA 的书稿章节、内部备忘录,或任何你不愿被复制到陌生人硬盘上的内容,都可放心使用。

相关工具

免费在线单词和字符计数器 免费在线单词和字符计数器 字符计数器