论程序员为娃起名后的动作

miloyang
0 评论
/ /
419 阅读
/
6161 字
26 2023-07

娃还有两月就出生了,名字还没想好,初次为人父母,略显着急了,胡乱翻阅楚辞诗经,甚至求救于ChatGPT,折腾了好久都没心仪名字。

心想稳住,得从根源找起,小孩出生,名字伴随一生,头等大事,不然以后娃怪罪下来可无力反驳,遂写一程序,成事在人,谋事在天意了。   

先翻阅各种资料,得出如下取名技巧:

  • 声韵:就是为了使名字叫起来在声韵方面好听、响亮。最应该注意一点,即慎重取双声叠韵的名字,双声即两个字的声母相同,叠韵即两个字的韵母相同。 如韩凡楠(三字的韵母都是an),念起来就不是那么顺畅,有点拗口的感觉。
  • 声调:即平仄,一二声为平,三四声为仄,平仄相间才会读起来悦耳。所以,姓名中也一样,尽量做到汉字的平仄相间,结尾字宜以平声结尾,因为平声调感觉响亮。
  • 不要使用生僻字
  • 不要使用多音字,让人读起来无所适从,遇到不必要的麻烦
  • 名字笔画不要太多,娃把名字抄写一百遍的时候,会诅咒你

确定需求

  • 支持录入姓氏,通过姓氏的声韵和声调,确定首位名字,如阳姓,则首字排除an、ang音韵字符。如复姓,则取姓氏的最后一字作为基准。
  • 笔画多余某个特定数,舍去
  • 支持单项、多项从词汇源中名字
  • 名字需要平仄相间,如阳读第二声为平,则第二个字为仄,第三字为平,如:阳(yáng)顶(dǐng)天(tiān)
  • 需要词汇源了,感谢 最全古诗词数据库

源码附上

https://github.com/renweimian35/be_name/tree/master
可提pr

词汇源清洗主要编码

  • 由于词汇源数据格式不一致,需清洗词汇源
// 定义接口,后续有新的词汇源,直接实现该接口即可
type source interface {
    wash(path, name string) ([]book.Content, error)
}
// 比如清洗楚辞
type chuCi struct {
    Title   string   `json:"title"`
    Section string   `json:"section"`
    Author  string   `json:"author"`
    Content []string `json:"content"`
}

func (c *chuCi) wash(path, name string) ([]book.Content, error) {
    var cc []chuCi
    if err := resolve(path, &cc); err != nil {
        return nil, err
    }
    var contents []book.Content
    for _, item := range cc {
        contents = append(contents, book.Content{
            Title:      fmt.Sprintf("%s-%s-%s", name, item.Section, item.Title),
            Author:     item.Author,
            Paragraphs: item.Content,
        })
    }
    return contents, nil
}
func AllSource() error {
    var books []book.Info
    allMap := pckSource() // 各词汇源,存储map中
    for serNum, item := range allMap {
        path := fmt.Sprintf("%s%s", basePath, item.path)
        contents, err := item.source.wash(path, item.name)
        if err != nil {
            return nil
        }
        bookInfo := book.Info{
            Book:    item.name,
            SerNum:  serNum,
            Content: contents,
        }
        books = append(books, bookInfo)
    }
    allSource, err := json.Marshal(books)
    if err != nil {
        return err
    }
        // 处理成统一格式输出到文件
    if err := os.WriteFile(sourceName, allSource, os.ModeDevice); err != nil {
        return err
    }
    return nil
}

然后在初始化init中加载该源

var sourceMap map[int][]book.Content
func LoadSource() error {
    sourceMap = make(map[int][]book.Content)
    s, err := os.ReadFile(sourcePath)
    if err != nil {
        return err
    }
    var books []book.Info
    err = json.Unmarshal(s, &books)
    if err != nil {
        return err
    }
    for _, item := range books {
        sourceMap[item.SerNum] = item.Content
    }
    return nil
}

