golang中文分词算法实现插件库gojieba的使用

GoJieba中文分词库的使用

GoJieba是"结巴"中文分词的Golang语言版本。

简介

  • 支持多种分词方式,包括: 最大概率模式, HMM新词发现模式, 搜索引擎模式, 全模式
  • 核心算法底层由C++实现,性能高效。
  • 字典路径可配置,NewJieba(…string), NewExtractor(…string) 可变形参,当参数为空时使用默认词典(推荐方式)

安装

go get github.com/yanyiwu/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("比特币")  // 添加自定义词
	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.CutForSearch(s, !use_hmm)
	fmt.Println(s)
	fmt.Println("搜索引擎模式:", strings.Join(words, "/"))

	wordinfos := x.Tokenize(s, gojieba.SearchMode, !use_hmm)  // Tokenize
	fmt.Println(s)
	fmt.Println("Tokenize:(搜索引擎模式)", wordinfos)

	keywords := x.ExtractWithWeight(s, 5)  // 关键词提取
	fmt.Println("Extract:", keywords)
}

输出示例

我来到北京清华大学
全模式: 我/来到/北京/清华/清华大学/华大/大学
我来到北京清华大学
精确模式: 我/来到/北京/清华大学
比特币
精确模式: 比特/币
比特币
添加词典后,精确模式: 比特币
他来到了网易杭研大厦
新词识别: 他/来到/了/网易/杭研/大厦
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
搜索引擎模式: 小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/日本/京都/大学/日本京都大学/深造
长春市长春药店
词性标注: 长春市/ns,长春/ns,药店/n
长江大桥
搜索引擎模式: 长江/大桥/长江大桥
长江大桥
Tokenize:(搜索引擎模式) [{长江 0 6} {大桥 6 12} {长江大桥 0 12}]
Extract: [{长江大桥 8.200680] [{长江 8.200680} {大桥 8.200680}]

性能测试

go test -bench "Jieba" -test.bbenchtime 10s
go test -bench "Extractor" -test.benchtime 10s

更多关于golang中文分词算法实现插件库gojieba的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang中文分词算法实现插件库gojieba的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Gojieba: Golang中文分词库使用指南

Gojieba是jieba分词的Golang实现版本,是一个高效的中文分词组件,支持多种分词模式,适用于搜索和文本分析场景。

安装

go get github.com/yanyiwu/gojieba

基本使用

初始化分词器

package main

import (
	"fmt"
	"github.com/yanyiwu/gojieba"
)

func main() {
	// 初始化分词器
	// 参数1: 字典路径
	// 参数2: HMM模型路径
	// 参数3: 用户字典路径
	// 如果传空字符串,则使用内置的默认字典
	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)
}

主要功能

1. 精确模式分词

func exactMode(x *gojieba.Jieba, text string) {
	words := x.Cut(text, true)
	fmt.Println("精确模式:", words)
}

2. 全模式分词

func fullMode(x *gojieba.Jieba, text string) {
	words := x.CutAll(text)
	fmt.Println("全模式:", words)
}

3. 搜索引擎模式分词

func searchMode(x *gojieba.Jieba, text string) {
	words := x.CutForSearch(text, true)
	fmt.Println("搜索引擎模式:", words)
}

4. 关键词提取

func extractKeywords(x *gojieba.Jieba, text string) {
	// 提取关键词,参数:文本,返回关键词数量,是否使用权重
	keywords := x.Extract(text, 5)
	fmt.Println("关键词提取:", keywords)
}

5. 词性标注

func tagWords(x *gojieba.Jieba, text string) {
	tags := x.Tag(text)
	fmt.Println("词性标注:", tags)
}

高级用法

自定义词典

func customDict() {
	// 使用自定义词典路径
	x := gojieba.NewJieba(
		"path/to/dict.txt", 
		"path/to/hmm_model.txt", 
		"path/to/user_dict.txt")
	defer x.Free()
	
	text := "这是一个自定义词典的测试"
	words := x.Cut(text, true)
	fmt.Println(words)
}

添加新词

func addWord(x *gojieba.Jieba) {
	// 动态添加新词
	x.AddWord("云计算")
	x.AddWord("大数据")
	
	text := "云计算和大数据是未来趋势"
	words := x.Cut(text, true)
	fmt.Println("添加新词后:", words)
}

性能优化建议

  1. 复用Jieba实例:避免频繁创建和销毁Jieba实例
  2. 批量处理:对大量文本进行分词时,尽量批量处理
  3. 预加载词典:在服务启动时初始化分词器

完整示例

package main

import (
	"fmt"
	"github.com/yanyiwu/gojieba"
	"strings"
)

func main() {
	x := gojieba.NewJieba()
	defer x.Free()
	
	text := "我爱北京天安门"
	
	fmt.Println("=== 基本分词 ===")
	fmt.Println("精确模式:", strings.Join(x.Cut(text, true), "/"))
	fmt.Println("全模式:", strings.Join(x.CutAll(text), "/"))
	fmt.Println("搜索引擎模式:", strings.Join(x.CutForSearch(text, true), "/"))
	
	fmt.Println("\n=== 高级功能 ===")
	fmt.Println("关键词提取:", x.Extract(text, 5))
	fmt.Println("词性标注:", x.Tag(text))
	
	// 添加新词
	x.AddWord("天安门")
	fmt.Println("\n添加新词后:", strings.Join(x.Cut(text, true), "/"))
}

应用场景

  1. 搜索引擎分词
  2. 文本分类
  3. 关键词提取
  4. 情感分析
  5. 自动摘要

Gojieba是一个功能强大且高效的中文分词库,通过合理使用可以满足大多数中文文本处理需求。

回到顶部