golang从字符串提取值并填充结构体的NLP解析插件nlp的使用
Golang 从字符串提取值并填充结构体的 NLP 解析插件 nlp 的使用
nlp
是一个通用的多语言自然语言处理器,它可以解析文本中的数据并返回填充好的模型。
支持的类型
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64
float32 float64
string
time.Time
time.Duration
安装
// 需要 go1.8+ 版本
go get -u github.com/shixzie/nlp
工作原理
RegisterModel(i interface{}, samples []string, ops …ModelOption) error
RegisterModel 接收 3 个参数:一个空结构体、一组样本和一些模型选项。
空结构体让 nlp 知道文本中所有可能的值,例如:
type Song struct {
Name string // 字段必须导出
Artist string
ReleasedAt time.Time
}
err := nl.RegisterModel(Song{}, someSamples, nlp.WithTimeFormat("2006"))
if err != nil {
panic(err)
}
// ...
样本是 nlp 的关键部分,因为它们设置了关键字之间的"界限",同时也用于选择使用哪个模型来处理表达式。
样本必须有特殊的语法来设置这些"界限"和"关键字":
songSamples := []string{
"play {Name} by {Artist}",
"play {Name} from {Artist}",
"play {Name}",
"from {Artist} play {Name}",
"play something from {ReleasedAt}",
}
Learn() error
Learn 使用 NaiveBayes 算法将所有模型样本映射到它们各自的模型。Learn() 还会训练所有已注册的模型,使它们能够适应未来的表达式。
// 必须在所有模型注册后调用,且在调用 nl.P() 之前调用
err := nl.Learn()
if err != nil {
panic(err)
}
// ...
P(expr string) interface{}
P 首先询问训练好的算法应该使用哪个模型,一旦我们获得了正确的且已经训练好的模型,我们就让它适应表达式。
使用示例
type Song struct {
Name string
Artist string
ReleasedAt time.Time
}
songSamples := []string{
"play {Name} by {Artist}",
"play {Name} from {Artist}",
"play {Name}",
"from {Artist} play {Name}",
"play something from {ReleasedAt}",
}
nl := nlp.New()
err := nl.RegisterModel(Song{}, songSamples, nlp.WithTimeFormat("2006"))
if err != nil {
panic(err)
}
err = nl.Learn() // 必须在所有模型注册后调用,且在调用 P 之前
if err != nil {
panic(err)
}
// 学习后可以多次调用 P
s := nl.P("hello sir can you pleeeeeease play King by Lauren Aquilina")
if song, ok := s.(*Song); ok {
fmt.Println("Success")
fmt.Printf("%#v\n", song)
} else {
fmt.Println("Failed")
}
// 输出:
//
// Success
// &main.Song{Name: "King", Artist: "Lauren Aquilina"}
更多关于golang从字符串提取值并填充结构体的NLP解析插件nlp的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复