golang中文分词算法实现插件库gojiebajieba的使用
Golang中文分词算法实现插件库gojieba的使用
简介
GoJieba是"结巴"中文分词的Golang语言版本。
- 支持多种分词方式,包括: 最大概率模式, HMM新词发现模式, 搜索引擎模式, 全模式
- 核心算法底层由C++实现,性能高效。
- 字典路径可配置,NewJieba(…string), NewExtractor(…string) 可变形参,当参数为空时使用默认词典(推荐方式)
安装
go get github.com/yanyiwu/gojieba
使用示例
下面是一个完整的GoJieba使用示例代码:
package main
import (
"fmt"
"strings"
"github.com/yanyiwu/gojieba"
)
func main() {
var s string
var words []string
use_hmm := true
x := gojieba.NewJieba()
defer x.Free()
s = "我来到北京清华大学"
words = x.CutAll(s)
fmt.Println(s)
fmt.Println("全模式:", strings.Join(words, "/"))
words = x.Cut(s, use_hmm)
fmt.Println(s)
fmt.Println("精确模式:", strings.Join(words, "/"))
s = "比特币"
words = x.Cut(s, use_hmm)
fmt.Println(s)
fmt.Println("精确模式:", strings.Join(words, "/"))
x.AddWord("比特币")
// `AddWordEx` 支持指定词语的权重,作为 `AddWord` 权重太低加词失败的补充。
// `tag` 参数可以为空字符串,也可以指定词性。
// x.AddWordEx("比特币", 100000, "")
s = "比特币"
words = x.Cut(s, use_hmm)
fmt.Println(s)
fmt.Println("添加词典后,精确模式:", strings.Join(words, "/"))
s = "他来到了网易杭研大厦"
words = x.Cut(s, use_hmm)
fmt.Println(s)
fmt.Println("新词识别:", strings.Join(words, "/"))
s = "小明硕士毕业于中国科学院计算所,后在日本京都大学深造"
words = x.CutForSearch(s, use_hmm)
fmt.Println(s)
fmt.Println("搜索引擎模式:", strings.Join(words, "/"))
s = "长春市长春药店"
words = x.Tag(s)
fmt.Println(s)
fmt.Println("词性标注:", strings.Join(words, ","))
s = "区块链"
words = x.Tag(s)
fmt.Println(s)
fmt.Println("词性标注:", strings.Join(words, ","))
s = "长江大桥"
words = x.CutForSearch(s, !use_hmm)
fmt.Println(s)
fmt.Println("搜索引擎模式:", strings.Join(words, "/"))
wordinfos := x.Tokenize(s, gojieba.SearchMode, !use_hmm)
fmt.Println(s)
fmt.Println("Tokenize:(搜索引擎模式)", wordinfos)
wordinfos = x.Tokenize(s, gojieba.DefaultMode, !use_hmm)
fmt.Println(s)
fmt.Println("Tokenize:(默认模式)", wordinfos)
keywords := x.ExtractWithWeight(s, 5)
fmt.Println("Extract:", keywords)
}
示例输出
我来到北京清华大学
全模式: 我/来到/北京/清华/清华大学/华大/大学
我来到北京清华大学
精确模式: 我/来到/北京/清华大学
比特币
精确模式: 比特/币
比特币
添加词典后,精确模式: 比特币
他来到了网易杭研大厦
新词识别: 他/来到/了/网易/杭研/大厦
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
搜索引擎模式: 小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/日本/京都/大学/日本京都大学/深造
长春市长春药店
词性标注: 长春市/ns,长春/ns,药店/n
区块链
词性标注: 区块链/nz
长江大桥
搜索引擎模式: 长江/大桥/长江大桥
长江大桥
Tokenize:(搜索引擎模式) [{长江 0 6} {大桥 6 12} {长江大桥 0 12}]
测试
单元测试:
go test ./...
性能测试:
go test -bench "Jieba" -test.benchtime 10s
go test -bench "Extractor" -test.benchtime 10s
更多关于golang中文分词算法实现插件库gojiebajieba的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang中文分词算法实现插件库gojiebajieba的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Gojieba中文分词库使用指南
Gojieba是jieba分词的Go语言实现,提供了高效的中文分词功能。下面我将详细介绍如何使用这个库。
安装
首先安装gojieba库:
go get github.com/yanyiwu/gojieba
基本使用
1. 初始化分词器
package main
import (
"fmt"
"github.com/yanyiwu/gojieba"
)
func main() {
// 初始化分词器
// 参数1: 词典路径
// 参数2: HMM模型路径
// 参数3: 用户词典路径
x := gojieba.NewJieba()
defer x.Free()
// 也可以使用默认路径
// x := gojieba.NewJieba("/path/to/dict.txt", "/path/to/hmm_model.txt", "/path/to/user_dict.txt")
}
2. 基本分词功能
func basicCut() {
x := gojieba.NewJieba()
defer x.Free()
text := "我爱北京天安门"
// 精确模式
words := x.Cut(text, true)
fmt.Println("精确模式:", words)
// 输出: [我 爱 北京 天安门]
// 全模式
words = x.CutAll(text)
fmt.Println("全模式:", words)
// 输出: [我 爱 北京 天安 天安门]
// 搜索引擎模式
words = x.CutForSearch(text, true)
fmt.Println("搜索引擎模式:", words)
// 输出: [我 爱 北京 天安 天安门]
}
3. 关键词提取
func extractKeywords() {
x := gojieba.NewJieba()
defer x.Free()
text := "今天天气真好,我们一起去公园玩吧"
// 提取关键词
keywords := x.Extract(text, 5)
fmt.Println("关键词:", keywords)
// 输出: [今天天气 公园 一起 玩 真好]
}
4. 词性标注
func tagWords() {
x := gojieba.NewJieba()
defer x.Free()
text := "我爱自然语言处理技术"
// 词性标注
tags := x.Tag(text)
fmt.Println("词性标注:", tags)
// 输出: [[我 r] [爱 v] [自然语言处理 nz] [技术 n]]
}
5. 使用用户词典
func userDict() {
// 初始化时指定用户词典
x := gojieba.NewJieba("", "", "/path/to/user_dict.txt")
defer x.Free()
// 或者动态添加用户词典
x.AddWord("云计算")
x.AddWord("大数据")
text := "云计算和大数据是未来趋势"
words := x.Cut(text, true)
fmt.Println("使用用户词典:", words)
// 输出: [云计算 和 大数据 是 未来 趋势]
}
高级功能
1. 自定义词典权重
func customWeight() {
x := gojieba.NewJieba()
defer x.Free()
// 添加词并指定权重
x.AddWordEx("超高频", 100)
x.AddWordEx("低频词", 1)
text := "超高频和低频词的处理"
words := x.Cut(text, true)
fmt.Println("自定义权重:", words)
}
2. 并行分词
func parallelCut() {
x := gojieba.NewJieba()
defer x.Free()
texts := []string{
"今天是晴天",
"明天会下雨吗",
"后天多云转阴",
}
results := make([][]string, len(texts))
// 使用goroutine并行分词
for i, text := range texts {
go func(i int, text string) {
results[i] = x.Cut(text, true)
}(i, text)
}
// 等待所有goroutine完成
time.Sleep(1 * time.Second)
for i, result := range results {
fmt.Printf("文本%d: %v\n", i, result)
}
}
性能优化建议
- 复用分词器:避免频繁创建和销毁分词器
- 预加载词典:在程序启动时初始化分词器
- 合理选择分词模式:精确模式通常性能最好
- 使用用户词典:提前添加专业术语提高准确性
完整示例
package main
import (
"fmt"
"github.com/yanyiwu/gojieba"
"time"
)
func main() {
// 初始化分词器
x := gojieba.NewJieba()
defer x.Free()
// 添加用户自定义词
x.AddWord("Go语言")
x.AddWord("中文分词")
// 示例文本
text := "Go语言中文分词库gojieba非常好用"
// 各种分词方式
fmt.Println("精确模式:", x.Cut(text, true))
fmt.Println("全模式:", x.CutAll(text))
fmt.Println("搜索引擎模式:", x.CutForSearch(text, true))
// 关键词提取
fmt.Println("关键词:", x.Extract(text, 3))
// 词性标注
fmt.Println("词性标注:", x.Tag(text))
// 并行处理示例
start := time.Now()
parallelCut(x)
fmt.Printf("并行处理耗时: %v\n", time.Since(start))
}
func parallelCut(x *gojieba.Jieba) {
texts := make([]string, 100)
for i := range texts {
texts[i] = "这是一段测试文本用于并行分词性能测试"
}
results := make([][]string, len(texts))
for i, text := range texts {
go func(i int, text string) {
results[i] = x.Cut(text, true)
}(i, text)
}
time.Sleep(100 * time.Millisecond)
}
Gojieba是一个功能强大且高效的中文分词库,适用于各种文本处理场景。通过合理配置和使用,可以满足大多数中文分词需求。