亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言實現自動填寫古詩詞實例代碼

2020-04-01 18:58:41
字體:
來源:轉載
供稿:網友

前言

“白日依山盡,___”。下句自然填黃河入海流,那么“日月忽其不淹兮,___,___,恐美人之遲暮”,中間兩句怎么填呢?

最近工作中有個需求,就是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.詩詞句子查找

古詩文默寫,以前上學的時候做的多了,把一句話摳出來,隨機選其中幾段話讓學生默寫。一般可以歸類為一下幾種模式:

開頭留空 :_,[_,...],何人不起故園情。
末尾留空:俱往矣,_,[_,...]。
中間留空:月出于東山之上,_,白露橫江,

不管是什么樣的模式,就每個填空處來看,只有它前面或者后面有提示句,我們才能知道這個空的答案是什么。也就是說,這樣的填空可以自主的找到答案,姑且稱之為自主空。而前后都沒有提示句的空,只能等待附近有自主空找到了答案,才能找到它本身的答案,用一個圖說明更加清晰:

go語言,go語言教程,go語言web開發,go語言編程

圖中灰色的塊因為有提示句,所以可以通過步驟一種爬取下來的文章內容找到對應的答案,填入Blank中,具體的查找算法如下代碼所示:

//已知newFind的PreString,求BlankString和PostStringfunc makeWithPreContent(contentsSplit []string, newFind *Find) { for l := range contentsSplit { if isEqual(contentsSplit[l], newFind.PreString) && l < len(contentsSplit)-1 { newFind.BlankString = contentsSplit[l+1] if l < len(contentsSplit)-2 { newFind.PostString = contentsSplit[l+2] } newFind.BlankFinish = true } }}//已知newFind的PostString,求BlankString和PreStringfunc makeWithPostContent(contentsSplit []string, newFind *Find) { for l := range contentsSplit { if isEqual(contentsSplit[l], newFind.PostString) && 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、 前赤壁賦

go語言,go語言教程,go語言web開發,go語言編程

2、 離騷

go語言,go語言教程,go語言web開發,go語言編程

項目地址:AncientPoetryFillBlank

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人av在线| 91久久国产精品91久久性色| 亚洲系列中文字幕| 欧美大尺度在线观看| 国产国语videosex另类| 亚洲最大在线视频| 91精品久久久久久久久中文字幕| 久久久精品视频在线观看| 在线性视频日韩欧美| 欧美大片大片在线播放| 亚洲自拍偷拍第一页| 亚洲国产成人久久综合一区| 亚洲人成电影网站色| 日韩中文视频免费在线观看| 色偷偷偷亚洲综合网另类| 亚洲一区www| 91av中文字幕| 日韩av黄色在线观看| 91精品国产91久久久久| 国产精品中文在线| 久热精品视频在线免费观看| 亚洲福利在线观看| 最近2019中文字幕第三页视频| 日本欧美国产在线| 国产精品都在这里| 91精品国产自产91精品| 精品久久久久久久久久久| 亚洲一区二区三区毛片| 亚洲欧洲国产一区| 亚洲欧美在线x视频| 日韩中文字幕在线| 国产精品白嫩美女在线观看| 国产ts人妖一区二区三区| 午夜精品久久久久久99热软件| 国产一区二区三区三区在线观看| 久久久亚洲精品视频| 66m—66摸成人免费视频| 日韩av一卡二卡| 久久亚洲精品毛片| 国产精品高清在线观看| 久久久久久国产精品美女| 伦理中文字幕亚洲| 欧美亚洲国产视频| 亚洲理论在线a中文字幕| 夜夜嗨av一区二区三区免费区| 成人黄色免费片| 国产精品黄色影片导航在线观看| 在线性视频日韩欧美| 中文字幕日韩综合av| 亚州成人av在线| 久久av资源网站| 欧美性理论片在线观看片免费| 最近2019中文字幕mv免费看| 亚洲激情在线观看视频免费| 欧美精品18videosex性欧美| 国产成人精品国内自产拍免费看| 日韩精品亚洲视频| 中文字幕日韩精品有码视频| 亚洲天堂男人天堂女人天堂| 欧美猛男性生活免费| 国产在线a不卡| 久久免费国产精品1| 国产欧美日韩精品专区| 在线播放国产精品| 欧美激情在线观看视频| 欧美日韩中国免费专区在线看| 国产精品久久电影观看| 日韩成人激情在线| 中国日韩欧美久久久久久久久| 91精品国产91久久久久久最新| 国产视频丨精品|在线观看| 97av在线视频| 人人爽久久涩噜噜噜网站| 亚洲精品日韩欧美| 成人久久精品视频| xxxxx成人.com| 欧美国产日韩一区二区三区| 欧美特黄级在线| 亚洲一区免费网站| 粗暴蹂躏中文一区二区三区| www.日韩不卡电影av| 成人黄色片网站| 国产精品老女人视频| 国产精品a久久久久久| 欧美一区二区大胆人体摄影专业网站| 在线电影av不卡网址| www.亚洲成人| 国产视频福利一区| 91精品啪在线观看麻豆免费| 日韩在线视频中文字幕| 亚洲精品国产精品国产自| 91亚洲永久免费精品| 久久中文精品视频| 国产成人精品在线播放| 日韩专区在线播放| 亚洲日韩第一页| 亚洲男人的天堂在线播放| 欧美性猛交99久久久久99按摩| 久久视频精品在线| 日韩黄色在线免费观看| 91av视频导航| 日韩视频免费中文字幕| 插插插亚洲综合网| 日本免费一区二区三区视频观看| 日韩欧美在线播放| 日韩欧美国产骚| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩在线视频观看| 8090成年在线看片午夜| 国产一区二区三区久久精品| 欧美一级淫片丝袜脚交| xxx欧美精品| 欧美在线视频一区二区| 自拍偷拍亚洲区| 亚洲免费视频一区二区| 尤物99国产成人精品视频| 91亚洲国产成人精品性色| 欧美成人午夜激情| 欧美成人精品在线视频| 国内精品视频在线| 国产91|九色| 欧美孕妇与黑人孕交| 亚洲第一网中文字幕| 国产精品日韩在线| 中文字幕精品影院| 亚洲摸下面视频| 国产一区二区三区18| 国产一区二区三区在线免费观看| 成人免费网站在线| 欧美日韩亚洲激情| 日韩福利视频在线观看| 欧美另类在线观看| 欧美麻豆久久久久久中文| 第一福利永久视频精品| 久久99热这里只有精品国产| 中文字幕日韩欧美精品在线观看| 欧美日韩中国免费专区在线看| 久久人人爽亚洲精品天堂| 亚洲福利在线观看| 永久555www成人免费| 91在线免费观看网站| 亚洲精品一二区| 色婷婷综合久久久久中文字幕1| 亚洲视频综合网| 亚洲午夜色婷婷在线| 日韩av影院在线观看| 日日摸夜夜添一区| 成人欧美一区二区三区在线湿哒哒| 国产a∨精品一区二区三区不卡| …久久精品99久久香蕉国产| 精品久久久久久电影| 日韩精品在线免费| 一区二区欧美亚洲| 91麻豆国产语对白在线观看| 成人精品一区二区三区电影免费| 国产热re99久久6国产精品| 欧美激情网站在线观看| 国产91精品在线播放| 国产成人福利夜色影视| 日韩欧美中文字幕在线观看| 91最新国产视频| 亚洲国产精品推荐| 美女精品久久久| 日韩欧美成人网|