golang解析人名组成成分的插件库gonameparts的使用

golang解析人名组成成分的插件库gonameparts的使用

gonameparts是一个将人名拆分为各个组成部分的Go语言库。当您需要处理外部数据源提供的单个值形式的人名,但需要将各个部分存储到数据库中时,这个库非常有用。

作者

James Polera

依赖项

无外部依赖,仅使用Go的标准包

使用示例

基础用法:解析人名并打印各部分

package main

import (
	"fmt"
	"github.com/polera/gonameparts"
)

func main() {
	// 解析人名并打印各部分
	nameString := gonameparts.Parse("Thurston Howell III")
	fmt.Println("FirstName:", nameString.FirstName)
	fmt.Println("LastName:", nameString.LastName)
	fmt.Println("Generation:", nameString.Generation)
	// 输出:
	// FirstName: Thurston
	// LastName: Howell
	// Generation: III
}

高级用法:解析包含多个别名的名字并输出JSON

package main

import (
	"encoding/json"
	"fmt"
	"github.com/polera/gonameparts"
)

func main() {
	// 解析包含多个别名的名字并输出JSON
	multipleAKA := gonameparts.Parse("Tony Stark a/k/a Ironman a/k/a Stark, Anthony a/k/a Anthony Edward \"Tony\" Stark")
	jsonParts, _ := json.Marshal(multipleAKA)
	fmt.Printf("%v\n", string(jsonParts))
	/* 输出:
	{
	    "aliases": [
	        {
	            "aliases": null,
	            "first_name": "Ironman",
	            "full_name": "Ironman",
	            "generation": "",
	            "last_name": "",
	            "middle_name": "",
	            "nickname": "",
	            "provided_name": " Ironman ",
	            "salutation": "",
	            "suffix": ""
	        },
	        {
	            "aliases": null,
	            "first_name": "Anthony",
	            "full_name": "Anthony Stark",
	            "generation": "",
	            "last_name": "Stark",
	            "middle_name": "",
	            "nickname": "",
	            "provided_name": " Stark, Anthony ",
	            "salutation": "",
	            "suffix": ""
	        },
	        {
	            "aliases": null,
	            "first_name": "Anthony",
	            "full_name": "Anthony Edward Stark",
	            "generation": "",
	            "last_name": "Stark",
	            "middle_name": "Edward",
	            "nickname": "\"Tony\"",
	            "provided_name": " Anthony Edward \"Tony\" Stark",
	            "salutation": "",
	            "suffix": ""
	        }
	    ],
	    "first_name": "Tony",
	    "full_name": "Tony Stark",
	    "generation": "",
	    "last_name": "Stark",
	    "middle_name": "",
	    "nickname": "",
	    "provided_name": "Tony Stark a/k/a Ironman a/k/a Stark, Anthony a/k/a Anthony Edward \"Tony\" Stark",
	    "salutation": "",
	    "suffix": ""
	}*/
}

功能说明

gonameparts库可以解析以下人名组成部分:

  • FirstName (名)
  • LastName (姓)
  • MiddleName (中间名)
  • Generation (世代标识,如"Jr."、"III"等)
  • Nickname (昵称)
  • Salutation (称谓)
  • Suffix (后缀)

对于包含多个别名的情况(使用"a/k/a"标识),库会自动解析所有别名并存储在aliases数组中。


更多关于golang解析人名组成成分的插件库gonameparts的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang解析人名组成成分的插件库gonameparts的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


gonameparts - Golang人名解析库使用指南

gonameparts是一个用于解析人名组成成分的Go语言库,它可以将完整的人名拆分为姓、名、中间名、前缀(如Mr.)和后缀(如Jr.)等组成部分。

安装

go get github.com/grokify/gonameparts

基本用法

1. 简单解析人名

package main

import (
	"fmt"
	"github.com/grokify/gonameparts"
)

func main() {
	name := "Mr. John A. Doe Jr."
	
	// 创建Name实例并解析
	n := gonameparts.Name{}
	n.Parse(name)
	
	// 输出各组成部分
	fmt.Printf("原始名字: %s\n", n.Full)
	fmt.Printf("前缀: %s\n", n.Prefix)
	fmt.Printf("名: %s\n", n.First)
	fmt.Printf("中间名: %s\n", n.Middle)
	fmt.Printf("姓: %s\n", n.Last)
	fmt.Printf("后缀: %s\n", n.Suffix)
}

输出结果:

原始名字: Mr. John A. Doe Jr.
前缀: Mr.
名: John
中间名: A.
姓: Doe
后缀: Jr.

2. 处理复杂人名

func complexNameExample() {
	name := "Dr. Juan Carlos de la Vega y López III"
	
	n := gonameparts.Name{}
	n.Parse(name)
	
	fmt.Printf("\n复杂名字解析:\n")
	fmt.Printf("全名: %s\n", n.Full)
	fmt.Printf("前缀: %s\n", n.Prefix)
	fmt.Printf("名: %s\n", n.First)
	fmt.Printf("中间名: %s\n", n.Middle)
	fmt.Printf("姓: %s\n", n.Last)
	fmt.Printf("后缀: %s\n", n.Suffix)
}

3. 构建名字

func buildNameExample() {
	n := gonameparts.Name{
		Prefix: "Dr.",
		First:  "Emily",
		Middle: "Rose",
		Last:   "Smith",
		Suffix: "PhD",
	}
	
	fmt.Printf("\n构建的名字: %s\n", n.String())
}

高级功能

1. 自定义解析选项

func customOptionsExample() {
	// 创建自定义选项
	opts := gonameparts.ParseOptions{
		FixMc:    true,  // 自动修正"Mc"开头的姓氏
		FixApostrophe: true,  // 处理撇号
	}
	
	name := "McDonald O'Connor"
	n := gonameparts.Name{}
	n.ParseWithOptions(name, opts)
	
	fmt.Printf("\n自定义选项解析:\n")
	fmt.Printf("姓: %s\n", n.Last) // 输出 McDonald O'Connor
}

2. 国际化支持

gonameparts支持多种语言的人名解析:

func internationalExample() {
	// 中文名字
	nameCN := "张 三"
	nCN := gonameparts.Name{}
	nCN.Parse(nameCN)
	fmt.Printf("\n中文名字:\n")
	fmt.Printf("姓: %s\n", nCN.Last) // 张
	fmt.Printf("名: %s\n", nCN.First) // 三
	
	// 日文名字
	nameJP := "田中 太郎"
	nJP := gonameparts.Name{}
	nJP.Parse(nameJP)
	fmt.Printf("\n日文名字:\n")
	fmt.Printf("姓: %s\n", nJP.Last) // 田中
	fmt.Printf("名: %s\n", nJP.First) // 太郎
}

实际应用示例

数据库人名标准化

func normalizeNames(names []string) []gonameparts.Name {
	var normalized []gonameparts.Name
	
	for _, name := range names {
		n := gonameparts.Name{}
		n.Parse(name)
		normalized = append(normalized, n)
	}
	
	return normalized
}

生成邮件用户名

func generateEmailUsername(name gonameparts.Name) string {
	// 格式: first.last@company.com
	return fmt.Sprintf("%s.%s", strings.ToLower(name.First), strings.ToLower(name.Last))
}

注意事项

  1. 对于非西方名字(如东亚名字),可能需要调整解析逻辑
  2. 复杂姓氏(如包含"de la"等)可能需要特殊处理
  3. 库默认假设名字顺序是"前缀 名 中间名 姓 后缀"

gonameparts是一个轻量级但功能强大的人名解析库,适用于大多数西方名字的解析需求。对于更复杂的需求,可能需要结合其他自然语言处理工具。

回到顶部