Go语言开发后台框架不能只有CRUD还需有算法集成基础功能-GoFly框架集成了自然语言处理(NLP)分词、关键词提取和情感分析

前言

Go语言开发框架,我们要把Go的优势体现在框架中,不仅CRUD常规操作,还要把常用即有算力自己集成到框架中,而不是去购买第三方提供服务接口。作为开发者可以拓宽自己代码面,获取更多成就感,同时也提供自己竞争性和自身价值。对应项目来说我们可以减少长期额外成本、维护接口成本。有很多成熟算法模型都可直接拿来用,效果和购买第三方接口服务是一样的,很多三方接口也是基于这些算法模型集成,再把集成接口对外售卖。

好了,接下来我们开始介绍本文自然语言处理插件了。自然语言处理(NLP)是人工智能领域的一个重要分支,它致力于让计算机能够理解、处理和生成人类语言。近年来,自然语言处理技术的发展迅速,并且在多个领域的应用已经进入到实际落地,同时它也拓宽了软件开发的新境界,为信息技术和各个行业带来了革命性的变革。本插件我们给大家集成了文本分词、预处理、提取关键词、情感分析。我们集成这个情感分析不依赖三方插件,方便安装使用,不像网上很多是依赖python,使用时还要本地编译后再调用,很麻烦。所以我们才花时间去搞纯Go版本。

应用方向

1.分词

分词功能在文本预处理应该较多,下面功能都是先对文本进行分词处理,再根据需要进行业务代码编写,如:词干提取、关键词提取、词云图片。

  • 搜索引擎:用于建立搜索引擎索引时对文档进行分词处理,以便于检索和匹配用户查询。
  • 文本分类:对文本进行分类之前,需要对文本进行分词处理,提取特征。
  • 信息检索:在信息检索系统中,分词是将用户查询和文档内容进行匹配的重要步骤。
  • 机器翻译:在进行机器翻译时,需要先将待翻译文本进行分词,然后进行翻译处理。
  • 情感分析:对文本进行情感分析时,首先需要对文本进行分词,提取出情感相关的词语。

2.情感分析

商品评论情感分析获取评论分数、客服聊天分析客户反馈信息满意的和工作人员服务态度统计。它可以帮助企业更好地了解用户及其客户服务满意度,因此在市场营销,用户体验优化等方面非常有用,更多应用范围如下:

  • 社交媒体:识别用户在Twitter、Facebook等平台上表达的情感倾向,以了解趋势和市场。
  • 电子商务:分析客户对产品和服务的评价,以提高产品质量和客户满意度。
  • 新闻媒体:分析读者对新闻文章的反馈,以了解热门话题和观点。
  • 人力资源:分析员工对公司文化和工作环境的评价,以提高员工满意度和竞争力。

情感分析算法说明:

对字符串集执行朴素Bayesian分类到任意数量的类,对词条频率-逆文档频率计算(TF-IDF)

算法库地址:​​https://github.com/jbrukh/bayesian​

使用前还需要对模型训练,安装好插件后我们在后台看到如下截图界面,安装界面提示进行训练。

使用介绍

引入插件

import ("gofly/utils/plugin"
)

1.情感接口函数

  • 感情分析的训练
//isNew: 是否新生成结果文件,true-重新生成 false-追加
err := plugin.GonlpTraining(true)
  • 计算文本情感值和预警级别
distance, err := plugin.GonlpCalcSemti("我们公司的股票今天涨了,太开心了。")
  •  计算文本情感值和预警级别-接口示例
// 测试计算文本情感值和预警级别
func (api *Test) NlpSentiment(c *gf.GinCtx) {param, _ := gf.RequestParam(c)if param["text"] == "" {gf.Failed().SetMsg("参数text不能为空").Regin(c)return}distance, err := plugin.GonlpCalcSemti(gf.String(param["text"]))if err != nil {gf.Failed().SetMsg(err.Error()).Regin(c)return}gf.Success().SetMsg("计算文本情感值和预警级别").SetData(distance).Regin(c)
}
  •    接口测试截图

  • 计算结果:
{"sentiType": 1,"sentiText": "正面","scores": [-204.7069297251559,-228.64907138697052]
}

