gse
高效的多语言自然语言处理和文本分词工具;支持英语、中文、日语等。 并支持 elasticsearch 和 bleve。
Gse 是由 golang 实现的 jieba,并尝试添加 NLP 支持和更多功能。
功能:
- 支持普通、搜索引擎、全模式、精确模式和 HMM 模式等多种分词模式;
- 支持用户词典和嵌入词典,词性标注、分析分词信息、停用词和修剪词;
- 支持多语言:英语、中文、日语等;
- 支持繁体中文;
- 支持 HMM 分词使用维特比算法;
- 支持 TensorFlow 进行 NLP(开发中);
- 命名实体识别(开发中);
- 支持与 elasticsearch 和 bleve;
- 运行 JSON RPC 服务。
算法:
文本分词速度:
绑定:
gse-bind,绑定 JavaScript 等,支持更多语言。
安装 / 更新
支持 Go 模块(Go 1.11+),只需导入:
import "github.com/go-ego/gse"
否则,要安装 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() {
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 !]
// example2()
}
Example2:
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.LoadDictEmbed()
//
// 加载简体中文词典
// seg.LoadDict("zh_s")
// seg.LoadDictEmbed("zh_s")
//
// 加载繁体中文词典
// seg.LoadDict("zh_t")
//
// 加载日语词典
// seg.LoadDict("jp")
//
// 加载自定义词典
// seg.LoadDict(你的 go path +"/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)
pos.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(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() {
// var seg gse.Segmenter
// seg.LoadDict("zh, testdata/zh/test_dict.txt, testdata/zh/test_dict1.txt")
// seg.LoadStop()
seg, err := gse.NewEmbed("zh, word 20 n"+testDict, "en")
// seg.LoadDictEmbed()
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))
}
Elasticsearch
如何与 elasticsearch 一起使用?
作者
许可证
Gse 主要以 "MIT 许可证和 Apache 许可证(版本 2.0)" 分发。 参阅 LICENSE-APACHE,LICENSE-MIT。