把一整部 120 回的書貼進文本頻率統計
有人把一整部 120 回的公版古籍原文粘進文本頻率統計的字元框,回車後榜首不是任何漢字,而是一個出現 59260 次的逗號。這份 TXT 實測 2605929 位元組、5496 行、無 BOM 的單一 UTF-8,非 ASCII 位元組佔 99.78%。
位元組、碼元、漢字是三本帳
這份 120 回全本的原始檔案在站內資源頁 紅樓夢資源頁,位元組數由 wc -c 與 fs.statSync 雙口徑互證都是 2605929。介面統計欄讀的是 text.length,即 UTF-16 碼元 872515,比位元組少 1733414,位元組除以碼元約 3.0;而按 /[\u4e00-\u9fff]/g 只數漢字又是 732628。把整本餵進文本頻率統計,那一格讀到的是 872515,不是檔案名裡的 2.6 MB——三個數各說各的帳,不能互相替換。
回數三法為什麼差 124、112、120
寬鬆正則命中 124 次,不等於 120 回:124 裡有 120 個是回目行(【與】各出現 120 次),另 3 處落在正文敘述、1 處是不帶方括號的裸回目重出。嚴格漢字數字正則只命中 112 次,差的 12 處全在第 100 回之後——這段回目用「零」寫法,字元類沒收錄「零」就整批漏計,112 加 12 與 124 閉合。第三條獨立證據是把 120 個漢字回目逐行寫進關鍵字欄,總命中報 124 次、未出現 0 個。
榜首是逗號,前 10 名裡 4 個標點
整榜 4454 項按次數降序,漢字第一名是「了」21221 次排第 3、比逗號少 38039 次,「的」15719 排第 4;範本只跳四類空白、標點全參與排名,於是前 10 名裡混進 4 個標點。下表給前 10 名:
| 名次 | 字元 | 次數 | 佔比 |
|---|---|---|---|
| 1 | , | 59260 | 6.8 |
| 2 | 。 | 29462 | 3.4 |
| 3 | 了 | 21221 | 2.4 |
| 4 | 的 | 15719 | 1.8 |
| 5 | 不 | 15053 | 1.7 |
| 6 | 一 | 12179 | 1.4 |
| 7 | : | 11786 | 1.4 |
| 8 | 来 | 11445 | 1.3 |
| 9 | 道 | 11059 | 1.3 |
| 10 | ” | 10682 | 1.2 |
文言虛詞全在低位:之 2147 次(全榜第 75 名)、也 6116、者 416、乎 70、矣 65、焉 26、哉 26。單看「之」只有「的」的 13.7%,教科書那條字母 E 約 12.7% 的密度尺子在這裡沒有任何單項接近。
逐回字數與行數不成正比
120 段去空白口徑平均 7211.3 字每回、漢字平均 6105.2;最長第六十二回 11760 字,最短第十二回 4215 字,差 7545、比 2.79 倍。按行排名次會整個反過來:第七十八回 123 行只有 10653 字(詩帖行多),第七十四回 25 行卻有 10956 字,逐回字數榜只能按去空白字數排。
圖 1:字數榜 74 回高於 78 回,行數卻是 78 回 123 對 74 回 25,兩套名次互換
英文詞頻只出 7 項網址殘渣
英文詞頻那一格的分詞口徑是 /[a-zA-Z]+/g,只抓連續 ASCII 字母串:732628 個漢字貢獻 0 個詞,整本總單詞數只有 8,預設 30 項停用詞吃掉 by 後榜單剩 7 項,每行各 1 次 12.5%,全是末尾來源說明裡的 https、zh、wikisource、org、wiki、cc、sa 網址殘渣。勾上區分大小寫變 8 項(BY 漏過濾),停用詞清空是 8 項且佔比和 100.0%(預設那檔只有 87.5%);按回拆開餵,120 段裡 119 段直接是「暫無資料」。
關鍵字計數讀的是字樣不是人物
關鍵字計數走 indexOf 非重疊掃描。三個角色詞寫三行:寶玉 3992、鳳姐 1751、黛玉 1377,統計欄總命中 7120 次、未出現 0 個,三數相加正好閉合。但那一格百分比是次數除以 872515 碼元,寶玉顯示 0.5%,按實佔算是 7984 碼元即 0.9151%,兩格差一倍。清單不去重:黛玉寫兩遍就報 4 個關鍵字、8497 次,而文本裡真實只有 7120 處。「林黛玉把花具且都放下」10 字在 23 回葬花段,「凤姐儿偏拣了一碗鸽子蛋放在刘姥姥桌上」18 字在 40 回。
三檔字數口徑逐檔可解釋
字數三檔口徑,每檔差值都能用另一檔實測解釋:碼元 872515 減範本跳過的四類空白 5742 得範本口徑 866773;範本不吃全形空格,再減 1412 得去空白口徑 865361;再減標點符號 132733 得漢字口徑 732628。整榜 4454 項各自佔比相加只有 81.4%,因為被跳過的空白仍留在分母。
圖 2:碼元到漢字四檔口徑逐檔相減可閉合
整本一次貼進的可行性算帳
範本四個輸入欄位都沒有 maxlength,瀏覽器實測 .maxLength 讀到 −1、getAttribute 為 null,程式碼裡也無截斷語句。按無上限口徑,全文 872515 碼元一次進框可容,賦值 4.7 毫秒、取回碼元相等;連 3 倍全文 2617545 碼元也塞得下,榜首隨之變 177780 次正好三倍。代價在渲染:4454 行整表一次寫入是 JS 77.3 毫秒加首幀 1046.7 毫秒約 1.12 秒,容器 scrollHeight 106896 像素對可視 320 像素,這個量級要貼一次算一次。
逐回跑與整本跑互相印證
120 段各跑一次字元頻率共 117.7 毫秒、平均每次 0.98 毫秒,每回榜平均 953.2 項而整本一次 4454 項;但逐回次數合計 866773 與整本一次完全相等,切段不吞字。三模式耗時(Node 計時)是字元頻率 58.7 到 76.9 毫秒、英文詞頻 3.2 到 7.0 毫秒、關鍵字三詞 0.7 到 1.1 毫秒。文案對照 14 條判定 6 條一致、2 條衝突,衝突都落在密度口徑上。
FAQ
Q:命中 124 次是不是說明有 124 回?
不是。124 是「第X回」字樣出現次數,120 是回目行條數;多出的 4 處裡 3 處是正文敘述用詞、1 處是重複排版的裸回目。嚴格正則少 12 處只因「零」沒進字元類。
Q:英文詞頻為什麼幾乎是空的?
切分運算式只認 ASCII 字母串,732628 個漢字進不了這張榜,整本只有末尾來源說明裡的 8 個詞,過濾停用詞後剩 7 項殘渣。
Q:那一格百分比能當關鍵字密度嗎?
不能。分母是總碼元而非該詞實佔,寶玉顯示 0.5% 而實佔是 0.9151%。小文本上字頻、詞頻與停用詞的入門讀數見舊文 文本頻率停用詞與中文計數說明。
Q:逗號當榜首有分析價值嗎?
這是跳過名單不含標點所致,漢字首榜看「了」21221、虛詞看「之」2147。