2.Seg分词接口函数

  • 加载默认词典 -简体中文
 plugin.Seg.LoadDict()

 更多词典配置:

// 加载默认 embed 词典plugin.Seg.LoadDictEmbed()
// 加载简体中文词典plugin.Seg.LoadDict("zh_s")plugin.Seg.LoadDictEmbed("zh_s")
// 加载繁体中文词典
plugin.Seg.LoadDict("zh_t")
// 加载日文词典plugin.Seg.LoadDict("jp")
  •  向令牌添加新文本
eg.AddToken("太空针", 100)
plugin.Seg.AddToken("太空针", 100, "n")
  •   检查文本是否添加到令牌
freq, pos, ok := plugin.Seg.Find("太空针")
//freq=100,pos=n,ok=是否存在
  • 移除令牌
err = plugin.Seg.RemoveToken("太空针")
  • 分词的使用
// 1.普通分词 true=使用 DAG 和 HMM
hmm :=  plugin.Seg.Cut(text, true)
cut :=  plugin.Seg.Cut(text)
// 2.使用搜索引擎模式将字符串切割为单词true=search use hmm
hmm =  plugin.Seg.CutSearch(text, true)
hmm =  plugin.Seg.CutSearch(text)
// 3.使用完整模式将字符串切割为单词
cut =  plugin.Seg.CutAll(text)
// 4.
s :=  plugin.Seg.CutStr(cut, ", ")
  • 把分割的string数组转string
cstr :=  plugin.Seg.CutStr(hmm, ", ")
  • Trim 去除字符串数组中字符的符号、空格和点
cut = plugin.Seg.Trim(cut)
  • 使用DAQ使用hmm和regBEP剪切字符串
reg := regexp.MustCompile(`(\d+年|\d+月|\d+日|[\p{Latin}]+|[\p{Hangul}]+|\d+\.\d+|[a-zA-Z0-9]+)`)
text1 := `搭建的测试, 2024年09月18日, 3.18`
hmm = plugin.Seg.CutDAG(text1, reg)
  •  关键词提取

  通过标签提取关键字:

var te idf.TagExtracterte.WithGse(plugin.Seg)err := te.LoadIdf()if err!=nil{fmt.Println("load idf: ", err)}segments := te.ExtractTags(text, 5)

 通过文本排名提取关键字:

var tr idf.TextRanker
tr.WithGse(plugin.Seg)//plugin.Seg是seg对象
results := tr.TextRank(text, 5)

  返回数据格式:[{"Text":"科幻片","Weight":1.6002581704125},{"Text":"全片","Weight":1.449761569875},{"Text":"摄影机","Weight":1.2764747747375}],其中Text是关键词,Weight是权重。

3.seg包完整代码示例:

