From 1803c768eea8cdbfb21c797461d753fb238d150f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 30 Nov 2022 16:27:07 +0800 Subject: [PATCH] pass tests & update readme --- README.md | 83 +++++++++++++++++------------------- example_parallel_cut_test.go | 4 +- example_test.go | 24 +++++------ jieba_test.go | 5 +++ 4 files changed, 56 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 7f1679c..5cc87bf 100755 --- a/README.md +++ b/README.md @@ -1,19 +1,18 @@ #结巴分词 Go 语言版:jieba +[![GoDoc](https://godoc.org/github.com/fumiama/jieba?status.svg)](https://godoc.org/github.com/fumiama/jieba) -[![Build Status](https://travis-ci.org/wangbin/jieba.png?branch=master)](https://travis-ci.org/wangbin/jieba) [![GoDoc](https://godoc.org/github.com/fumiama/jieba?status.svg)](https://godoc.org/github.com/fumiama/jieba) +[结巴分词](https://github.com/fxsjy/jieba) 是由 [@fxsjy](https://github.com/fxsjy) 使用 Python 编写的中文分词组件,本仓库是结巴分词的 Golang 语言实现,修改于[jiebago](https://github.com/wangbin/jiebago),优化了速度与性能,增加了从`fs.File`加载字典等功能。 -[结巴分词](https://github.com/fxsjy/jieba) 是由 [@fxsjy](https://github.com/fxsjy) 使用 Python 编写的中文分词组件,Iiebago 是结巴分词的 Golang 语言实现。 - - -## 安装 - -``` -go get github.com/fumiama/jieba/... -``` ## 使用 +``` +go get -d github.com/fumiama/jieba +``` + +## 示例 + ``` package main @@ -23,53 +22,47 @@ import ( "github.com/fumiama/jieba" ) -var seg jieba.Segmenter +func main() { + seg, err := LoadDictionaryAt("dict.txt") + if err != nil { + panic(err) + } -func init() { - seg.LoadDictionary("dict.txt") -} + fmt.Print("【全模式】:") + fmt.Println(seg.CutAll("我来到北京清华大学")) -func print(ch <-chan string) { - for word := range ch { - fmt.Printf(" %s /", word) - } - fmt.Println() -} + fmt.Print("【精确模式】:") + fmt.Println(seg.Cut("我来到北京清华大学", false)) -func Example() { - fmt.Print("【全模式】:") - print(seg.CutAll("我来到北京清华大学")) + fmt.Print("【新词识别】:") + fmt.Println(seg.Cut("他来到了网易杭研大厦", true)) - fmt.Print("【精确模式】:") - print(seg.Cut("我来到北京清华大学", false)) - - fmt.Print("【新词识别】:") - print(seg.Cut("他来到了网易杭研大厦", true)) - - fmt.Print("【搜索引擎模式】:") - print(seg.CutForSearch("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", true)) + fmt.Print("【搜索引擎模式】:") + fmt.Println(seg.CutForSearch("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", true)) } ``` 输出结果: ``` -【全模式】: 我 / 来到 / 北京 / 清华 / 清华大学 / 华大 / 大学 / - -【精确模式】: 我 / 来到 / 北京 / 清华大学 / - -【新词识别】: 他 / 来到 / 了 / 网易 / 杭研 / 大厦 / - -【搜索引擎模式】: 小明 / 硕士 / 毕业 / 于 / 中国 / 科学 / 学院 / 科学院 / 中国科学院 / 计算 / 计算所 / , / 后 / 在 / 日本 / 京都 / 大学 / 日本京都大学 / 深造 / +【全模式】:[我 来到 北京 清华 清华大学 华大 大学] +【精确模式】:[我 来到 北京 清华大学] +【新词识别】:[他 来到 了 网易 杭研 大厦] +【搜索引擎模式】:[小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 , 后 在 日本 京都 大学 日本京都大学 深造] ``` 更多信息请参考[文档](https://godoc.org/github.com/fumiama/jieba)。 ## 分词速度 - - - 2MB / Second in Full Mode - - 700KB / Second in Default Mode - - Test Env: AMD Phenom(tm) II X6 1055T CPU @ 2.8GHz; 《金庸全集》 - -## 许可证 - -MIT: http://wangbin.mit-license.org +```c +goos: darwin +goarch: amd64 +pkg: github.com/fumiama/jieba +cpu: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz +BenchmarkCutNoHMM-8 50101 22889 ns/op 4.67 MB/s 24492 B/op 148 allocs/op +BenchmarkCut-8 47473 25152 ns/op 4.25 MB/s 31310 B/op 185 allocs/op +BenchmarkCutAll-8 81760 14286 ns/op 7.49 MB/s 22746 B/op 75 allocs/op +BenchmarkCutForSearchNoHMM-8 49009 24371 ns/op 4.39 MB/s 26421 B/op 157 allocs/op +BenchmarkCutForSearch-8 44643 26597 ns/op 4.02 MB/s 33224 B/op 194 allocs/op +PASS +ok github.com/fumiama/jieba 8.769s +``` diff --git a/example_parallel_cut_test.go b/example_parallel_cut_test.go index 508ad35..3ccf626 100755 --- a/example_parallel_cut_test.go +++ b/example_parallel_cut_test.go @@ -32,9 +32,6 @@ func worker() { } func Example_parallelCut() { - // Set the number of goroutines - runtime.GOMAXPROCS(numThreads) - // open file for segmentation file, err := os.Open("README.md") if err != nil { @@ -83,6 +80,7 @@ func Example_parallelCut() { } t1 := time.Now() + close(result) // Write the segments into a file for verify outputFile, _ := os.OpenFile("parallelCut.log", os.O_CREATE|os.O_WRONLY, 0600) diff --git a/example_test.go b/example_test.go index 640a2a0..a042e34 100755 --- a/example_test.go +++ b/example_test.go @@ -22,10 +22,10 @@ func Example() { fmt.Print("【搜索引擎模式】:") fmt.Println(seg.CutForSearch("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", true)) // Output: - // 【全模式】: 我 / 来到 / 北京 / 清华 / 清华大学 / 华大 / 大学 / - // 【精确模式】: 我 / 来到 / 北京 / 清华大学 / - // 【新词识别】: 他 / 来到 / 了 / 网易 / 杭研 / 大厦 / - // 【搜索引擎模式】: 小明 / 硕士 / 毕业 / 于 / 中国 / 科学 / 学院 / 科学院 / 中国科学院 / 计算 / 计算所 / , / 后 / 在 / 日本 / 京都 / 大学 / 日本京都大学 / 深造 / + // 【全模式】:[我 来到 北京 清华 清华大学 华大 大学] + // 【精确模式】:[我 来到 北京 清华大学] + // 【新词识别】:[他 来到 了 网易 杭研 大厦] + // 【搜索引擎模式】:[小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 , 后 在 日本 京都 大学 日本京都大学 深造] } func Example_suggestFrequency() { @@ -67,15 +67,15 @@ func Example_suggestFrequency() { fmt.Print("After:") fmt.Println(seg.Cut(sentence, false)) // Output: - // Before: 超敏 / C / 反应 / 蛋白 / 是 / 什么 / ? / + // Before:[超敏 C 反应 蛋白 是 什么 ?] // 超敏C反应蛋白 current frequency: 0.000000, suggest: 1.000000. - // After: 超敏C反应蛋白 / 是 / 什么 / ? / - // Before: 如果 / 放到 / post / 中将 / 出错 / + // After:[超敏C反应蛋白 是 什么 ?] + // Before:[如果 放到 post 中将 出错] // 中将 current frequency: 763.000000, suggest: 494.000000. - // After: 如果 / 放到 / post / 中 / 将 / 出错 / - // Before: 今天天气 / 不错 / + // After:[如果 放到 post 中 将 出错] + // Before:[今天天气 不错] // 今天天气 current frequency: 3.000000, suggest: 0.000000. - // After: 今天 / 天气 / 不错 / + // After:[今天 天气 不错] } func Example_loadUserDictionary() { @@ -93,6 +93,6 @@ func Example_loadUserDictionary() { fmt.Print("After:") fmt.Println(seg.Cut(sentence, true)) // Output: - // Before: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 / - // After: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 / + // Before:[李小福 是 创新 办 主任 也 是 云 计算 方面 的 专家] + // After:[李小福 是 创新办 主任 也 是 云计算 方面 的 专家] } diff --git a/jieba_test.go b/jieba_test.go index ee8f025..89c1a60 100755 --- a/jieba_test.go +++ b/jieba_test.go @@ -791,6 +791,7 @@ func TestLoadUserDictionary(t *testing.T) { func BenchmarkCutNoHMM(b *testing.B) { sentence := "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作" + b.SetBytes(int64(len(sentence))) b.ResetTimer() for i := 0; i < b.N; i++ { seg.Cut(sentence, false) @@ -799,6 +800,7 @@ func BenchmarkCutNoHMM(b *testing.B) { func BenchmarkCut(b *testing.B) { sentence := "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作" + b.SetBytes(int64(len(sentence))) b.ResetTimer() for i := 0; i < b.N; i++ { seg.Cut(sentence, true) @@ -807,6 +809,7 @@ func BenchmarkCut(b *testing.B) { func BenchmarkCutAll(b *testing.B) { sentence := "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作" + b.SetBytes(int64(len(sentence))) b.ResetTimer() for i := 0; i < b.N; i++ { seg.CutAll(sentence) @@ -815,6 +818,7 @@ func BenchmarkCutAll(b *testing.B) { func BenchmarkCutForSearchNoHMM(b *testing.B) { sentence := "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作" + b.SetBytes(int64(len(sentence))) b.ResetTimer() for i := 0; i < b.N; i++ { seg.CutForSearch(sentence, false) @@ -823,6 +827,7 @@ func BenchmarkCutForSearchNoHMM(b *testing.B) { func BenchmarkCutForSearch(b *testing.B) { sentence := "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作" + b.SetBytes(int64(len(sentence))) b.ResetTimer() for i := 0; i < b.N; i++ { seg.CutForSearch(sentence, true)