February 10, 2005

关于中国人姓名的算法说明::[Source]


Liang

这个事情本来是不原意提起的,只是很多人认为我做到姓名的搜索误差太大,这里也就说明一下,以免让大家认为蒙在鼓里。

1. 查查全中国有多少人的名字和你一模一样 是纯粹的娱乐性产品。

2. 计算机非人口普查部门和公安部门,因此任何输入的词语都将给予解释。

下面介绍本系统的算法,如果你系高中毕业,对概率统计有一定的认识,可以继续:

算法A :
前文已经声明,我通过网络采集了大约40多万人的姓名,这期间大约有20万的姓名是独立的,现在这个数据库还在变大,今天已经大约有100万的姓名了。

我们假设在这100万的姓名分布和全国13亿人的姓名的分布相近,那么当你搜索“张三”这样一个姓名的话,如果我的数据库里有70个张三的话,那么全国按照样本的分布就应该是 70*1300000000/1000000 = 91000 就是说全国有91000个人都叫张三。

误差分析 Sigma = f_sigma(70) + f_sigma(1300000000) + f_sigma(1000000) = 11050 就是说,全国张三最多是 91000+11050 = 102050 个张三,最少91000-11050 = 79950 个张三,以上为70%左右的置信区间。

算法B:
根据姓名的概率 = 姓的概率*名的概率
建立在姓和名的概率分布是独立的分布,P(姓, 名) = P(姓) * P(名)

在100万的数据里,我大约收集到2800个姓,和24000个名,这样关于姓和名的分布就很合理的建立起来了。例如当我们输入“张三”的时候,算法将是先计算“张”作为姓的概率,然后计算“三”作为名的概率,然后将两者相乘,再乘以全国的总人数就得到多少个张三。

P(张) = 0.602% , "三"作为名的概率为 P(三) = 0.4%,因此 Num(张三) = P(张) * P(三) *1300000000 = 31200

因此根据此算法得到张三全国一共有31200个。

误差分析,误差来源主要是来自2方面,姓、名的统计误差,姓与名之间的非独立分布的系统误差。例如一个人名子可以叫“刘八”却一般不会叫“王八”,因此实际上姓和名是一个关系的分布。

后续:
1] 对于这样一个查询自己姓名的系统,我花了大约1个小时写代码和算法,结果完全没有想到后续竟然有那么大的波澜,在短短的几天内,差不多有30万的人访问查询,最后不得不将我blog上的页面直接定向到了booso.com并且关闭了留言。

2] 由于这30万人的访问,又给我的数据库里添加了大约30万的数据,这样实际上数据将更加趋于完整和实效,数据源的扩大,将进一步提高查询的精确度。

竟然流量翻了若干倍,Alexa 一度冲上了3000多名,实在是中国人多力量大!

Posted at February 10, 2005 11:29 AM by Liang at 11:29 AM | Comments (0) | TrackBack(1) | Booso!| Niu.la收藏!


Trackback

You can ping this entry by using http://www.wespoke.com/cgi-bin/mt/mt-tb.cgi/714

Trackbacked from http://party-poker-icon-en.isismedia.com with Very nice. I hope you'll update very soon. on .

Comments

Posting of new comments has been disabled for this post.
所有发表