golang高效多语言文本分词插件库gse的使用

Golang高效多语言文本分词插件库gse的使用

简介

Gse是一个Go语言实现的高效多语言NLP和文本分词库,支持英语、中文、日语等多种语言。它基于jieba分词算法实现,并尝试添加NLP支持和更多特性。

特性

  • 支持多种分词模式:普通模式、搜索引擎模式、全模式、精确模式和HMM模式
  • 支持用户词典和内置词典
  • 支持词性标注(POS tagging)
  • 支持分析分词信息、停用词和修剪词
  • 支持多语言:英语、中文、日语等
  • 支持繁体中文
  • 使用Viterbi算法进行HMM文本分词
  • 支持与Elasticsearch和Bleve集成

安装

使用Go模块(Go 1.11+)时,直接导入:

import "github.com/go-ego/gse"

或者运行以下命令安装:

go get -u github.com/go-ego/gse

使用示例

基本使用

package main

import (
	_ "embed"
	"fmt"

	"github.com/go-ego/gse"
)

//go:embed testdata/test_en2.txt
var testDict string

//go:embed testdata/test_en.txt
var testEn string

var (
	text  = "To be or not to be, that's the question!"
	test1 = "Hiworld, Helloworld!"
)

func main() {
	// 保持原始大小写
	// gse.ToLower = false

	var seg1 gse.Segmenter
	seg1.DictSep = ","
	err := seg1.LoadDict("./testdata/test_en.txt")
	if err != nil {
		fmt.Println("Load dictionary error: ", err)
	}

	s1 := seg1.Cut(text)
	fmt.Println("seg1 Cut: ", s1)
	// seg1 Cut:  [to be   or   not to be ,   that's the question!]

	var seg2 gse.Segmenter
	seg2.AlphaNum = true
	seg2.LoadDict("./testdata/test_en_dict3.txt")

	s2 := seg2.Cut(test1)
	fmt.Println("seg2 Cut: ", s2)
	// seg2 Cut:  [hi world ,   hello world !]

	var seg3 gse.Segmenter
	seg3.AlphaNum = true
	seg3.DictSep = ","
	err = seg3.LoadDictEmbed(testDict + "\n" + testEn)
	if err != nil {
		fmt.Println("loadDictEmbed error: ", err)
	}
	s3 := seg3.Cut(text + test1)
	fmt.Println("seg3 Cut: ", s3)
	// seg3 Cut:  [to be   or   not to be ,   that's the question! hi world ,   hello world !]
}

高级功能示例

package main

import (
	"fmt"
	"regexp"

	"github.com/go-ego/gse"
	"github.com/go-ego/gse/hmm/pos"
)

var (
	text = "Hello world, Helloworld. Winter is coming! こんにちは世界, 你好世界."

	new, _ = gse.New("zh,testdata/test_en_dict3.txt", "alpha")

	seg gse.Segmenter
	posSeg pos.Segmenter
)

func main() {
	// 加载默认词典
	seg.LoadDict()
	
	// 加载简体中文词典
	// seg.LoadDict("zh_s")
	
	// 加载繁体中文词典
	// seg.LoadDict("zh_t")
	
	// 加载日语词典
	// seg.LoadDict("jp")

	cut()
	segCut()
}

func cut() {
	hmm := new.Cut(text, true)
	fmt.Println("cut use hmm: ", hmm)

	hmm = new.CutSearch(text, true)
	fmt.Println("cut search use hmm: ", hmm)
	fmt.Println("analyze: ", new.Analyze(hmm, text))

	hmm = new.CutAll(text)
	fmt.Println("cut all: ", hmm)

	reg := regexp.MustCompile(`(\d+年|\d+月|\d+日|[\p{Latin}]+|[\p{Hangul}]+|\d+\.\d+|[a-zA-Z0-9]+)`)
	text1 := `헬로월드 헬로 서울, 2021年09月10日, 3.14`
	hmm = seg.CutDAG(text1, reg)
	fmt.Println("Cut with hmm and regexp: ", hmm, hmm[0], hmm[6])
}

func segCut() {
	// 文本分词
	tb := []byte(text)
	fmt.Println(seg.String(text, true))

	segments := seg.Segment(tb)
	// 处理分词结果,搜索模式
	fmt.Println(gse.ToString(segments, true))
}

自定义词典示例

package main

import (
	"fmt"
	_ "embed"

	"github.com/go-ego/gse"
)

//go:embed test_en_dict3.txt
var testDict string

func main() {
	seg, err := gse.NewEmbed("zh, word 20 n"+testDict, "en")
	seg.LoadStopEmbed()

	text1 := "Hello world, こんにちは世界, 你好世界!"
	s1 := seg.Cut(text1, true)
	fmt.Println(s1)
	fmt.Println("trim: ", seg.Trim(s1))
	fmt.Println("stop: ", seg.Stop(s1))
	fmt.Println(seg.String(text1, true))

	segments := seg.Segment([]byte(text1))
	fmt.Println(gse.ToString(segments))
}

性能

  • 单线程分词速度:9.2MB/s
  • 并发分词速度:26.8MB/s
  • HMM文本分词单线程速度:3.2MB/s (2核4线程Macbook Pro)

算法

  • 使用双数组Trie树(Double-Array Trie)实现词典
  • 分词算法基于最短路径(基于词频和动态规划),以及DAG和HMM算法

许可证

Gse主要基于"Apache License (Version 2.0)"分发。


更多关于golang高效多语言文本分词插件库gse的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高效多语言文本分词插件库gse的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang高效多语言文本分词插件库gse使用指南

