当前位置:首页 > 文章列表 > Golang > Go教程 > Go语言实现自动填写古诗词实例代码

Go语言实现自动填写古诗词实例代码

来源:脚本之家 2022-12-28 19:43:58 0浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go语言实现自动填写古诗词实例代码》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下go语言自动、古诗词,希望所有认真读完的童鞋们,都有实质性的提高。

前言

“白日依山尽,___”。下句自然填黄河入海流,那么“日月忽其不淹兮,___,___,恐美人之迟暮”,中间两句怎么填呢?

最近工作中有个需求,就是1500道语文诗词填空题没有答案,现在需要给这些题目大爷们匹配它们对应的答案,好在题目信息都很完整,指出了诗词出处、作者信息。自然想到到网上爬取对应文章信息然后字符串匹配答案。目前做完,效果还可以,基本上所有题目的答案都有了,现把操作流程记录下,做个总结。

1. 文章信息获取

网上找了很久,目前发现百度汉语对古诗词收录的比较好,格式也比较规范,整个爬取过程还是比较简单,浏览器分析网站,找到它们的搜索接口:http://hanyu.baidu.com/hanyu/ajax/sugs只需要传一个参数:mainkey,是一个urlencode格式的字符串。接口会返回一个匹配列表,再用作者名称对这个列表做筛选,详细代码如下:

 baseUrl := "http://hanyu.baidu.com/hanyu/ajax/sugs?"
 client := &http.Client{
 }
 u, _ := url.Parse(baseUrl)
 q := u.Query()
 q.Set("mainkey", name)
 u.RawQuery = q.Encode()

 //添加Header
 req, _ := http.NewRequest("GET", u.String(), nil)
 req.Header.Add("User-Agent", `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36`)
 req.Header.Add("DNT", "1")
 req.Header.Add("Host", "hanyu.baidu.com")
 req.Header.Add("Accept-Language", "zh-CN,zh;q=0.8")
 req.Header.Add("Referer", "http://hanyu.baidu.com/shici/detail?pid=be520db056da43238035dc18bb1e1798&tn=sug_click")
 
 resp, errDo := client.Do(req)

拿到返回值以后,筛选出对应的作者信息。

//如果有多个搜索结果,比对author是否正确
 respJson.ForEach(func(key, value gjson.Result) bool {
 //先看看有没有display_name
 displayName := value.Get("display_name.0").String()
 sid := value.Get("sid.0").String()
 if len(displayName) == 0 {
 //不是这条记录
 return true
 }

 //看看type
 typeStr := value.Get("type.0").String()
 if typeStr == "poemline"{
 //取Source
 displayName = value.Get("source_poem.0").String()
 sid = value.Get("source_poem_sid.0").String()
 }

 literatureAuthor := value.Get("literature_author.0").String()
 //author是否一致
 if literatureAuthor == author {
 searchResult.Sid = sid
 searchResult.DisplayName = displayName
 searchResult.Author = literatureAuthor
 return false
 }
 return true // keep iterating
 })

SearchResult保存了搜索到的结果,根据sid拿到文章页面,解析出其中的文章。

func GetContent(sid string) (content string, err error) {
 baseUrl := "http://hanyu.baidu.com/shici/detail"

 result := make([]string, 0, 0)
 client := &http.Client{
 }

 u, _ := url.Parse(baseUrl)
 q := u.Query()
 q.Set("pid", sid)
 u.RawQuery = q.Encode()

 req, _ := http.NewRequest("GET", u.String(), nil)
 req.Header.Add("User-Agent", `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36`)
 req.Header.Add("DNT", "1")
 req.Header.Add("Host", "hanyu.baidu.com")
 req.Header.Add("Accept-Language", "zh-CN,zh;q=0.8")
 req.Header.Add("Referer", "http://hanyu.baidu.com/shici/detail?pid=be520db056da43238035dc18bb1e1798&tn=sug_click")

 resp, errDo := client.Do(req)

 if errDo != nil || resp.StatusCode != 200 {
 err = errors.New("无法连接百度汉语 " + errDo.Error())
 return
 }

 docm, errDoc := goquery.NewDocumentFromResponse(resp)

 if errDoc != nil {
 err = errors.New("解析Doc错误 " + errDoc.Error())
 return
 }

 //诗词信息都保存在 body_p 的div中,可以通过PuerkitoBio/goquery库获取
 pSelect := docm.Find("#body_p")
 pSelect.Each(func(pos int, selection *goquery.Selection) {
 content := strings.TrimSpace(selection.Text())
 result = append(result, content)
 })

 content = strings.Join(result, "")
 return
}