var (text  = "《复仇者联盟3:无限战争》是全片使用IMAX摄影机拍摄制作的的科幻片."text1 = flag.String("text", text, "要分词的文本")text2 = "西雅图地标建筑, Seattle Space Needle, 西雅图太空针. Sky tree."
)func main() {flag.Parse()// Loading the default dictionaryplugin.Seg.LoadDict()// Loading the default dictionary with embed//   plugin.Seg.LoadDictEmbed()//// Loading the simple chinese dictionary//   plugin.Seg.LoadDict("zh_s")//   plugin.Seg.LoadDictEmbed("zh_s")//// Loading the traditional chinese dictionary//   plugin.Seg.LoadDict("zh_t")//// Loading the japanese dictionary//   plugin.Seg.LoadDict("jp")////   plugin.Seg.LoadDict("../data/dict/dictionary.txt")//// Loading the custom dictionary//   plugin.Seg.LoadDict("zh,../../testdata/zh/test_dict.txt,../../testdata/zh/test_dict1.txt")addToken()cut()//cutPos()segCut()extAndRank(  plugin.Seg)
}func addToken() {err :=   plugin.Seg.AddToken("《复仇者联盟3:无限战争》", 100, "n")fmt.Println("add token: ", err)plugin.Seg.AddToken("西雅图中心", 100)plugin.Seg.AddToken("西雅图太空针", 100, "n")plugin.Seg.AddToken("Space Needle", 100, "n")//   plugin.Seg.AddTokenForce("上海东方明珠广播电视塔", 100, "n")//plugin.Seg.AddToken("太空针", 100)plugin.Seg.ReAddToken("太空针", 100, "n")freq, pos, ok := plugin.Seg.Find("太空针")fmt.Println("seg.Find: ", freq, pos, ok)// plugin.Seg.CalcToken()err = plugin.Seg.RemoveToken("太空针")fmt.Println("remove token: ", err)
}// 使用 DAG 或 HMM 模式分词
func cut() {// "《复仇者联盟3:无限战争》是全片使用IMAX摄影机拍摄制作的的科幻片."// use DAG and HMMhmm := plugin.Seg.Cut(text, true)fmt.Println("cut use hmm: ", hmm)// cut use hmm:  [《复仇者联盟3:无限战争》 是 全片 使用 imax 摄影机 拍摄 制作 的 的 科幻片 .]cut := plugin.Seg.Cut(text)fmt.Println("cut: ", cut)// cut:  [《 复仇者 联盟 3 : 无限 战争 》 是 全片 使用 imax 摄影机 拍摄 制作 的 的 科幻片 .]hmm = plugin.Seg.CutSearch(text, true)fmt.Println("cut search use hmm: ", hmm)//cut search use hmm:  [复仇 仇者 联盟 无限 战争 复仇者 《复仇者联盟3:无限战争》 是 全片 使用 imax 摄影 摄影机 拍摄 制作 的 的 科幻 科幻片 .]fmt.Println("analyze: ", plugin.Seg.Analyze(hmm, text))cut = plugin.Seg.CutSearch(text)fmt.Println("cut search: ", cut)// cut search:  [《 复仇 者 复仇者 联盟 3 : 无限 战争 》 是 全片 使用 imax 摄影 机 摄影机 拍摄 制作 的 的 科幻 片 科幻片 .]cut = plugin.Seg.CutAll(text)fmt.Println("cut all: ", cut)// cut all:  [《复仇者联盟3:无限战争》 复仇 复仇者 仇者 联盟 3 : 无限 战争 》 是 全片 使用 i m a x 摄影 摄影机 拍摄 摄制 制作 的 的 科幻 科幻片 .]s := plugin.Seg.CutStr(cut, ", ")fmt.Println("cut all to string: ", s)// cut all to string:  《复仇者联盟3:无限战争》, 复仇, 复仇者, 仇者, 联盟, 3, :, 无限, 战争, 》, 是, 全片, 使用, i, m, a, x, 摄影, 摄影机, 拍摄, 摄制, 制作, 的, 的, 科幻, 科幻片, .analyzeAndTrim(cut)reg := regexp.MustCompile(`(\d+年|\d+月|\d+日|[\p{Latin}]+|[\p{Hangul}]+|\d+\.\d+|[a-zA-Z0-9]+)`)text1 := `搭建的测试, 2024年09月18日, 3.18`hmm = plugin.Seg.CutDAG(text1, reg)fmt.Println("Cut with hmm and regexp: ", hmm, hmm[0], hmm[6])
}func analyzeAndTrim(cut []string) {a := plugin.Seg.Analyze(cut, "")fmt.Println("analyze the segment: ", a)// analyze the segment:cut = plugin.Seg.Trim(cut)fmt.Println("cut all: ", cut)// cut all:  [复仇者联盟3无限战争 复仇 复仇者 仇者 联盟 3 无限 战争 是 全片 使用 i m a x 摄影 摄影机 拍摄 摄制 制作 的 的 科幻 科幻片]fmt.Println(plugin.Seg.String(text2, true))// 西雅图/nr 地标/n 建筑/n ,/x  /x seattle/x  /x space needle/n ,/x  /x 西雅图太空针/n ./x  /x sky/x  /x tree/x ./xfmt.Println(plugin.Seg.Slice(text2, true))// [西雅图 地标 建筑 ,   seattle   space needle ,   西雅图太空针 .   sky   tree .]
}func cutPos() {// "西雅图地标建筑, Seattle Space Needle, 西雅图太空针. Sky tree."po := plugin.Seg.Pos(text2, true)fmt.Println("pos: ", po)// pos:  [{西雅图 nr} {地标 n} {建筑 n} {, x} {  x} {seattle x} {  x} {space needle n} {, x} {  x} {西雅图太空针 n} {. x} {  x} {sky x} {  x} {tree x} {. x}]po = plugin.Seg.TrimWithPos(po, "zg")fmt.Println("trim pos: ", po)// trim pos:  [{西雅图 nr} {地标 n} {建筑 n} {, x} {  x} {seattle x} {  x} {space needle n} {, x} {  x} {西雅图太空针 n} {. x} {  x} {sky x} {  x} {tree x} {. x}]posSeg.WithGse(plugin.Seg)po = posSeg.Cut(text, true)fmt.Println("pos: ", po)// pos:  [{《 x} {复仇 v} {者 k} {联盟 j} {3 x} {: x} {无限 v} {战争 n} {》 x} {是 v} {全片 n} {使用 v} {imax eng} {摄影 n} {机 n} {拍摄 v} {制作 vn} {的的 u} {科幻 n} {片 q} {. m}]po = posSeg.TrimWithPos(po, "zg")fmt.Println("trim pos: ", po)// trim pos:  [{《 x} {复仇 v} {者 k} {联盟 j} {3 x} {: x} {无限 v} {战争 n} {》 x} {是 v} {全片 n} {使用 v} {imax eng} {摄影 n} {机 n} {拍摄 v} {制作 vn} {的的 u} {科幻 n} {片 q} {. m}]
}// 使用最短路径和动态规划分词
func segCut() {segments := seg.Segment([]byte(*text1))fmt.Println(gse.ToString(segments, true))// 《/x 复仇/v 者/k 复仇者/n 联盟/j 3/x :/x 无限/v 战争/n 》/x 是/v 全片/n 使用/v imax/x 摄影/n 机/n 摄影机/n 拍摄/v 制作/vn 的/uj 的/uj 科幻/n 片/q 科幻片/n ./xsegs := seg.Segment([]byte(text2))// log.Println(gse.ToString(segs, false))log.Println(gse.ToString(segs))// 西雅图/nr 地标/n 建筑/n ,/x  /x seattle/x  /x space needle/n ,/x  /x 西雅图太空针/n ./x  /x sky/x  /x tree/x ./x// 搜索模式主要用于给搜索引擎提供尽可能多的关键字// segs := seg.ModeSegment(text2, true)log.Println("搜索模式: ", gse.ToString(segs, true))// 搜索模式:  西雅图/nr 地标/n 建筑/n ,/x  /x seattle/x  /x space needle/n ,/x  /x 西雅图太空针/n ./x  /x sky/x  /x tree/x ./xlog.Println("to slice", gse.ToSlice(segs, true))// to slice [西雅图 地标 建筑 ,   seattle   space needle ,   西雅图太空针 .   sky   tree .]
}func extAndRank(segs gse.Segmenter) {var te idf.TagExtracterte.WithGse(segs)err := te.LoadIdf()fmt.Println("load idf: ", err)segments := te.ExtractTags(text, 5)fmt.Println("segments: ", len(segments), segments)// segments:  5 [{科幻片 1.6002581704125} {全片 1.449761569875} {摄影机 1.2764747747375} {拍摄 0.9690261695075} {制作 0.8246043033375}]var tr idf.TextRankertr.WithGse(segs)results := tr.TextRank(text, 5)fmt.Println("results: ", results)// results:  [{机 1} {全片 0.9931964427972227} {摄影 0.984870660504368} {使用 0.9769826633059524} {是 0.8489363954683677}]
}

