go-ego/gse has 2,847 GitHub stars and 233 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-06 20:28 UTC. Last push 2026-11-01.
Go efficient multilingual NLP and text segmentation; support English, Chinese, Japanese and others.
Measured star growth
- in 24h
- 0
- in 7 days
- Update delayed
- in 15 days
- Update delayed
- in 1 month
- Update delayed
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
Originalgse
Go efficient multilingual NLP and text segmentation; support English, Chinese, Japanese and others. And supports with riot, zedsearch, zincsearch, elasticsearch and bleve.
Gse is implements jieba by golang, and added NLP support and more features
I build Codg now, Easy code and work AI agent system: auto, asynchronous, concurrency, efficiently and High accuracy
Feature:
- Support common, search engine, full mode, precise mode and HMM mode multiple word segmentation modes;
- Support user and embed dictionary, Part-of-speech/POS tagging, analyze segment info, stop and trim words
- Support multilingual: English, Chinese, Japanese and others
- Support Traditional Chinese (Use single dictionary)
- Support HMM cut text use Viterbi algorithm
- Support NLP by Pytorch (in work)
- Named Entity Recognition (in work)
- Supports riot and zedsearch, and elasticsearch, bleve and others
- run JSON RPC service.
Algorithm:
- Dictionary with the double array trie (Double-Array Trie, cedar) by default, or a rune-level hash trie with
-tags hash - Segmenter algorithm is the shortest path (based on word frequency and dynamic programming), and DAG and HMM algorithm word segmentation.
Text Segmentation speed:
- single thread 9.2MB/s
- goroutines concurrent 26.8MB/s.
- HMM text segmentation single thread 3.2MB/s. (2core 4threads Macbook Pro).
Binding:
gse-bind, binding JavaScript and other, support more language.
Install / update
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
Build tags
-tags hash: use a rune-level hash trie instead of the default cedar double array trie; ~8 MiB (~40%) less trie memory for the zh dict, but ~10% slower segmentation.-tags ne: do not embed the default dictionaries into the binary (smaller size); load them withLoadDict("your dict path")instead ofLoadDictEmbed().
go build -tags hash
go build -tags ne
Low memory devices
The zh dictionary takes about 132 MiB of heap by default. For low memory devices, combine:
-tags hash: the hash trie, about 8 MiB less.seg.SkipSubSeg = truebefore loading: skips the precomputed sub-words of the search mode (Slice,String,PoswithsearchMode), about 50 MiB less.CutSearch(text)uses them too,CutSearch(text, true)andCutSearch(text, false)still work.seg.LoadDict("zh_s"): only the simplified Chinese dictionary.
// go build -tags hash
var seg gse.Segmenter
seg.SkipSubSeg = true
err := seg.LoadDict("zh_s") // about 53 MiB
Lint
The code is checked by golangci-lint v2 in CI, with the config in .golangci.yml:
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
golangci-lint run ./...
golangci-lint run --build-tags hash .
Use
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() {
// keep the origin capital letter
// 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 !]
// 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() {
// Loading the default dictionary
seg.LoadDict()
// Loading the default dictionary with embed
// seg.LoadDictEmbed()
//
// Loading the Simplified Chinese dictionary
// seg.LoadDict("zh_s")
// seg.LoadDictEmbed("zh_s")
//
// Loading the Traditional Chinese dictionary
// seg.LoadDict("zh_t")
//
// Loading the Japanese dictionary
// seg.LoadDict("jp")
//
// Load the dictionary
// 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)
pos.WithGse(seg)
po = posSeg.Cut(text, true)
fmt.Println("pos: ", po)
po = posSeg.TrimWithPos(po, "zg")
fmt.Println("trim pos: ", po)
}
func segCut() {
// Text Segmentation
tb := []byte(text)
fmt.Println(seg.String(text, true))
segments := seg.Segment(tb)
// Handle word segmentation results, search mode
fmt.Println(gse.ToString(segments, true))
}
Look at an custom dictionary example
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
How to use it with elasticsearch?
Authors
License
Gse is primarily distributed under the terms of "the Apache License (Version 2.0)". See LICENSE-APACHE, LICENSE.
Explore related projects
codecrafters-io/build-your-own-x
Master programming by recreating your favorite technologies from scratch.
560,541 starspublic-apis/public-apis
A collective list of free APIs
496,818 starsmorluto/rea
Reverse engineer anything with agents, from app behavior down to native binaries.
438,945 starsopenclaw/openclaw
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
394,094 stars