以前在项目里用到中文分词,对中文分词库做了一些比较。
- https://github.com/huichen/sego
- https://github.com/wangbin/jiebago
- https://github.com/go-ego/gse -- 借鉴前两者设计
- https://github.com/yanyiwu/gojieba -- 核心算法底层由C++实现
前面3个都是纯 go 实现,优势是使用方便;最后一个底层由C++实现,性能和消耗资源比较少,但不能跨平台编译。
因为 go-ego/gse
是后来出现并借鉴前两者,还在开发中,功能较多,就拿它与 yanyiwu/gojieba
做个简单的测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func BenchmarkExtractorJieba(b *testing.B) {
// equals with:
// x := NewExtractor(DICT_PATH, HMM_PATH, USER_DICT_PATH, IDF_PATH, STOP_WORDS_PATH)
x := gojieba.NewJieba()
defer x.Free()
s := "我是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。"
b.ResetTimer()
// Stop Timer before x.Free()
defer b.StopTimer()
for i := 0; i < b.N; i++ {
//x.Extract(s, 10)
x.ExtractWithWeight(s, 10)
}
}
func BenchmarkExtractorGse(b *testing.B) {
x,_ := gse.New()
var te idf.TagExtracter
te.WithGse(x)
_ = te.LoadIdf()
defer x.Empty()
s := "我是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。"
b.ResetTimer()
defer b.StopTimer()
for i := 0; i < b.N; i++ {
te.ExtractTags(s, 10)
}
}
测试
1
go test -bench "Extractor" -benchmem -benchtime 10s
结果:
1
2
3
4
5
6
goos: darwin
goarch: amd64
pkg: fenci
cpu: Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
BenchmarkExtractorJieba-8 427759 28719 ns/op 856 B/op 17 allocs/op
BenchmarkExtractorGse-8 210597 52466 ns/op 16439 B/op 247 allocs/op
结论
如果没有特别的原因不能进入虚拟机里编译,还是继续使用 yanyiwu/gojieba
,go-ego/gse
是后来者,功能强大,又支持多种语言,继续保持关注。
本文网址: https://golangnote.com/topic/292.html 转摘请注明来源