4.插件使用

要是使用的朋友可点击:https://goflys.cn/codedetail?id=59 到GoFly全栈开发社区使用,如没有使用需求的开发者,本文也可以给你提供一种开发思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/433600.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解音视频pts,dts,time_base以及时间数学公式

引入 首先介绍一下基础名词 DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。当数据没b帧时,dts pts,有兴趣可参阅我前面视频知识类文章。 PTS&a…

Codeforces Round 973 (Div. 2) A-C 题解

C 提交 MLE 了一次,原因是找到答案没加感叹号 A. Zhan’s Blender 题意 原题描述还是不太清楚 你有 n n n 个水果,每秒可以放入搅拌机 y y y 个水果,搅拌机每秒可以搅拌 x x x 个水果,问最终至少需要多少秒能搅完&#xff1…

第二十一节:学习Redis缓存数据库的Hash操作(自学Spring boot 3.x的第五天)

这节记录下Redis的Hash操作。主要是opsForHash方式和boundHashOps方式。 boundHashOps和opsForHash都是Spring Data Redis中用于操作Redis哈希数据结构的方法,但它们在使用方式和场景上存在一些区别。 boundHashOps 使用方式: boundHashOps方法通过Redi…

后端返回内容有换行标识,前端如何识别换行

<br/>的话 用 v-html \n 可以用css样式 white-space: pre-wrap 后端返回结果 前端

Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】

