MCPcopy
hub / github.com/go-ego/gse

github.com/go-ego/gse @v1.0.2 sqlite

repository ↗ · DeepWiki ↗ · release v1.0.2 ↗
473 symbols 1,378 edges 59 files 230 documented · 49%
README

gse

Go 高性能多语言 NLP 和分词, 支持英文、中文、日文等, 支持接入 elasticsearchbleve

Build Status CircleCI Status codecov Go Report Card GoDoc GitHub release Join the chat at https://gitter.im/go-ego/ego

Gse 是结巴分词(jieba)的 golang 实现, 并尝试添加 NLP 功能和更多属性

特征:

  • 支持普通、搜索引擎、全模式、精确模式和 HMM 模式多种分词模式
  • 支持自定义词典、embed 词典、词性标注、停用词、整理分析分词
  • 多语言支持: 英文, 中文, 日文等
  • 支持繁体字
  • NLP 和 TensorFlow 支持 (进行中)
  • 命名实体识别 (进行中)
  • 支持接入 Elasticsearch 和 bleve
  • 可运行 JSON RPC 服务

算法:

  • 词典用双数组 trie(Double-Array Trie)实现,
  • 分词器算法为基于词频的最短路径加动态规划, 以及 DAG 和 HMM 算法分词.
  • 支持 HMM 分词, 使用 viterbi 算法.

分词速度:

Binding:

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))
}

中文分词示例

日文分词示例

Elasticsearch

How to use it with elasticsearch?

go-gse-elastic

Authors

License

Gse is primarily distributed under the terms of "both the MIT license and the Apache License (Version 2.0)". See LICENSE-APACHE, LICENSE-MIT.

Thanks for sego and jieba(jiebago).

Extension points exported contracts — how you extend this code

Relevance (Interface)
Relevance easily scalable Relevance calculations (for idf, tf-idf, bm25 and so on) [3 implementers]
hmm/relevance/relevance.go

Core symbols most depended-on inside this repo

get
called by 42
hmm/pos/prob_emit.go
Find
called by 41
dag.go
Cut
called by 32
gse.go
AddToken
called by 23
hmm/relevance/relevance.go
LoadDict
called by 18
hmm/relevance/relevance.go
IsStop
called by 17
stop.go
SplitTextToWords
called by 17
segmenter.go
LoadDict
called by 14
dict_util.go

Shape

Function 223
Method 208
Struct 31
TypeAlias 9
FuncType 1
Interface 1

Languages

Go82%
TypeScript18%

Modules by API surface

tools/server/static/jquery.min.js83 symbols
dict_util.go27 symbols
trim.go25 symbols
hmm/pos/pos_seg.go17 symbols
gse.go17 symbols
seg_utils.go15 symbols
hmm/relevance/bm25.go15 symbols
hmm/relevance/tfidf.go14 symbols
hmm/relevance/idf.go14 symbols
hmm/extracker/textrank.go14 symbols
dag.go14 symbols
segmenter.go13 symbols

Dependencies from manifests, versioned

github.com/vcaesar/cedarv0.30.0 · 1×
github.com/vcaesar/ttv0.20.1 · 1×

For agents

$ claude mcp add gse \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact