Go 高性能多语言 NLP 和分词, 支持英文、中文、日文等, 支持接入 elasticsearch 和 bleve
Gse 是结巴分词(jieba)的 golang 实现, 并尝试添加 NLP 功能和更多属性
- 支持普通、搜索引擎、全模式、精确模式和 HMM 模式多种分词模式
- 支持自定义词典、embed 词典、词性标注、停用词、整理分析分词
- 多语言支持: 英文, 中文, 日文等
- 支持繁体字
- NLP 和 TensorFlow 支持 (进行中)
- 命名实体识别 (进行中)
- 支持接入 Elasticsearch 和 bleve
- 可运行 JSON RPC 服务
- 词典用双数组 trie(Double-Array Trie)实现,
- 分词器算法为基于词频的最短路径加动态规划, 以及 DAG 和 HMM 算法分词.
- 支持 HMM 分词, 使用 viterbi 算法.
- 单线程 9.2MB/s
- goroutines 并发 26.8MB/s.
- HMM 模式单线程分词速度 3.2MB/s.(双核 4 线程 Macbook Pro)。
gse-bind, binding JavaScript and other, support more language.
With Go module support (Go 1.11+), just import:
import "github.com/go-ego/gse"
Otherwise, to install the gse package, run the command:
go get -u github.com/go-ego/gse
package main
import (
"fmt"
"regexp"
"github.com/go-ego/gse"
"github.com/go-ego/gse/hmm/pos"
)
var (
seg gse.Segmenter
posSeg pos.Segmenter
new, _ = gse.New("zh,testdata/test_en_dict3.txt", "alpha")
text = "你好世界, Hello world, Helloworld."
)
func main() {
// 加载默认词典
seg.LoadDict()
// 加载默认 embed 词典
// seg.LoadDictEmbed()
//
// 加载简体中文词典
// seg.LoadDict("zh_s")
// seg.LoadDictEmbed("zh_s")
//
// 加载繁体中文词典
// seg.LoadDict("zh_t")
//
// 加载日文词典
// seg.LoadDict("jp")
//
// 载入词典
// seg.LoadDict("your gopath"+"/src/github.com/go-ego/gse/data/dict/dictionary.txt")
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 analyzeAndTrim(cut []string) {
a := seg.Analyze(cut, "")
fmt.Println("analyze the segment: ", a)
cut = seg.Trim(cut)
fmt.Println("cut all: ", cut)
fmt.Println(seg.String(text, true))
fmt.Println(seg.Slice(text, true))
}
func cutPos() {
po := seg.Pos(text, true)
fmt.Println("pos: ", po)
po = seg.TrimPos(po)
fmt.Println("trim pos: ", po)
posSeg.WithGse(seg)
po = posSeg.Cut(text, true)
fmt.Println("pos: ", po)
po = posSeg.TrimWithPos(po, "zg")
fmt.Println("trim pos: ", po)
}
func segCut() {
// 分词文本
tb := []byte("山达尔星联邦共和国联邦政府")
// 处理分词结果
fmt.Println("输出分词结果, 类型为字符串, 使用搜索模式: ", seg.String(tb, true))
fmt.Println("输出分词结果, 类型为 slice: ", seg.Slice(tb))
segments := seg.Segment(tb)
// 处理分词结果, 普通模式
fmt.Println(gse.ToString(segments))
segments1 := seg.Segment([]byte(text))
// 搜索模式
fmt.Println(gse.ToString(segments1, true))
}
package main
import (
"fmt"
_ "embed"
"github.com/go-ego/gse"
)
//go:embed test_en_dict3.txt
var testDict string
func main() {
// var seg gse.Segmenter
// seg.LoadDict("zh, testdata/test_dict.txt, testdata/test_dict1.txt")
// seg.LoadStop()
seg, err := gse.NewEmbed("zh, word 20 n"+testDict, "en")
// seg.LoadDictEmbed()
seg.LoadStopEmbed()
text1 := "所以, 你好, 再见"
fmt.Println(seg.Cut(text1, true))
fmt.Println(seg.String(text1, true))
segments := seg.Segment([]byte(text1))
fmt.Println(gse.ToString(segments))
}
How to use it with elasticsearch?
Gse is primarily distributed under the terms of "both the MIT license and the Apache License (Version 2.0)". See LICENSE-APACHE, LICENSE-MIT.