目录 DispatcherServlet类图HttpServletBean#initnew ServletConfigPropertyValues() FrameworkServlet#initServletBeaninitWebApplicationContextcreateWebApplicationContextconfigureAndRefreshWebApplicationContext DispatcherServlet内部9大组件初始化初识9大组件Dispat…

新手如何学习OpenStack?

引言 在当今云计算的浪潮中&#xff0c;OpenStack作为开源云计算平台的佼佼者&#xff0c;备受关注。它不仅为数据中心提供了灵活的资源管理方案&#xff0c;还极大地推动了云计算技术的普及和发展。然而&#xff0c;对于初学者而言&#xff0c;OpenStack的复杂性和庞大的组件体…

Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)

漏洞描述&#xff1a; 当用户输入信息时&#xff0c;应用程序中的log4j 2组件会将信息记录到日志中 假如日志中包含有语句${jndi:ldap:attacker:1099/exp}&#xff0c;log4j就会去解析该信息&#xff0c;通过jndi的lookup() 方法去解析该url&#xff1a;ldap:attacker:1099/e…

1panel申请https/ssl证书自动续期

参考教程 https://hin.cool/posts/sslfor1panel.html #Acme 账户 #1panel.腾讯云dns账号 这里有一步不需要参考,腾讯云dns账号,就是子帐号授权 直接控制台搜索 访问管理 创建用户 授权搜索dns,选择第一个 点击用户名,去掉AdministratorAccess权限 5.点击api密钥生成即可…

VMware搭建DVWA靶场

目录 1.安装phpstudy 2.搭建DVWA 本次搭建基于VMware16的win7系统 1.安装phpstudy 下载windows版本&#xff1a;小皮面板-好用、安全、稳定的Linux服务器面板&#xff01; 安装后先开启mysql再开启apache&#xff0c;遇到mysql启动不了的情况&#xff0c;最后重装了phpstud…

自动驾驶电车难题的康德式道德决策

摘 要 自动驾驶电车难题是检验人工智能伦理可行性的一块试金石 , 面对不同情境 , 其计算程序既要作出可决定的、 内在一致的判断决策 , 又要与人类的普遍道德常识相兼容 。 康德义务论给出了具有普遍性与一致性的理论框架。 自动驾驶电车的道德决策可视为由计算程序执行的第…