目前会爬取百度汉语、古诗词两个网站的数据,如果有更好的数据源,只需要实现Spider接口,在MapSpiderManifest()方法中注册即可。

type Spider interface {
 GetContent(SearchResult) (string, error)
 FindContent(string, string) (SearchResult, error)
}

func MapSpiderManifest() map[string]Spider {
 //初始化并且注册所有的Spider
 spiderMap := make(map[string]Spider)

 //百度
 baiduSpider := new(BaiduSpider)
 spiderMap["baiduSpider"] = baiduSpider

 //古诗文网
 gushiwenSpider := new(GushiwenSpider)
 spiderMap["gushiwenSpider"] = gushiwenSpider
 return spiderMap
}

2.诗词句子查找

古诗文默写,以前上学的时候做的多了,把一句话抠出来,随机选其中几段话让学生默写。一般可以归类为一下几种模式:

开头留空 :_,[_,...],何人不起故园情。
末尾留空:俱往矣,_,[_,...]。
中间留空:月出于东山之上,_,白露横江,

不管是什么样的模式,就每个填空处来看,只有它前面或者后面有提示句,我们才能知道这个空的答案是什么。也就是说,这样的填空可以自主的找到答案,姑且称之为自主空。而前后都没有提示句的空,只能等待附近有自主空找到了答案,才能找到它本身的答案,用一个图说明更加清晰:

图中灰色的块因为有提示句,所以可以通过步骤一种爬取下来的文章内容找到对应的答案,填入Blank中,具体的查找算法如下代码所示:

//已知newFind的PreString,求BlankString和PostString
func makeWithPreContent(contentsSplit []string, newFind *Find) {
 for l := range contentsSplit {
 if isEqual(contentsSplit[l], newFind.PreString) && l  0 {
 newFind.BlankString = contentsSplit[l-1]
 if l-1 > 0 {
 newFind.PreString = contentsSplit[l-2]
 }
 newFind.BlankFinish = true
 }
 }
}

// 按标点符号分隔内容
func SplitByPunctuation(s string) ([]string, []string) {
 regPunctuation, _ := regexp.Compile(`[,,。.??!!;;::]`)
 //匹配标点符号,保存下来。 然后分割字符串
 toPun := regPunctuation.FindAllString(s, -1)
 result := regPunctuation.Split(s, -1)

 if len(result[len(result)-1]) == 0 {
 result = result[:len(result)-1]
 }

 //去掉前后空格,去掉引号
 for i := range result {
 result[i] = strings.TrimSpace(result[i])
 regQuoting := regexp.MustCompile("[“”‘'']")
 result[i] = regQuoting.ReplaceAllString(result[i], "")
 }
 return result, toPun
}

所有的自主块都找到答案后,可以把每个自主块看作一个双向链表的表头,我们所要做的就是遍历每个双向链表,把其中每个节点的答案都通过查找算法找出来。当下一个节点是NULL,或者下个节点是一个自主块时,就停止遍历,处理下一个双向链表。这样,无论给出的需要填空的内容多么复杂,都可以顺利的完整自动填写工作。

3.效果

一些常用的文言文或诗词:

1、 前赤壁赋

2、 离骚


项目地址:AncientPoetryFillBlank (本地下载

总结

终于介绍完啦!小伙伴们,这篇关于《Go语言实现自动填写古诗词实例代码》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
6行代码快速解决golang TCP粘包问题6行代码快速解决golang TCP粘包问题
上一篇
6行代码快速解决golang TCP粘包问题
Go语言中你不知道的Interface详解
下一篇
Go语言中你不知道的Interface详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    231次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    228次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    226次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    231次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    255次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码