gse(Go Efficient Text Segmentation)是一个用Go语言编写的高性能多语言文本分词库,支持中文、英文、日文等多种语言的分词处理。

安装gse

go get -u github.com/go-ego/gse

基本使用

1. 简单分词示例

package main

import (
	"fmt"
	"github.com/go-ego/gse"
)

func main() {
	// 初始化分词器
	var seg gse.Segmenter
	seg.LoadDict() // 加载默认词典
	
	text := "gse是一个高效的多语言文本分词库"
	
	// 分词模式1: 精确模式
	fmt.Println("精确模式分词结果:")
	fmt.Println(seg.String(text, true)) // true表示精确模式
	
	// 分词模式2: 全模式
	fmt.Println("\n全模式分词结果:")
	fmt.Println(seg.String(text, false)) // false表示全模式
	
	// 分词模式3: 搜索引擎模式
	fmt.Println("\n搜索引擎模式分词结果:")
	fmt.Println(seg.Slice(text, true)) // 返回[]string
}

2. 加载自定义词典

func main() {
	var seg gse.Segmenter
	
	// 加载内置词典和自定义词典
	err := seg.LoadDict("zh", "path/to/your/dict.txt")
	if err != nil {
		panic(err)
	}
	
	// 添加临时词典词
	seg.AddToken("区块链", 100, "n")
	
	text := "这是一个区块链技术的示例"
	fmt.Println(seg.String(text, true))
}

3. 多语言分词

func main() {
	var seg gse.Segmenter
	seg.LoadDict() // 加载默认词典
	
	// 中文分词
	cnText := "自然语言处理很有趣"
	fmt.Println("中文分词:", seg.String(cnText, true))
	
	// 英文分词
	enText := "This is an English sentence"
	fmt.Println("英文分词:", seg.String(enText, true))
	
	// 日文分词
	jpText := "これは日本語のテキストです"
	fmt.Println("日文分词:", seg.String(jpText, true))
}

高级功能

1. 词性标注

func main() {
	var seg gse.Segmenter
	seg.LoadDict()
	
	text := "我爱北京天安门"
	
	// 分词并标注词性
	segments := seg.Segment([]byte(text))
	
	// 输出分词结果和词性
	for _, segment := range segments {
		fmt.Printf("%s/%s ", segment.Token().Text(), segment.Token().Pos())
	}
	fmt.Println()
}

2. 关键词提取

func main() {
	var seg gse.Segmenter
	seg.LoadDict()
	
	text := "信息检索是从大规模非结构化数据中找出相关信息的过程"
	
	// 提取关键词
	keywords := seg.ExtractKeywords(text, 5) // 提取5个关键词
	fmt.Println("关键词:", keywords)
}

3. 停用词过滤

func main() {
	var seg gse.Segmenter
	seg.LoadDict()
	
	// 设置停用词
	stopWords := map[string]bool{
		"的": true,
		"是": true,
		"在": true,
	}
	
	text := "这是一个关于gse分词库的示例"
	segments := seg.Segment([]byte(text))
	
	// 过滤停用词
	for _, segment := range segments {
		word := segment.Token().Text()
		if !stopWords[word] {
			fmt.Print(word, " ")
		}
	}
	fmt.Println()
}

性能优化

1. 并发安全使用

func main() {
	var seg gse.Segmenter
	seg.LoadDict()
	
	texts := []string{
		"第一条文本内容",
		"第二条不同的文本",
		"第三条测试文本",
	}
	
	// 并发分词处理
	results := make(chan string, len(texts))
	for _, text := range texts {
		go func(t string) {
			results <- seg.String(t, true)
		}(text)
	}
	
	for range texts {
		fmt.Println(<-results)
	}
}

2. 内存优化

func main() {
	// 使用最小词典模式减少内存占用
	var seg gse.Segmenter
	seg.LoadDict("zh", "small") // 加载小型词典
	
	// 或者只加载需要的词典
	// seg.LoadDict("zh", "path/to/dict.txt", "path/to/user_dict.txt")
	
	text := "这是一个内存优化的示例"
	fmt.Println(seg.String(text, true))
}

实际应用示例

1. 文本搜索

func buildInvertedIndex(docs []string) map[string][]int {
	var seg gse.Segmenter
	seg.LoadDict()
	
	index := make(map[string][]int)
	
	for docID, doc := range docs {
		words := seg.Slice(doc, true)
		for _, word := range words {
			if ids, exists := index[word]; exists {
				index[word] = append(ids, docID)
			} else {
				index[word] = []int{docID}
			}
		}
	}
	
	return index
}

2. 情感分析预处理

func preprocessForSentiment(text string) []string {
	var seg gse.Segmenter
	seg.LoadDict()
	
	// 分词
	words := seg.Slice(text, true)
	
	// 过滤停用词和标点
	stopWords := loadStopWords() // 实现你自己的停用词加载函数
	var filtered []string
	
	for _, word := range words {
		if !stopWords[word] && !isPunctuation(word) {
			filtered = append(filtered, word)
		}
	}
	
	return filtered
}

总结

gse是一个功能强大且高效的Go语言分词库,具有以下特点:

  1. 支持多语言分词
  2. 提供多种分词模式
  3. 支持词性标注和关键词提取
  4. 高性能,适合大规模文本处理
  5. 支持自定义词典和停用词

通过合理使用gse的各种功能,可以满足大多数文本处理需求,特别是在中文自然语言处理领域表现优异。

回到顶部