筛选主要相关

  • 定义汉字解析
type Chinese struct {
    Word       string //单汉字
    Pinyin     string
    Stroke     int                //笔画
    YunMu      string             //韵母
    PingZe     int                //平仄:音调1、2声为平,3、4声为仄 ,当前定义:1为平,2为仄
    IsManyRead bool               //是否为多音字
    Explain    result.WordExplain //具体的解释
}

func NewExplain(word string) Chinese {
    ch := Chinese{Word: word}
    ch.pkg()
    return ch
}
type rule struct {
    passYunMu string //不能为的韵母
    pingZe    int    //平仄:音调1、2声为平,3、4声为仄 ,当前定义:1为平,2为仄
}

// 寻找下一个字的规则
func nextWordRule(word string) rule {
    info := explain.NewExplain(word)
    pinZe := 1
    if info.PingZe == 1 {
        pinZe = 2
    }
    return rule{
        passYunMu: info.YunMu,
        pingZe:    pinZe,
    }
}
// 随机取出一个汉字
func randString(para string) (string, error) {
    rand.NewSource(time.Now().UnixNano())
    para = removeNonChineseCharacters(para)
    hanZiRunes := []rune(para)
    if len(hanZiRunes) == 0 {
        return "", errors.New("error")
    }
    // 生成随机索引
    randomIndex := rand.Intn(len(hanZiRunes))
    // 根据随机索引获取对应的汉字
    randomHanZi := string(hanZiRunes[randomIndex])
    return randomHanZi, nil
}

等等,具体源码稍后附上
但这样下来,循环到的,都不太像是名字的名字

继续迭代

  • 增加汉字解释,通过释义来倒推名字,如表示缓慢、行走等等词语,推断出 徐行 二字,来自苏东坡的定风波,何妨吟啸且徐行。
  • 增加名的词组搜索,如果有解释,则名字也比较通顺。应该可以大大提高名字可用性。
  • 增加看过的名字,就不要再次循环到黑名单。
func filterNameByBook(book book.Content, surname string, count int) result.Info {
//核心代码,从某本书中随机匹配名字,且返回
}

成果展示

C:\Users\44312\AppData\Local\JetBrains\GoLand2023.2\tmp\GoLand\___8go_build_main_go.exe
 阳此心(yángcǐxīn),出自 杜甫 的 唐诗-登楼 :
花近高楼伤客心,万方多难此登临。
其中 此心 的含义为:《人同此心,心同此理》 指合情合理的事,大家想法都会相同。   
---------------------------------------------------------------
 阳力争(yánglìzhēng),出自 曹操 的 曹操诗集-蒿里行 :
军合力不齐,踌躇而雁行。
势利使人争,嗣还自相戕。
其中 力争 的含义为:《力争上游》 上游河的上流,比喻先进的地位。努力奋斗,争取先进再先进。 
---------------------------------------------------------------
 阳志闻(yángzhìwén),出自 孔子 的 论语-季氏篇 :
孔子曰:“见善如不及,见不善如探汤;吾见其人矣。吾闻其语矣。隐居以求其志,行义以达其道;吾闻其语矣,未见其人也。”
其中 志闻 的含义为:《博闻强志》 形容知识丰富,记忆力强。
---------------------------------------------------------------
 阳径幽(yángjìngyōu),出自 常建 的 唐诗-题破山寺后禅院 :
曲径通幽处,禅房花木深。
其中 径幽 的含义为:《曲径通幽》 曲弯曲;径小路;幽指深远僻静之处。弯曲的小路,通到幽深僻静的地方。 

哈哈,终于可以匹配出类似名字的汉字,剩下的,只是自己去筛选了

感谢

https://github.com/chinese-poetry/chinese-poetry 提供词汇源

https://github.com/mozillazg/go-pinyin 提供拼音、声韵、声调

https://github.com/pwxcoo/chinese-xinhua 提供汉字释义/笔画、成语大全

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步