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语言分词库,具有以下特点:
- 支持多语言分词
- 提供多种分词模式
- 支持词性标注和关键词提取
- 高性能,适合大规模文本处理
- 支持自定义词典和停用词
通过合理使用gse的各种功能,可以满足大多数文本处理需求,特别是在中文自然语言处理领域表现优异。