使用方法
- 把文章粘进上面的文本框,或直接在里面输入。结果是实时更新的,页面打开时已经预置了一段 6 行示例,统计卡上显示的就是它的结果。
- 看句数:示例是 8 句。末尾如果有一段没有句末标点的文字,也会按一句残句计入,卡片下方的提示条会点出来。
- 看平均句长:示例 169 ÷ 8 = 21.13 字。这是判断文章节奏最常用的一个数,投稿和改写时先盯它。
- 再对一遍最长句 64 字和最短句 5 字:两者差得越多,说明节奏越不均匀,通常是最长那句该拆。
- 「长句阈值」默认 30 字,可填 10 到 200、步长 5;改了之后只有「长句」那张卡片跟着变,下面的分档表固定按 ≤10 / 11–20 / 21–30 / >30 四档统计。
- 想看看保护规则起了多大作用,把「保护小数点与缩写」勾掉:示例的句数会从 8 变成 11。文本框里按 Ctrl + Enter 可跳过延迟立即重算。
这个句子统计工具能解决什么问题
一是改写长稿时定位该拆的句子。一篇稿子读着累,往往不是整体太长,而是少数几句塞了太多信息;按句长降序一眼就能找到那几句,示例里第 3 句 64 字、占全文 38% 的长度,就是典型的拆分对象。
二是核对字数口径。约稿方说「3000 字、长短句要均匀」,先把平均句长和长句数算出来,再决定是拆句还是补句,比通读一遍凭感觉靠谱。
三是检查翻译稿和机器译文。直译出来的中文常常句长异常,平均句长一对比就能发现整段是不是照搬了原文的从句结构。
四是验证自己的切分规则对不对。把「保护小数点与缩写」勾掉再勾上,看句数差值,就知道手上的文本里有多少处 3.14、Mr. 这类容易被别的工具误判成句末的地方。
本页不做这些事:不数总字数和总字符数(那是另一种口径,请用字数统计工具)、不算字节数和存储体积(请用字符数统计工具)、不做分词与词频排行、不检查错别字和语病、不统计关键词密度。要按行而不是按句切分,请用行统计。
切分规则与句长口径
句子统计的切分用的是 String.prototype.split 带捕获组的写法:x.split(/([.!?。!?]+|…+)/)。捕获组让返回的数组变成「正文、终止符、正文、终止符……」交替排列,配对之后每一句都保留了自己的句末标点,疑问句判定和「末尾残句」判定才有依据。正则里用 + 而不是单个字符,是为了把连续标点并成一处:?!、?!、……、。。。 都只算一次结束,不会一句拆成三句。
句末标点池为什么会是这七个:半角 . ! ? 加全角 。 ! ? 再加省略号 …。分号、冒号、逗号一律不算句末——按 GB/T 15834-2011《标点符号用法》,句末点号是句号、问号、叹号三种,分号和冒号属于句内点号,只表示停顿层次;换行同样不算句末,它只是排版上的换行,一段文字中间敲回车不会让句子结束。省略号被收进来是因为它常常出现在句末表示语意未尽,代价是句中省略号也会被当成结束,这一点在边界一节里说清楚了。
假切分靠两次 String.prototype.replace 提前挡掉。第一次 /(\d)\.(\d)/g 把小数点换掉,所以 3.14、27.6 里的点不会被当句末;第二次 /\b(Mr|Mrs|Ms|Dr|Prof|Sr|Jr|St|vs|etc|Inc|Ltd|Co|No)\./g 处理 15 个常见英文缩写。替换用的占位符是 U+E000,属于 Unicode 私有使用区(PUA),正常文本里不会出现,所以不会和保护符本身撞车;换成 #、@ 这类常见字符就不行,正文里一旦出现同样的字符就会被误还原。
句长按「非空白字符的码点数」算:Array.from(s.replace(/\s/g, '')).length。这里不用 s.length,因为 JavaScript 的字符串以 UTF-16 存储,length 数的是码元,遇到 emoji、部分扩展 B 生僻字这类补充平面字符会数出 2;用数组展开走字符串迭代器才是码点。句长含句内标点、不含任何空白,所以示例里 8 句的字数是 6、29、64、5、12、8、16、29,加起来正好是全文的非空白字符数 169——这两个数永远相等,可以当作自查口径。
平均句长不是「去掉标点的字数除以句数」,而是 总字数 ÷ 句数,其中总字数含标点。示例 169 ÷ 8 = 21.13 字;如果先把标点剔掉,同样这段是 150 字,平均就变成 18.75 字,两个数字不能混用。中位句长取排序后正中间那句,句数为偶数时取中间两句的平均(示例排完序是 5、6、8、12、16、29、29、64,中间两句 12 和 16,得 14)。
常见误用的正确解释:把「平均句长 21 字」当成「每句都差不多 21 字」是最大的误读。平均量对极端值极敏感,示例里最长那句 64 字就把均值从 14 拉到了 21,所以看平均句长一定要同时看最长句和长句数,三个数一起看才有意义。
完整示例(数值仅作演示)
示例就是页面打开时文本框里那段 6 行文字,包含一句中文短句、一句带 Mr. 与两个小数点的中英混排、一句 64 字的长句、一句以 ?! 结尾的、一句带 …… 的,以及两句英文。实测结果:
- 句数 8,句末标点依次是
。、。、。、?!、……、。、?、!,没有末尾残句; - 总字数 169(含空白则是 188 个字符,差的 19 个是 5 个换行加句内空格);
- 平均句长 21.13 字、最长句 64 字(第 3 句)、最短句 5 字(第 4 句「真的吗?!」)、中位句长 14 字;
- 长句 1 句(阈值 30)、疑问句 2 句(第 4 句和第 7 句);
- 分档:≤10 字 3 句(37.5%)、11–20 字 2 句(25.0%)、21–30 字 2 句(25.0%)、>30 字 1 句(12.5%),合计 8 句。
把「保护小数点与缩写」勾掉后,同一段文字会被切成 11 句:Mr.、3.14、27.6 三处的点都被当成句末,各多切一次,净多 3 句(省略号仍在标点池里,不受影响)。这个 8 与 11 的差,就是保护规则在这段文本上的实际贡献。
句长分档与假切分对照表
分档表固定四档,用来看节奏分布;「长句」卡片跟随你填的阈值,两者互不覆盖,对照着看更清楚:
| 档位 | 示例句数 | 占比 | 判据 |
|---|---|---|---|
| ≤ 10 字 | 3 | 37.5% | 句长 ≤ 10 |
| 11 ~ 20 字 | 2 | 25.0% | 10 < 句长 ≤ 20 |
| 21 ~ 30 字 | 2 | 25.0% | 20 < 句长 ≤ 30 |
| > 30 字 | 1 | 12.5% | 句长 > 30 |
下面这些输入最容易产生「看起来像 bug」的结果,逐条列出本页的实际处理方式:
| 输入 | 本页句数 | 素切分句数 | 为什么不一样 |
|---|---|---|---|
| 整段示例文字 | 8 | 11 | Mr.、3.14、27.6 三处被保护,各少切一次,净差 3 |
真的吗?! | 1 | 1 | 连续标点用 + 并成一处,两处一致 |
Mr. Smith 买了 3.14 公斤 | 1 | 3 | 素切分在 Mr. 和 3.14 处各切一刀 |
好……吧。 | 2 | 1 | 本页把省略号当句末,句中省略号也会被切开 |
啊。。。啊。 | 2 | 1 | 三个句号连用被 + 并成一处结束,只切一次 |
没有句末标点 | 1 | 1 | 末尾残句照样计入,提示条会标明它没有标点 |
输入范围、边界与精度说明
- 文本上限 20 万字符(
maxlength,按 UTF-16 码元计)。纯中文能装 20 万个字,含大量 emoji 时按码元计算会少装一些。超过 10 万字符时提示条会提醒统计可能有短暂延迟,按 Ctrl + Enter 可以立刻重算一次。 - 空文本时八项指标全是 0,并在红框里写明「文本框是空的」——不会出现「1 句、平均 0 字」这种看着就不对的默认值。只有空白(空格、换行)时同样是 0。
- 长句阈值允许 10 到 200、步长 5。填成非数字或超出范围会点名这个字段并给出允许范围,不会静默回落到 30。阈值只影响「长句」卡片和提示条,不影响分档表。
- 句中省略号会被当成句末,这是本页最需要注意的口径。
好……吧。会被切成 2 句(好……和吧。);如果你需要整句统计,请先把句中省略号改成逗号或破折号。同理,引号内的句末标点同样结束句子,「他说。」之后不再续接。 - 缩写保护只覆盖列出的 15 个:
Mr. Mrs. Ms. Dr. Prof. Sr. Jr. St. vs. etc. Inc. Ltd. Co. No.。遇到名单外的缩写(例如approx.、e.g.之外的写法)仍会被当成句末,此时手动把那个点改成全角句号即可。 - 小数点保护要求「数字 + 点 + 数字」。
3.14、27.6能挡住,但英文里句末写「价格是 27。」这类以数字加半角点结尾的句子,那个点会被当成小数点的一部分而不切分——中英混排的稿件要留意这一处。 - 不处理 Markdown、HTML 标签与代码块。带
<p>、#标题或代码块的文本会把标签和符号算进句长,先把正文抽出来再统计;要去掉标签可先过一遍去除 HTML 标签的工具。 - 句数上限没有硬性限制,但逐句明细表默认只渲染 12 行,点「加载更多」每次再加 12 行;这样几万句的长稿也不会把页面拖死。CSV 导出同样按当前已展开的行导出。
常见问题
为什么这里的句数和 Word 的「句数」不一样?
Word 的段落/句子统计依赖语言分词器和它自己的标点规则,本页按 GB/T 15834-2011 的句末点号加半角 . ! ? 与省略号来切,且会保护小数点与缩写。示例文字在本页是 8 句,去掉保护则是 11 句,差异几乎都出在 Mr.、3.14 这类地方。
「平均句长 21 字」是不是说多数句子都是 21 字?
不是。平均值对极端值很敏感,示例里排完序是 5、6、8、12、16、29、29、64,中位句长只有 14 字,是被那句 64 字拉高了均值。判断节奏请同时看平均句长、中位句长和长句数,三个数差得越多说明越不均匀。
省略号为什么把我的句子切开了?
因为本页把 … 归入句末标点池。句末省略号(示例第 5 句「他站在门口犹豫了很久……」)本来就该结束,代价是句中省略号也会被切开,好……吧。 会算 2 句。想整句统计,把句中的省略号换成逗号或破折号即可。
小数点和小数点结尾的句子怎么区分?
靠「数字 + 点 + 数字」这个条件。3.14 满足,所以那个点被占位符替换掉不再切分;而「价格是 27。」这种以数字加半角点收尾的句子也会被当成小数点保护起来,从而不切分。中英混排的稿件遇到这种情况,建议把句末改成全角句号。
总字数到底含不含标点?
含。总字数是各句「非空白字符的码点数」之和,示例 169 字里包含 19 个标点字符;剔掉全部标点后是 150 字,平均句长会由 21.13 降到 18.75。两个口径都成立,但不能混着用,对外报数时先说明是哪一种。
能不能统计英文或中英混排的文章?
能。半角 . ! ? 和全角 。 ! ? 都在句末标点池里,Mr.、etc. 一类缩写已列入保护名单。名单之外的缩写会被误切,遇到时手动把那个点改成全角句号。
最长能统计多少字?逐句明细只显示 12 行怎么办?
文本上限 20 万字符(按 UTF-16 码元)。逐句明细默认渲染 12 行,点「加载更多」每次再加 12 行,几万句的长稿也不会卡住页面;CSV 导出按当前已展开的行生成,带 BOM 以便 Excel 打开中文不乱码。
我粘贴的文字会被上传吗?
不会。句数、句长、分档、CSV 全部由页面里的正则和字符串运算算出,不发任何网络请求,也不写入浏览器存储,刷新后文本框回到预置示例。想确认可以打开开发者工具的 Network 面板,输入时观察是否有请求发出。