您的位置:首页 >聚焦 >

「GoCN酷Go推荐」Go高性能多语言NLP和分词库——gse

2022-02-26 18:00:39    来源:程序员客栈

gse是什么?

Go高性能多语言NLP和分词库, 支持英文、中文、日文等, 支持接入 elasticsearch 和 bleveGse是结巴分词(jieba)的golang实现,并尝试添加NLP功能和更多属性

特征

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

算法

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

分词速度

单线程 9.2MB/sgoroutines 并发 26.8MB/s.HMM 模式单线程分词速度 3.2MB/s.(双核 4 线程 Macbook Pro)。

快速入门

packagemainimport("fmt""regexp""github.com/go-ego/gse""github.com/go-ego/gse/hmm/pos")var(seggse.SegmenterposSegpos.Segmenternew,_=gse.New("zh,testdata/test_dict3.txt","alpha")text="你好世界,Helloworld,Helloworld.")funcmain(){//加载默认词典seg.LoadDict()//加载默认embed词典//seg.LoadDictEmbed()////加载简体中文词典//seg.LoadDict("zh_s")//seg.LoadDictEmbed("zh_s")////加载繁体中文词典//seg.LoadDict("zh_t")////加载日文词典//seg.LoadDict("jp")////载入词典//seg.LoadDict("yourgopath"+"/src/github.com/go-ego/gse/data/dict/dictionary.txt")cut()segCut()}funccut(){hmm:=new.Cut(text,true)fmt.Println("cutusehmm:",hmm)hmm=new.CutSearch(text,true)fmt.Println("cutsearchusehmm:",hmm)fmt.Println("analyze:",new.Analyze(hmm,text))hmm=new.CutAll(text)fmt.Println("cutall:",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("Cutwithhmmandregexp:",hmm,hmm[0],hmm[6])}funcanalyzeAndTrim(cut[]string){a:=seg.Analyze(cut,"")fmt.Println("analyzethesegment:",a)cut=seg.Trim(cut)fmt.Println("cutall:",cut)fmt.Println(seg.String(text,true))fmt.Println(seg.Slice(text,true))}funccutPos(){po:=seg.Pos(text,true)fmt.Println("pos:",po)po=seg.TrimPos(po)fmt.Println("trimpos:",po)posSeg.WithGse(seg)po=posSeg.Cut(text,true)fmt.Println("pos:",po)po=posSeg.TrimWithPos(po,"zg")fmt.Println("trimpos:",po)}funcsegCut(){//分词文本tb:=[]byte("山达尔星联邦共和国联邦政府")//处理分词结果fmt.Println("输出分词结果,类型为字符串,使用搜索模式:",seg.String(string(tb),true))fmt.Println("输出分词结果,类型为slice:",seg.Slice(string(tb)))segments:=seg.Segment(tb)//处理分词结果,普通模式fmt.Println(gse.ToString(segments))segments1:=seg.Segment([]byte(text))//搜索模式fmt.Println(gse.ToString(segments1,true))}

输出结果:

cutusehmm:[你好世界,helloworld,helloworld.]cutsearchusehmm:[你好世界,helloworld,helloworld.]analyze:[{0600你好725l}{61210世界34387n}{252720,0}{273230hello0}{2627400}{323750world0}{121460,0}{273770helloworld0}{373880.0}]cutall:[你好世界,helloworld,helloworld.]Cutwithhmmandregexp:[헬로월드헬로서울,2021年09月10日,3.14]헬로월드2021年输出分词结果,类型为字符串,使用搜索模式:山/n达尔/nrt星/n联邦/n共和/nz国/zg共和国/ns联邦/n政府/n联邦政府/nt输出分词结果,类型为slice:[山达尔星联邦共和国联邦政府]山/n达尔/nrt星/n联邦/n共和国/ns联邦政府/nt你好/l世界/n,/x/xhello/x/xworld/x,/x/xhelloworld/x./x

更多用法可参考github上官方用例

参考资料

https://github.com/go-ego/gse/blob/master/README_zh.md《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名

扫码也可以加入 GoCN 的大家族哟~

关键词: 联邦共和国 简体中文

相关阅读