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))
}
注意事项
- 对于非西方名字(如东亚名字),可能需要调整解析逻辑
- 复杂姓氏(如包含"de la"等)可能需要特殊处理
- 库默认假设名字顺序是"前缀 名 中间名 姓 后缀"
gonameparts是一个轻量级但功能强大的人名解析库,适用于大多数西方名字的解析需求。对于更复杂的需求,可能需要结合其他自然语言处理工具。