GolangNote

Golang笔记

golang 中文分词库比较

Permalink

以前在项目里用到中文分词,对中文分词库做了一些比较。

golang 中文分词库比较

前面3个都是纯 go 实现,优势是使用方便;最后一个底层由C++实现,性能和消耗资源比较少,但不能跨平台编译。

因为 go-ego/gse 是后来出现并借鉴前两者,还在开发中,功能较多,就拿它与 yanyiwu/gojieba 做个简单的测试:

Go: 中文分词性能测试 gse VS 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)
	}
}

测试

Bash: bench
1
go test -bench "Extractor" -benchmem -benchtime 10s

结果:

plaintext:
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/gojiebago-ego/gse 是后来者,功能强大,又支持多种语言,继续保持关注。

本文网址: https://golangnote.com/topic/292.html 转摘请注明来源

Related articles

Golang sync.WaitGroup 的 Wait 超时处理

sync.WaitGroup 使用 `Add(1)`、`Done()`、`Wait()`组合来实现多协程等待,如果某一协程未能合理处理错误,导致无法退出,此时需要引入超时机制。下面是一种超时处理方法。...

Write a Comment to "golang 中文分词库比较"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.20 Processed in 1ms