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)
	}
}

性能优化建议

  1. 复用分词器:避免频繁创建和销毁分词器
  2. 预加载词典:在程序启动时初始化分词器
  3. 合理选择分词模式:精确模式通常性能最好
  4. 使用用户词典:提前添加专业术语提高准确性

完整示例

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是一个功能强大且高效的中文分词库,适用于各种文本处理场景。通过合理配置和使用,可以满足大多数中文分词需求。

回到顶部