如何用程序给宝宝取名

如何用程序给宝宝取名

写在前面

好的名字包含父母对宝宝美好寄托,程序只是根据一些规则去生成名字,由于NLP、语料等的限制,程序生成的名字只能作为参考,质量肯定达不到宝妈宝爸钻研推敲的水平,所以不用妄想全自动化生产,还是老老实实动脑比较好。

部分生成结果

sample_result

关于程序

Github

https://github.com/clg456852/Baby_name

程序使用Python编写,版本2.7。程序只考虑了的双字名字。

依赖库:

  • jieba
  • snowNLP
  • bs4
  • threadpool
  • zhconv

由于涉及到爬虫,如果在公司跑的话,需要设置代理。同时在 http://auth-proxy.oa.com/DevNetTempVisit.aspx 申请访问外网权限。

如何取个好名字

前面说了,一个好的名字,最重要的是包含父母对宝宝美好寄托。
在此之上,尽量满足意、音、形,同时中国文化的八字也是一个考虑选项。

意: 名字最重要的属性,如希望宝宝开心取“乐”、“欣”字等,个人觉得如果,如果第二个字是动词的话,或者名字是形容词,更能获得好的寓意,如“怀乐“、”欣然“。

音: 如果名字其中的一个字的韵母与姓氏发音类似,则名字读起来会比较平滑,但不能两个都是,可能会比较绕口,同时最后一个字最好是舌根音,读起来短促有力。

形: 如果姓氏是上下结构,那么名字的其他字不宜再用相同结构。

八字: 八字平衡是最好的,通过八字的异类和同类来确定八字的喜用神。其中用神用来平衡八字,而喜神是生成用神的属性。

原理

由上面的分析,程序的实现方案为:从语料(古典诗词)中获取词汇,分析词汇的意、音、八字、五格,给出最靠谱的若干的作为选择。

我整理的语料有:诗经、楚辞、唐诗300首、宋词300首、论语、全唐宋词等,有一些已经与处理过了,以‘corpus’开头。从语料中获取语句,根据一定的规则组词、分词,获取满足目标函数的名词作为潜在的名字。

这里目标函数我没有考虑名字的形,是因为这个属性属于景上添花的类型,宝妈宝爸可以挑选过程自行决定。

计算名字的八字、五格,我是用爬虫提交表单 https://www.meimingteng.com/Naming/Default.aspx?Tag=4 ,再分析返回结果。所以短时间密集发送表单,可能会被服务器封IP,需要大量爬取的话最好建个代理池。

语料 -〉 组词 -〉词组分析 -〉获取寓意、八字得分 -〉排序输出

为了满足上面的需求,采用一些现有的第三方包来实现部分功能。

其中:

snowNLP可以分析词语的词性、声母、情感分析。

jieba可以对现有的语料进行分词。

zhconv用来将繁体语料转成简体版本。

bs4用来分析爬虫爬到的结果。

threadpool利用多线程来加速爬虫请求。

使用方法

list

运行create_name脚本,可从语料中组词并提交表单到姓名打分网。
如果已经有名字可以直接运行name_score_post脚本,还还有其他一些是用做辅助工具的脚本。

程序结构

程序最主要的脚本有两个:‘create_name.py’ 和 ’name_score_post.py’。

  • create_name

从语料中组词,挑选满足目标函数的词,输出到目标文件中。

默认从楚辞里组词,可以自行选择其他语料,全唐宋词规模太大,不推荐。

    # 诗经
    # create_name_from(convertZh.shi_jing)
    # 楚辞
    create_name_from(convertZh.chu_ci)
    name_score_post.create_name_excel_from(convertZh.chu_ci)
    # 300 tang
    # create_name_from(convertZh.tang_300_peom)
    # 300 chu
    # create_name_from(convertZh.song_300_verse)
    # quan tang song verse
    # create_name_from(convertZh.all_tang_song_verse)
    # lun_lu
    # create_name_from(convertZh.lun_yu)

组词规则: 在句首、句尾、句间挑选字来组词,子句内用jieba分词去取的句内的词。