Redis篇(数据类型)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;常用 一、String类型 1. 简介 2. 常见命令 3. Key结构 4. 操作String 5. 实例 二、Hash类型 1. 简介 2. 常见命令 3. 3操作hash 4. 实例 三、List类型 1. 简介 2. 特征 3. 应用场景 4. 常见命令 5. 操作list …

嘻哈纸片人仿手绘插画!FLUX一键生成方法!

​ ​ ​ 如何生成这种嘻哈纸片人的仿手绘插画&#xff1f; 只需1个lora&#xff0c;3个步骤&#xff01; 接下来我们来具体的说一下操作方法以及lora使用注意 嘻哈纸片人lora 基于FLUX模型训练 在线使用&下载地址&#xff1a; https://www.liblib.art/modelinfo/53ee…

计算机毕业设计之:微信小程序的校园闲置物品交易平台(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

使用 Paramiko 实现 SSH 远程连接和命令执行

使用 Paramiko 实现 SSH 远程连接和命令执行 每当灶火燃起&#xff0c;香气弥漫&#xff0c;熟悉的味道植入记忆深处&#xff0c;家&#xff0c;才获得完整的意义。万户千家&#xff0c;味道迥异&#xff0c;但幸福的滋味&#xff0c;却何其相同。 ——《风味人间》 在现代网络…

Kubernetes从零到精通(15-安全)

目录 一、Kubernetes API访问控制 1.传输安全(Transport Security) 2.认证(Authentication) 2.1 认证方式 2.2 ServiceAccount和普通用户的区别 2.3 ServiceAccount管理方式 自动ServiceAccount示例 手动ServiceAccount示例 3.鉴权 (Authorization) 3.1鉴权方式 3.2 …

TOF系列—深度图滤波

本篇文章主要介绍TOF深度图的后处理&#xff0c;鉴于自身水平所限&#xff0c;如有错误&#xff0c;欢迎批评指正。&#xff08;欢迎进Q群交流&#xff1a;874653199&#xff09; TOF由于其本身的特性&#xff0c;导致其所获得的深度图存在以下问题&#xff1a; 1.对空的地方存…

Kafka学习笔记(一)Kafka基准测试、幂等性和事务、Java编程操作Kafka

文章目录 前言4 Kafka基准测试4.1 基于1个分区1个副本的基准测试4.2 基于3个分区1个副本的基准测试4.3 基于1个分区3个副本的基准测试5 Java编程操作Kafka5.1 引入依赖5.2 向Kafka发送消息5.3 从Kafka消费消息5.4 异步使用带有回调函数的生产消息6 幂等性6.1 幂等性介绍6.2 Kaf…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(一)-概述

简介 此前的专栏介绍onesearch1.0和2.0&#xff0c;详情参看4 参考资料&#xff0c;本文解释onesearch 3.0&#xff0c;从Elasticsearch6升级到Elasticsearch8代码实现 &#xff0c;Elasticsearch8 废弃了high rest client&#xff0c;使用新的ElasticsearchClient&#xff0c;…

AI驱动的智能运维:行业案例与挑战解析

华为、蚂蚁、字节跳动如何引领智能运维&#xff1f; ©作者|潇潇 来源|神州问学 引言 OpenAI 发布的 ChatGPT 就像是打开了潘多拉的魔盒&#xff0c;释放出了生产环境中的大语言模型&#xff08;LLMs&#xff09;。一些新的概念&#xff1a;“大语言模型运维 (LLMOps)”…

统信服务器操作系统进入【单用户模式】

统信服务器操作系统D版、E版、A版进入单用户模式的方式。 文章目录 前言一、问题现象二、问题原因三、解决方案1. D版问题解决方案2. E版及A版问题解决方案前言 D版又称企业版、E版又称欧拉版、A版又称龙蜥版。 单用户模式主要是在 grub2 引导时编辑内核引导,一般用于修改用…