分享

用Mathematica给宝宝起名字

 shuaixinerwei 2012-11-25

用Mathematica给宝宝起名字

567人阅读 评论(0) 收藏 举报

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

 

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

 

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

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

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

 

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

单核计算:

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

多核并行计算:

  1. pixedMatrixP[word_String]:=ImageData[Binarize[Rasterize[Style[word,FontSize-> 15,FontFamily-> "SimSun"]]]];  
  2.   
  3. DistributeDefinitions[pixedMatrixP];  
  4.   
  5. timeBefore=AbsoluteTime[];  
  6. imageList=ParallelMap[pixedMatrixP,Take[charList,20903]];  
  7. timeused=AbsoluteTime[]-timeBefore  
  

 

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

  1. Image[pixedMatrix["吴"]]  
  2.   
  3. pixedMatrix["吴"// MatrixForm   
  4.   
  5. Image[#] & /@ Nearest[imageList, pixedMatrix["吴"], 20]  
  

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

  1. n=5;  
  2. Image[target=Join[Table[Table[1,{i,15}],{j,n}],Drop[pixedMatrix["吴"],n]]]  
  3.   
  4. convertList=Join[Table[Table[1, {i, 15}], {j, n}],Drop[#,n]]&/@imageList;  
  5. result=Flatten[Position[convertList,#]&/@Nearest[convertList,target,20]];  
  6. finding=DeleteDuplicates[Image[#]&/@(imageList[[#]]&/@result)]  
  

 

      所以我想,是男孩的话就叫“吴天昊”,是女孩的话就叫“吴天美”或者“吴天芙”。其实在任何一个时代、任何一个国家,每一个孩子的名字,在他们父母的心目中那肯定都是最好的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多