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

news2024/11/16 7:09:39

前言

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.TagExtracter
  te.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 dictionary
	  plugin.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 HMM
	hmm := 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 ./x
	fmt.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 ./x

	segs := 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 ./x

	log.Println("to slice", gse.ToSlice(segs, true))
	// to slice [西雅图 地标 建筑 ,   seattle   space needle ,   西雅图太空针 .   sky   tree .]
}

func extAndRank(segs gse.Segmenter) {
	var te idf.TagExtracter
	te.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.TextRanker
	tr.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.coloradmin.cn/o/2172094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

戴尔PowerEdge R840服务器亮黄灯 不开机

最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…

商标是什么?为何对企业至关重要?

商标作为企业的核心标识,不仅是区分商品与服务的关键,更是企业品牌塑造、市场区分和消费者信任建立的基石。那么,商标究竟是什么?它又为何对企业如此重要呢? 商标的定义及类型 商标(Trademark)…

Python获取百度翻译的两种方法

一、引言 百度是我们常用的搜索工具,其翻译是与爱词霸合作,总体看其反应速度较快,可以作为项目中重要的翻译工具。根据大家的需要,现提供两种Python获取百度翻译的两种办法: 二、requests法 我们引用requests模块&a…

构建5G-TSN测试平台:架构与挑战

论文标题:Building a 5G-TSN Testbed: Architecture and Challenges 作者信息: Anna Agust-Torra, Marc Ferr-Mancebo, David Rincn-Rivera, Cristina Cervell Pastor, Sebasti Sallent-Ribes,来自西班牙巴塞罗那的加泰罗尼亚理工大学&…

裁剪视频如何让画质不变?一文教会你

当我们想要从一段视频中提取精华,裁剪视频就成了必不可少的技能。 但是,如何做到在裁剪过程中不损害画质,保持视频原有的清晰度和流畅度呢? 这不仅需要技巧,还需要对视频编辑有一定的了解。 本文将为你介绍四种裁剪…

Redis篇(数据类型)

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

13.安卓逆向-frida基础-编写hook脚本1

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

外国电影演员识别系统源码分享

外国电影演员识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

AI产品经理必知:核心人工智能技术概览

第一章:AI产品经理是否需要懂技术及其程度 在当今AI行业快速发展的背景下,作为一位AI产品经理,理解并掌握一定的AI技术知识不仅是锦上添花,更是不可或缺的素质。那么,AI产品经理究竟需要懂到何种程度的技术呢&#xf…

国内车市销量激增,理想成功超越BBA

文/王俣祺 导语:随着“金九银十”的到来,国内汽车市场迎来了一个充满活力的开局。乘用车市场的销量已经迎来新的突破,彰显出中国汽车市场的韧性和潜力。尤为引人注目的是,新能源汽车销量同样激增,成为推动市场增长的重…

C++--IO流

目录 1. C语言的输入与输出 2. 流是什么 3. CIO流 4 stringstream的简单介绍 1. C语言的输入与输出 C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf() 。 scanf(): 从标准输入设备 ( 键 盘 ) 读取数据,并将值存放在变量中 。 printf(): 将…

C++ : 多态

1. 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学…

通过队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int to…

基于微信小程序爱心领养小程序设计与实现(源码+定制+开发)

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

基于Hive和Hadoop的电信流量分析系统

本项目是一个基于大数据技术的电信流量分析系统,旨在为用户提供全面的通信数据和深入的流量使用分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…

无人船在海洋勘探领域的应用!

一、具体应用 海底地形测绘: 无人船可以搭载多波束测深仪等先进设备,进行高精度的海底地形测绘。这些设备能够生成详细的海底地形图,为海洋工程设计和施工提供详尽的水下地形资料。 海底资源勘探: 通过搭载磁力仪、重力仪等地…

安卓手机视频被误删怎么恢复,这3个方法满足你

视频作为一种直观、生动的记录方式,受到了广大用户的喜爱,许多朋友们都喜欢用视频来记录生活或工作中的重要时刻。但有时候会遇到突发情况,导致这些重要视频丢失。别担心,下面小编将同您一起探索这视频恢复的方法,轻松…

springboot健康管理平台-计算机毕业设计源码38430

摘要 本研究旨在设计和实现一个基于大数据的健康管理平台,该平台整合了健康测评、健康知识、体检信息、健康日志、健康数据、我的账户、体检预约、体检报告、健康预测和测评报告等功能模块。随着大数据技术的快速发展,健康管理领域也迎来了新的机遇。随着…

初识Vue3(详细版)

目录 前言 Vue3简介 spring 和Vue3 区别 创建Vue3工程 1 使用vite 构建 0 前提;安装好node.js(node.js作为JavaScript的运行环境) 1 打开终端,切换到桌面(或自己专门创建一个文件夹单独放置) 2 输入命令:npm ge…

32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)

目录 1 指针的长度 2 指针与整数的加减运算 3 指针自增与自减 4 同类型指针相减 5 指针的比较运算 6 测试题 1 指针的长度 在 C 语言中,sizeof 运算符可以用来计算指针的长度。指针的长度实际上与指针所指向的数据类型无关,而是与系统的位数&…