面向现代小说的常用简体中文汉字排名公式设计技术问询
我正在编译1920年以来现代小说领域的5000个最常用简体中文汉字列表。需要说明的是,5000这个量级其实偏大——即使是长篇现代中文小说,其独用汉字数量也很少超过4000个。
目前我仅能按总出现次数排序,但这种方式并不理想:对我来说,在50个不同来源中共出现50次的汉字,价值远高于仅在1个来源中出现5000次的汉字(明显的异常值容易剔除,但还有很多不明显的情况难以处理)。
而如果单纯按来源覆盖数量排序,又会导致极常用、重要的汉字排名严重偏离合理位置,比如下面的例子:
1510. 滞 35 1649 1511. 怅 35 1540 1512. 她 34 746256 <== 这个字本该排进前25 1513. 妈 34 80072 1514. 办 34 75506
(注:每行数字分别为排名、汉字、来源数、总出现次数)
显然仅靠这两个指标不够,我可以获取每个汉字在各来源中的原始计数数据,请问该如何处理这些数据,得到一个合理的排序键来进行主排序?
针对你的需求,这里提供几种基于逐来源计数的排序键计算方法,兼顾来源覆盖广度和使用频率深度:
1. 加权平均频率(来源权重法)
核心逻辑:给每个来源赋予基础权重,再计算汉字在所有来源中的加权平均出现次数,避免单一高频率来源的过度影响。
- 计算方式:
- 先对每个来源的总汉字数做归一化,比如某来源总字数为N,该来源中汉字X的出现次数为c,则该来源中X的归一化频率为
c/N - 给每个来源设置相同权重(或根据来源篇幅/代表性调整权重),将所有来源的归一化频率取平均,得到X的加权平均频率
- 最终按加权平均频率从高到低排序
- 先对每个来源的总汉字数做归一化,比如某来源总字数为N,该来源中汉字X的出现次数为c,则该来源中X的归一化频率为
这种方法能平衡“在多个来源中都常用”和“在单个来源中高频”的情况,避免像总次数那样被单一来源带偏。
2. TF-IDF变体(适配汉字场景)
核心逻辑:借鉴文本检索中的TF-IDF思想,给“在更多来源中出现的汉字”更高权重,同时抑制仅在少数来源高频出现的汉字。
- 计算方式:
- 对每个汉字X,计算来源内频率TF:取该汉字在某来源中的出现次数,除以该来源的总汉字数(归一化后的值)
- 计算逆来源频率IDF:
log(总来源数 / (包含X的来源数 + 1)),加1是为了避免除以0 - 每个来源中X的TF-IDF值为
TF * IDF,将所有来源的TF-IDF值求和,得到X的总排序值 - 按总TF-IDF值从高到低排序
这种方法会优先给“覆盖来源广、且在各来源中都有一定使用频率”的汉字更高排名,完美匹配你“多来源少量次比单来源多量次更有价值”的需求。
3. 调和平均(兼顾两个核心指标)
核心逻辑:用调和平均同时考虑“总出现次数”和“来源覆盖数”,避免单一指标的极端情况。
- 计算方式:
- 设汉字X的总出现次数为T,覆盖来源数为S
- 排序键 =
2 * (T * S) / (T + S) - 或者加入归一化处理:先将T和S分别做0-1归一化,再计算调和平均
这种方法计算简单,能快速平衡两个指标,比如你例子中的“她”,T极大、S略低,调和平均后会远高于“滞”“怅”这类S高但T极低的字。
4. 分位数加权(抑制极端值)
核心逻辑:先剔除每个来源中出现次数过高的异常值,再结合来源数计算排序键。
- 计算方式:
- 对每个来源,统计所有汉字的出现次数,取95分位数作为阈值,超过阈值的计数统一替换为阈值(抑制单一来源的极端高频)
- 将处理后的各来源计数求和得到修正总次数T'
- 排序键 =
T' * log(S + 1),其中S是覆盖来源数 - 按排序键从高到低排序
这种方法能针对性处理你提到的“不明显异常值”问题,同时给来源覆盖数赋予对数权重,避免来源数过度主导排序。
内容的提问来源于stack exchange,提问作者wildekat

