您的位置:首页 > 其它

用Mathematica给宝宝起名字

2010-11-21 12:30 141 查看
老婆有孕6个月了,已经开始考虑宝宝的小衣服、小鞋子了。然而,对于我这个“游手好闲”的父亲的而言,最大的事情莫过于给宝宝起个名字。我们之前有个女儿(就是玩数独的那个),名叫“吴天笑”。现在是第二胎了,我们没有违反“人类性别平衡法”动机,所以至今也不知道胎儿的性别。因此我还要做好两手准备,一个男孩名,另一个女孩名。

从大女儿的名字中或许已包含了我的潜意识中的命名法。“吴”自然是我家的姓。 “天”是吴的下半部分,这个也是要的。“笑”希望找一个和“天”和“吴”下半部分非常相像的字。名字的寓意自然是合家欢乐,幸福美好......

第一步:准备数据库,首先我调用Mathematica自带的3755个最常用汉字。

charList=Drop[Flatten[Table[FromCharacterCode[{i,j},"CP936"],{i,160+16,160+55},{j,161,254}]],-5];


后来我绝的最常用汉字数量太少,干脆搞个20000汉字库吧。

第二步:将汉字转换为数值点矩阵。

单核计算:

pixedMatrix[word_String]:=ImageData[Binarize[Rasterize[Style[word,FontSize-> 15,FontFamily-> "SimSun"]]]];


多核并行计算:

pixedMatrixP[word_String]:=ImageData[Binarize[Rasterize[Style[word,FontSize-> 15,FontFamily-> "SimSun"]]]];

DistributeDefinitions[pixedMatrixP];

timeBefore=AbsoluteTime[];
imageList=ParallelMap[pixedMatrixP,Take[charList,20903]];
timeused=AbsoluteTime[]-timeBefore


第三步:寻找目标最邻近的字符。举个例子:“吴”

Image[pixedMatrix["吴"]]

pixedMatrix["吴"] // MatrixForm

Image[#] & /@ Nearest[imageList, pixedMatrix["吴"], 20]


我要的是找一个和“吴”的下半部首,“天”相接近的汉字,至于上半部分可以任意。

n=5;
Image[target=Join[Table[Table[1,{i,15}],{j,n}],Drop[pixedMatrix["吴"],n]]]

convertList=Join[Table[Table[1, {i, 15}], {j, n}],Drop[#,n]]&/@imageList;
result=Flatten[Position[convertList,#]&/@Nearest[convertList,target,20]];
finding=DeleteDuplicates[Image[#]&/@(imageList[[#]]&/@result)]




所以我想,是男孩的话就叫“吴天昊”,是女孩的话就叫“吴天美”或者“吴天芙”。其实在任何一个时代、任何一个国家,每一个孩子的名字,在他们父母的心目中那肯定都是最好的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: