53 Star 126 Fork 0

vz / gse

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README_zh.md 6.72 KB
一键复制 编辑 原始数据 按行查看 历史
vz 提交于 2021-10-28 12:26 . Update README.md and optimize some code

gse

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

Build Status CircleCI Status codecov Build Status 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.

安装/更新

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_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_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

Build-tools

go get -u github.com/go-ego/re

re gse

创建一个新的 gse 程序

$ re gse my-gse

re run

运行我们刚刚创建的应用程序, CD 到程序文件夹并执行:

$ cd my-gse && re run

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

Go
1
https://gitee.com/veni0/gse.git
git@gitee.com:veni0/gse.git
veni0
gse
gse
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891