尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
韩国姓名频率统计与persona数据集分析:口径、归一化与踩坑
金英淑这三个字在韩国街头的杀伤力差不多相当于在国内喊一嗓子张伟。我第一次认真琢磨这件事是在处理一份名为 Nemotron-Personas-Korea 的合成人物数据集的时候——20.9 万条记录每条都带着姓名、性别、年龄、职业、居住地这些字段本来是打算抽几千条出来做本地化界面测试的。结果随手跑了一个姓名频率统计排在第一的赫然是김영숙金英淑。这个结果让我愣了一下印象里韩国年轻人的名字早就换过好几茬了怎么最高频的还是个奶奶辈的名字。后来我意识到问题本身就问岔了。最常见的名字到底指当下活着的人里叫这个名字最多的还是最近几年新生儿里叫这个名字最多的这两个口径算出来的答案能差出三四十年。前者是存量人口统计后者是流量统计把两者混为一谈是这类分析里最容易翻车的地方。顺着这条线往下捋会牵出一堆有意思的东西韩国姓氏为什么集中得那么离谱、名字池是怎么从少数高频字反复组合变成大量字低频组合的、20.9 万条 persona 记录的构造逻辑能怎么反推、拿到这类名单该怎么动手分析以及我在这个过程中踩过的几个坑。前面讲现象和原理后面给能直接抄的代码和规则。做数据本地化、做测试数据填充、做用户画像或者单纯对姓名统计好奇的都能从中捞到点东西。1. 从金英淑这个梗说起韩国姓名分布的幂律底色1.1 姓氏侧五大姓吃掉半个国家要理解任何一个人的名字为什么能登顶得先看姓氏这一侧的分布。韩国姓氏的集中度在全世界范围内都属于极端水平。金、李、朴、崔、郑这五个姓加起来的占比常被引用的量级在五成上下金姓单独一个就占了两成左右李姓一成多朴姓接近一成。前十位姓氏累计能覆盖六成以上的人口。对比一下会更直观。国内的姓氏虽然也集中但前五大姓合计大概在三成这个量级日本的姓氏种类有十万级别前十大姓的覆盖率低得可怜。韩国之所以长成这样跟姓氏制度的历史扩散路径有关姓氏最早是王室和上层阶层的标识向下普及的过程相对晚加上赐姓、避讳改姓、依附改姓这些历史因素姓氏的种类池一直没有真正打开过。这个底色直接决定了后面所有的乘法。假设金姓占两成那么任何一个名字只要前面挂上金它在绝对数量上就自动被放大到五倍于平均值。所以最高频姓名这个位置大概率会落在金、李、朴这几个大姓上剩下的变量就是名字那一半。1.2 名字侧英淑不是一个人是一代人的命名习惯영숙这个音节对应的汉字常见的是英淑、永淑、荣淑、英熟这几种。它在韩国的地位有点像国内五六十年代出生的女性里秀英桂芳那一类名字——不是某一个人特别有名而是整整一代人的命名偏好把它堆成了高峰。这里是关键女性名字的流行字有非常明显的年代分层。上世纪三四十年代到六十年代淑、子、顺、姬、花、玉、春、香这些字反复出现六七十年代转向美淑、贞淑、英姬、顺子这类组合八十年代之后开始出现智英、秀珍、恩晶、美京九十年代是智慧、秀妍、睿珍、敏智两千年以后则彻底换了一副面孔书妍、书允、智友、河允这类名字成为主流男名那边则是敏俊、书俊、道允这一批。这个变化背后最重要的不是哪些字流行而是名字池的宽度在急剧扩张。早期是一小撮高频字在反复排列组合所以单个名字能吃掉很大的份额越往后家长越倾向于避开烂大街的名字可选字的组合空间被大量开发单个名字的份额就被摊薄了。结果就是最重的那一个名字随着时间推移在变得越来越轻。1.3 乘法效应为什么冠军必然诞生在大姓 × 大年代名的交点把上面两件事乘起来看答案几乎是注定的。金姓占两成英淑在某个年代的女性队列里占有率极高两者相乘绝对数量自然冲到榜首。可以做一个量级估算看看这个数字合不合理。假设现存人口中女性占一半左右上世纪五十年代前后出生的女性占现存女性人口的不到一成而在那个队列里英淑的占有率如果达到百分之几再乘上金姓的两成占比那么金英淑在全体女性中的占比大概落在千分之一这个量级。反推到 20.9 万条记录上如果男女大致各半女性约十万出头金英淑对应的记录数大概是百人级别。百人级别听起来不多但在这个榜上已经足够登顶了——因为第二名、第三名只会更分散。这就是幂律分布的样子头部看起来也没多高但尾部的绝大多数名字只有零星几条记录。所以看到金英淑排第一第一反应不该是韩国人真爱起这个名而应该是这个分布的头部被姓氏集中度和代际命名偏好共同压出来了。提示凡是看到最常见的名字这类结论先追问一句口径——是存量人口、某个年龄段还是某一年新生儿。三个口径给出的冠军往往不是同一个名字。2. 拆开20.9万条persona 数据集里到底装了什么2.1 一条 persona 记录通常长什么样先把这类数据集的结构说清楚不然后面聊分析全是空中楼阁。persona 数据集的基本单位不是人而是人物画像——每一条记录描述一个虚构或半虚构的个体通常包含这么几类字段姓名本族文字、罗马字转写、性别、出生年份或年龄段、职业、居住城市或地区、教育背景、若干性格或兴趣标签有的还会附一段第一人称的自述文本。20.9 万条这个规模本身就很说明问题。真要凑出二十万条带姓名、年龄、职业、城市、自述的真人数据在那个合规环境下几乎不可能公开。所以基本可以断定这是批量合成的——用概率模型或者语言模型按某种分布采样生成的。这不是什么缺陷合成人物数据集本来就该是合成的关键是要搞清楚它合成了什么、保留了哪些真实统计特征。2.2 从分布形状反推构造方式三个可观察的信号拿到这类数据我一般会先做三件事用分布形状去反推它是怎么造出来的。这三件事比读它的说明文档还有效。第一件看姓氏分布的集中度。如果金姓占比落在两成这个量级、前五大姓覆盖五成说明构造时用了真实的姓氏频率表做加权采样。如果姓氏分布接近均匀每个姓都差不多那就是随便抽的这种数据拿来做本地化测试会失真得厉害。第二件看名字和年龄的联合分布。真实世界里英淑几乎必然对应中老年女性一个二十岁的金英淑在现实中极其罕见。如果数据集中英淑均匀地铺在二十岁到八十岁之间那就说明名字和年龄是独立采样的没有做联合建模。这个信号特别有用因为它决定了这份数据能不能用来做按年龄推断名字或者按名字推断年龄这类任务。第三件看名字池的宽度随时间的变化。真实数据里老年段的唯一名字数量少、单个名字频率高年轻段的唯一名字数量多、单个名字频率低。如果数据集里各年龄段的唯一名字数基本持平那说明采样时没有建模这种代际漂移。这三条判断完一份数据集的真实度画像基本就出来了。我见过不少号称高度贴近真实人口的数据集第二关就挂了——名字和年龄完全解耦这种数据做演示没问题但任何涉及代际的分析都不能用它。2.3 名字的年龄指纹怎么用名字反推出生年代名字是带年龄信息的这一点在韩国姓名上尤其明显因为代际命名的切换非常干脆。韩国有公开的年度新生儿名字排行数据各年度的前十、前五十名单都能拿到。有了这个就可以给每个名字建一个年代概率分布。具体做法不复杂把每个名字在各年度榜单里的名次和份额拉成时间序列归一化之后就是这个名字的年龄分布。遇到没上榜的冷门名字用字级别的统计去插值——某个字在哪个年代高频基本能推断出含这个字的名字大概落在哪个年代。像淑子顺这类字出现年龄中位数大概在七十岁上下智敏书允这类字中位数就掉到二三十岁了。这个技巧的实际用途比听起来多。做用户画像时如果只有姓名没有年龄可以拿它做一个粗略的年龄段先验做数据质量校验时如果发现某个英淑被标成二十五岁那这条记录大概率是合成时没做联合采样值得单独拎出来看。3. 动手做一遍从原始名单到姓名频率榜3.1 第一道坎韩文的 Unicode 归一化这是所有韩文数据处理里最容易被忽略、后果又最严重的一步。韩文音节在 Unicode 里有两种表示方式一种是预组合形式NFC一个音节一个码位另一种是分解形式NFD把初声、中声、终声拆成独立的字母码位。两种形式在屏幕上看起来一模一样但字节完全不同直接拿去做分组统计同一个名字会被拆成两拨甚至三拨。韩文音节的码位区间是 UAC00 到 UD7A3一共一万一千多个每个音节由初声十九个、中声二十一个、终声二十八个组合而成。分解和组合的换算公式是固定的但实际处理时没必要自己算标准库已经把这事包好了。import unicodedata import pandas as pd df pd.read_csv(personas.csv, dtypestr) def clean_name(s): if s is None or pd.isna(s): return None s unicodedata.normalize(NFC, str(s)) # 去掉所有空白包括全角空格和零宽字符 for ch in [ , \u3000, \u200b, \ufeff, \t, \n]: s s.replace(ch, ) return s df[name_norm] df[name].map(clean_name)这段代码里归一化和去空白要一起做。韩国姓名在表单里经常被写成김 영숙这种带空格的形式也有从别处复制过来带着零宽字符的。这些字符肉眼看不见但会让分组结果彻底错乱。我吃过一次亏一份十万条的数据统计出来姓氏有一万多种排查了半天才发现是零宽字符在作祟。3.2 姓氏切分复姓白名单必须先匹配姓名切分看起来简单——第一个字是姓后面是名。但韩国有复姓虽然占比极小但如果直接取首字会把南宫皇甫诸葛鲜于独孤司空西门这类复姓的人切错姓氏统计里凭空多出一个南姓还会污染名字部分的分布。处理顺序必须是先匹配复姓白名单再退化到单字姓。COMPOUND_SURNAMES {남궁, 황보, 제갈, 선우, 독고, 사공, 서문} def split_name(full): if not full or len(full) 2: return None, None if len(full) 3 and full[:2] in COMPOUND_SURNAMES: return full[:2], full[2:] return full[0], full[1:]复姓白名单不需要穷举覆盖常见的那几个就够因为它们的合计占比低到不影响整体统计结论但影响的是数据正确性——切错了就是错跟占比无关。名字长度那边也要留意。韩国名字两个字最常见一个字的名字也有男性偏多三个字的名字很罕见但确实存在。如果切出来名字部分是空的或者超过三个字八成是原始数据有问题比如姓名被写进了同一个字段还带了备注这种记录要单独挑出来人工看一眼。3.3 统计口径决定结论三种算法给出三个冠军这是整篇文章我最想强调的一点。同一份数据换一个统计口径最常见的名字可以完全不一样。统计口径计算方式通常的冠军类型适用场景全体存量全部记录按完整姓名分组计数大姓 老年高频名人口规模估算、重名率评估分段存量按年龄段分组后再计数各段各不相同用户画像、代际分析年度流量只取某一年出生的记录计数当年新生儿热门名命名趋势研究、市场定位第一种口径算出来的冠军几乎一定是金英淑这一类——因为它是存量人口的自然结果老年人积累了七八十年的人口年轻人只积累了二三十年。第二种口径才是真正有用的因为它把年龄这个混淆变量控制住了六十岁以上组里冠军可能是英淑、顺子三十岁组里是智英、秀珍十岁以下组里就变成书妍、河允了。第三种口径回答的是完全不同的问题——现在最流行的名字是什么答案跟存量冠军没有任何关系。我见过不少分析文章拿存量数据得出韩国人最喜欢的名字是英淑这种结论然后配上近年新生儿榜单的图两者放在一起对比逻辑上其实是断裂的。真要论证命名偏好变化得用同一口径下的时间序列不能拿存量比流量。3.4 交叉分析姓名 × 性别 × 年龄段的二维透视单看姓名排行榜信息量有限真正能挖出东西的是交叉表。把姓名、性别、年龄段三个维度交叉起来能看出很多单一的榜单看不出来的模式。df[[surname, given]] df[name_norm].apply( lambda x: pd.Series(split_name(x)) ) df[age_band] pd.cut( df[age].astype(float), bins[0, 10, 20, 30, 40, 50, 60, 70, 120], labels[0s,10s,20s,30s,40s,50s,60s,70] ) # 每个年龄段内的高频名 top_by_band ( df.groupby([age_band, given], observedTrue) .size() .reset_index(namecnt) .sort_values([age_band, cnt], ascending[True, False]) .groupby(age_band) .head(10) )跑完这个之后我一般会再看两个衍生指标。一个是唯一名字数随年龄段的变化——如果年轻段的唯一名字数明显多于老年段说明代际漂移被正确建模了这份数据可用性就高。另一个是头部集中度比如前一百个名字覆盖了多少比例的记录老年段这个比例应该显著高于年轻段这也是真实数据的典型特征。这两个指标做出来基本上一眼就能看出数据集的成色。数值越接近真实人口统计的形态说明构造时下的功夫越深如果各年龄段指标一模一样那八成是均匀采样用它做任何代际分析都会得出假结论。4. 踩过的坑姓名数据分析里最容易翻车的几个地方4.1 罗马字转写同一个名字被拆成了三拨这个问题在任何非拉丁文字系统的姓名数据里都存在韩文尤其严重。同一个김영숙可能被转写成 Kim Young-sook、Kim Yeong-suk、Gim Yeongsuk还有带不带连字符、姓在前还是名在前、名字两个音节是分开写还是连写这一堆变体。根子在于转写标准不统一。有历史较久的转写体系有官方的现行转写规范还有大量个人习惯写法。同一个人在护照、论文、社交媒体上可能用三种不同的拼法。如果拿罗马字字段做频率统计会把一个人拆成好几份冠军名字的计数直接被稀释。我的处理原则是能拿到本族文字字段就绝不用罗马字做统计。罗马字字段只在需要和外部系统对接时用而且必须做标准化——统一大小写、去掉所有连字符和空格、把常见的变体映射到同一个规范形式。但这个映射表很难做全所以更稳妥的做法是根本不让罗马字进入统计主链路。4.2 同音异形与汉字标注丢失韩文是表音文字同一个音节可以对应多个汉字。영숙 可以是英淑、永淑、荣淑、英熟在韩文层面完全同形。绝大多数数据集只提供韩文汉字标注是缺失的。这在做韩文层面的频率统计时不是问题——同形就是同形统计上就该合并。但如果任务涉及汉字还原、姓名含义分析或者要把韩文名字映射到中文名那就麻烦了。一个韩文名字可能对应四五个汉字组合没有额外信息根本无法确定。我遇到过一次具体场景需要给一批 persona 生成汉字姓名标注本想着按频率取最常见的汉字组合就行结果发现错误率高得离谱——因为在同一个韩文音节下不同汉字的相对频率会随性别和年代变化一刀切地取最高频等于把所有人的名字都往同一个方向拉。最后的处理是放弃精确还原改用韩文 可能的汉字候选列表这种形式把不确定性显式表达出来。提示如果下游任务依赖汉字最好在数据源头就把汉字字段拿下来别指望事后从韩文反推。反推的准确率在性别和年代未知的情况下会掉到不可用的水平。4.3 把合成数据的分布当成人口普查结论这是最危险的一个坑也是最难自我察觉的。合成人物数据集的分布反映的是构造者的先验设定不是真实世界。20.9 万条里金英淑排第一只能说明这个分布被构造成了这样不能直接推论现实中有多少叫金英淑的人。我一开始也差点栽进去。跑出榜单之后第一反应是这个数可以拿去估算真实人口里的重名率后来冷静下来想这个推理链里少了关键一环——数据集的采样比例是不是按真实人口比例来的如果构造时对某些年龄段做了过采样比如为了让职业分布更均匀那姓名分布就已经被扭曲了任何基于它的绝对数量推断都是错的。正确的用法是把它当成形态参考而不是数量参考。可以拿它看姓氏集中度是不是那个量级、代际命名的切换点大概在哪、复姓占比有多低这些都是结构性的结论比较稳健。但凡涉及有多少人叫这个名字必须回到真实的人口统计源去查。4.4 姓名不能当主键重名率比你想的高20.9 万条记录里可能有几百条都叫金英淑但她们是完全不同的人——年龄不同、城市不同、职业不同。合并、去重、join 的时候如果拿姓名当键会把这些人全部折叠成一个数据直接报废。这一类数据集通常都带一个记录 ID 字段必须用它做主键。如果原始数据没有 ID第一件事就是自己生成一个用行号或者 UUID 都行生成之后再动任何分析。我见过有人为了去重把同名记录删掉结果把数据集的女性老年段整个删空了后面的分布分析全废。顺便说一句重名率本身是个很有价值的指标但它得单独算——按姓名分组计数看有多少个名字对应多条记录这个分布的形状能直接反映数据集的名字池宽度。老年段的重名率应该远高于年轻段这也是验证数据真实度的一个抓手。5. 这类数据的正确用法与边界5.1 用来做什么最合适本地化测试的隐形刚需合成人物数据集最稳的用途是填充测试环境韩文姓名在这方面价值特别大因为韩文在界面上的表现和拉丁字母完全不同。第一个用途是字符宽度和断行测试。韩文音节是方块结构宽度均匀但和拉丁字母混排时行高、字距的表现不一样。拿真实分布的姓名去填表格能很快暴露出输入框宽度不够、长名字被截断、复姓对齐错位这类问题。用张三李四这种短名字测永远测不出来。第二个用途是表单校验规则验证。真实姓名分布里有一字名、两字名、三字名有复姓有带空格的写法这些边界情况都得覆盖。用均匀生成的假名字测覆盖率反而低因为它不会自然产生那些低频但真实存在的形态。第三个用途是排序和检索测试。韩文有固定的字母顺序姓名列表按这个顺序排测试的时候需要一批分布合理的样本。用随机字符串排测不出排序逻辑对不对。第四个用途是演示和文档截图。给客户做演示、写产品文档界面上总不能挂着真实用户数据这时候合成 persona 就是标准解法。5.2 隐私边界合成身份也不是随便用的这里有个容易忽略的点——合成数据不等于零风险。如果某条 persona 的姓名、城市、职业、年龄段四项恰好和现实中的某个真实个体全部吻合那这条记录实际上是可以被再识别的尤其是在小城市加小众职业这种组合下候选人群可能只有个位数。所以使用时要守住几条不把合成身份用于任何真实的联系、营销、通知场景不在公开渠道把合成身份和真实机构、真实地址绑定展示如果数据集本身提供了声称完全虚构的说明那是它的声明使用时仍然要按最保守的方式处理。还有一条实践中的经验做演示数据的时候把姓名保留、把城市和职业做随机打散比整体照搬安全得多。姓名本身的重合是海量的但姓名城市职业年龄四元组的重合是稀缺的打散其中一两项再识别风险就降下来了。5.3 一个可复用的小工具思路按真实分布加权采样如果要做姓名生成最差的做法是从字库里随机拼——拼出来的名字既不真实分布也不对测不出任何有意义的问题。稍微好一点的做法是用真实的频率表做加权采样。思路是这样准备两张表一张是姓氏-权重表一张是名字-年代-性别-权重表。采样时先按年龄段的实际人口比例抽一个年龄段再在该年龄段内按性别比例抽性别然后按姓氏权重抽姓、按名字权重抽名最后拼起来。这样生成的名字代际特征和姓氏集中度都是对的做测试数据的价值比随机拼接高一个量级。权重表从哪来公开的年度新生儿名字统计是很好的来源虽然它只覆盖了每一年的热门名字长尾部分缺失但头部占的份额大覆盖头部就能抓住主要形态。姓氏权重相对稳定一份统计能用很多年。最后分享一个我自己的体会做姓名类数据分析最容易犯的错不是技术上的而是口径上的。代码写错了一眼能看出来口径搞错了跑出来的结果漂漂亮亮看着特别有说服力然后就被拿去当结论用了。所以每做完一次统计我都会强迫自己回答一个问题——这个数字回答的到底是现在最流行的还是历史上累计最多的答不上来就先别往下写。
RELATED

相关推荐

Intel 8086手册精讲:从引脚、段地址到指令预取队列

Intel 8086手册精讲:从引脚、段地址到指令预取队列

简介:这份PDF文档是Intel 8086微处理器的官方技术手册(1990年9月版,Order Number 231455-005),面向计算机体系结构学习者、汇编语言开发者及嵌入式硬件工程师,用于系统理解8086的架构、引脚定义与工作模式。…

📅 2026/10/28 4:39:23
智能体沙箱设计:基于gVisor隔离内核的大模型安全生产实践

智能体沙箱设计:基于gVisor隔离内核的大模型安全生产实践

第一批Agent代码进生产环境时,我踩的坑比预想的多得多。最开始的版本图省事,直接把Agent进程裸跑在宿主机上,给它开了文件读写、命令行、网页抓取这几个工具,看起来也跑得挺顺。直到有次测试,Agent因为读到了一个网页里…

📅 2026/10/28 4:39:23
推挽电路设计与调试:交越失真、偏置和散热要点

推挽电路设计与调试:交越失真、偏置和散热要点

聊推挽电路之前,先说个我见过的真实场面:一位朋友调了大半天的音频功放,示波器上正弦波过零点总有那么一小段台阶,声音听起来发毛、发干,他换了好几款运放、换了耦合电容、甚至怀疑是电源纹波,最后发现问题…

📅 2026/10/28 4:34:23
MORE NEWS

更多资讯

📰

AI Agent技能体系:从玩具到生产力工具的关键设计

上手AI Agent这么久,我越来越觉得,真正决定一个Agent能走多远的,不是底层模型多聪明,而是它手里攥着多少把像样的“家伙事儿”。刚接触这个领域的时候,我也和大多数人一样,迷信模型的能力,以为提…

📰

agent-skills:可组合、可验证、可演进的智能体能力单元

1. 什么是 agent-skills:不是插件,不是脚本,而是一套可组合、可验证、可演进的智能体能力单元“agent-skills”这个词最近在开发者社区里频繁出现,但很多人第一反应是——这不就是个 CLI 工具?或者又一个大模型调用封装…

📰

agent-skills:可组合、可验证的智能体技能契约设计

1. 项目概述:什么是 agent-skills?它不是插件,也不是脚本,而是一套可组合、可复用、可验证的智能体能力单元“agent-skills”这个词最近在开发者社区里频繁刷屏,但很多人点开仓库或文档后反而更迷糊了——它既不像传统…

📰

光伏电站智能管理系统:物联网与大数据技术的应用实践

1. 项目概述:鹧鸪云智能电站管理系统去年参与某光伏电站数字化改造时,现场项目经理每天要接打30多通电话核对进度,纸质工单在各部门间流转经常丢失。这种传统管理方式让我意识到,电站运营亟需全链路数字化解决方案。鹧鸪云智能管理…

📰

STM32 ST-Link V2-37-26 驱动安装与稳定烧录指南

简介:本资源是STMicroelectronics官方发布的STLink固件更新工具STSW-LINK007 V2-37-26正式版本,专为STM32/STM8嵌入式开发者设计,解决调试器固件过旧导致的IDE兼容性下降、新MCU型号不识别、编程失败或连接不稳定等核心问题。压缩包共18个文件…

📰

FrameFetch:开源视频剧本对齐与AI分析报告工具

1. 为什么我要做 FrameFetch 这个开源工具做视频内容这行的朋友应该都有体会:一条片子剪完,最耗时间的往往不是剪辑本身,而是反复回看素材、对剧本、写分析报告。尤其是团队协作的时候,导演、编剧、剪辑、运营各看各的&#xff0c…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