def create_names_based_on(text_line):
    clauses = clauses_from_sentence(text_line)
    names = []
    # 子句内
    for clause in clauses:
        if len(clause) > 3:
            add_new_name(clause[0] + clause[1], names)
            add_new_name(clause[-2] + clause[-1], names)
            add_new_name(clause[-3] + clause[-1], names)

            seg_list = jieba.cut(clause, cut_all=True)
            for seg in seg_list:
                if len(seg) == 2:
                    add_new_name(seg, names)
                if len(seg) == 4:
                    add_new_name(seg[0] + seg[1], names)
                    add_new_name(seg[-2] + seg[-1], names)
    # 子句间
    if len(clauses) > 1:
        for i in range(len(clauses)):
            if (i + 1) < len(clauses):
                clause_pre = clauses[i]
                clause_post = clauses[i+1]
                add_new_name(clause_pre[-1] + clause_post[-1], names)
                add_new_name(clause_pre[0] + clause_post[0], names)
                idx0 = random.randint(0, len(clause_pre)-1)
                idx1 = random.randint(0, len(clause_post)-1)
                add_new_name(clause_pre[idx0] + clause_post[idx1], names)
            if (i + 2) < len(clauses):
                clause_pre = clauses[i]
                clause_post = clauses[i + 2]
                add_new_name(clause_pre[-1] + clause_post[-1], names)
                add_new_name(clause_pre[0] + clause_post[0], names)
                idx0 = random.randint(0, len(clause_pre)-1)
                idx1 = random.randint(0, len(clause_post)-1)
                add_new_name(clause_pre[idx0] + clause_post[idx1], names)

    names.append(u"\n来源: " + text_line)
    return names

目标函数: 基于snowNLP实现,用来挑选正向的、词性、发声满足特定规则的词汇。

s = SnowNLP(n)
if s.sentiments > 0.6:
if s.pinyin:
    for py in s.pinyin:
        if (py.encode('utf-8').endswith(finals_consonant) or py.encode('utf-8').endswith(finals_consonant[-1]))\
                and not py.encode('utf-8').startswith(initial_consonant):
            # Pin Yin
            has_added = True
            postive_targets.write(n.encode('utf-8') + "\n")
            print(n.encode('utf-8') + '\n')
    if s.tags and not has_added:
        for tag in s.tags:
            # 获取词性
            if not has_added and ((tag[0] == n[0] and tag[1] == u'v') or tag[1] == u'a'):
                has_added = True
                postive_targets.write(n.encode('utf-8') + "\n")
                print(n.encode('utf-8') + '\n')
            if len(s.tags) > 2:
                assert 0
                                    
  • name_score_post

读取目标文件,利用爬虫获取姓名在&网站&的分析结果,获取姓名的文化印象、八字、五格方面的得分,输出Excel表格以供参考。

def compute_score_of_name(name):
    form['ctl00$ContentPlaceHolder1$InputBasicInfo1$tbMingWords'] = name
    try:
        paramsData = urllib.urlencode(form)
        request = urllib2.Request(url, paramsData)
        # print("HTTP GET")
        response = urllib2.urlopen(request, timeout=20)
        # print("Respone Successfully")
        content = response.read()
    except Exception as e:
        print("Error: " + str(e))
        return None

    soup = BeautifulSoup(content, 'html.parser')

    # print(soup)
    correct_response = False
    for node in soup.find_all("table", class_="naming2"):
        node_content = node.get_text()
        if u"评分:" in node_content:
            correct_response = True
            score_culture = get_score_of("文化印象", node, soup)
            score_bazi = get_score_of("五行八字", node, soup)
            score_shengxiao = get_score_of("生  肖", node, soup)
            score_wuge = get_score_of("五格数理", node, soup)
            name_score = {
                            '文化印象': score_culture,
                            '五行八字': score_bazi,
                            '生  肖': score_shengxiao,
                            '五格数理': score_wuge
                        }
            return name_score
    # TODO: 不能处理的名字
    if not correct_response:
        return None

关于结果

理想很丰满,现实很骨感。

目前使用的NLP与用来爬分析结果的网站,均没有表现得很“智能”,所以生成的结果可用率不高,像“无父”、“无母”这种词都能取得很高的分……

不过以更佛系的态度看,生成的结果有一些还是能够给宝妈宝爸一些启发的。还是那句话,名字是父母给宝宝的一份礼物,还是更积极地参与进去比较好,这份经历本身也是甜蜜美丽的财产。

致谢

meimingteng
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • jieba分词,学习,为了全面了解该模块,,预设学习路线:官方文档——优秀博客文章——实践学习 官方文档部分 (文...
    竹林徒儿阅读 4,082评论 1 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 感赏儿子周末过得很愉快,周五晚上和同学一起看电影吃饭,看完电影,同学的爸爸还把他们送回家。感恩! 感赏儿子周末都按...
    噜小噜阅读 183评论 3 4
  • 我是一个伪装了的人。 我很高兴我又找到一个可以无所顾虑挥洒自己的空间,但我开始担心我写着写着又开始塑造一个我不曾遇...
    惑多惑少阅读 178评论 0 0
  • 我想拥有超越平凡的力量
    韩灰灰阅读 135评论 0 1