最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言實(shí)現(xiàn)自動(dòng)填寫古詩詞實(shí)例代碼

 更新時(shí)間:2018年03月09日 10:02:07   作者:FengY  
這篇文章主要給大家介紹了關(guān)于Go語言實(shí)現(xiàn)自動(dòng)填寫古詩詞的相關(guān)資料,這是最近在項(xiàng)目中遇到的一個(gè)需求,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

最近工作中有個(gè)需求,就是1500道語文詩詞填空題沒有答案,現(xiàn)在需要給這些題目大爺們匹配它們對(duì)應(yīng)的答案,好在題目信息都很完整,指出了詩詞出處、作者信息。自然想到到網(wǎng)上爬取對(duì)應(yīng)文章信息然后字符串匹配答案。目前做完,效果還可以,基本上所有題目的答案都有了,現(xiàn)把操作流程記錄下,做個(gè)總結(jié)。

1. 文章信息獲取

網(wǎng)上找了很久,目前發(fā)現(xiàn)百度漢語對(duì)古詩詞收錄的比較好,格式也比較規(guī)范,整個(gè)爬取過程還是比較簡(jiǎn)單,瀏覽器分析網(wǎng)站,找到它們的搜索接口:http://hanyu.baidu.com/hanyu/ajax/sugs只需要傳一個(gè)參數(shù):mainkey,是一個(gè)urlencode格式的字符串。接口會(huì)返回一個(gè)匹配列表,再用作者名稱對(duì)這個(gè)列表做篩選,詳細(xì)代碼如下:

 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)

拿到返回值以后,篩選出對(duì)應(yīng)的作者信息。

//如果有多個(gè)搜索結(jié)果,比對(duì)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保存了搜索到的結(jié)果,根據(jù)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錯(cuò)誤 " + 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
}

目前會(huì)爬取百度漢語、古詩詞兩個(gè)網(wǎng)站的數(shù)據(jù),如果有更好的數(shù)據(jù)源,只需要實(shí)現(xiàn)Spider接口,在MapSpiderManifest()方法中注冊(cè)即可。

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

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

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

 //古詩文網(wǎng)
 gushiwenSpider := new(GushiwenSpider)
 spiderMap["gushiwenSpider"] = gushiwenSpider
 return spiderMap
}

2.詩詞句子查找

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

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

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

圖中灰色的塊因?yàn)橛刑崾揪?,所以可以通過步驟一種爬取下來的文章內(nèi)容找到對(duì)應(yīng)的答案,填入Blank中,具體的查找算法如下代碼所示:

//已知newFind的PreString,求BlankString和PostString
func 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和PreString
func 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
 }
 }
}

// 按標(biāo)點(diǎn)符號(hào)分隔內(nèi)容
func SplitByPunctuation(s string) ([]string, []string) {
 regPunctuation, _ := regexp.Compile(`[,,。.??!!;;::]`)
 //匹配標(biāo)點(diǎn)符號(hào),保存下來。 然后分割字符串
 toPun := regPunctuation.FindAllString(s, -1)
 result := regPunctuation.Split(s, -1)

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

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

所有的自主塊都找到答案后,可以把每個(gè)自主塊看作一個(gè)雙向鏈表的表頭,我們所要做的就是遍歷每個(gè)雙向鏈表,把其中每個(gè)節(jié)點(diǎn)的答案都通過查找算法找出來。當(dāng)下一個(gè)節(jié)點(diǎn)是NULL,或者下個(gè)節(jié)點(diǎn)是一個(gè)自主塊時(shí),就停止遍歷,處理下一個(gè)雙向鏈表。這樣,無論給出的需要填空的內(nèi)容多么復(fù)雜,都可以順利的完整自動(dòng)填寫工作。

3.效果

一些常用的文言文或詩詞:

1、 前赤壁賦

2、 離騷


項(xiàng)目地址:AncientPoetryFillBlank (本地下載

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Golang filepath包常用函數(shù)詳解

    Golang filepath包常用函數(shù)詳解

    本文介紹與文件路徑相關(guān)包,該工具包位于path/filepath中,該包試圖與目標(biāo)操作系統(tǒng)定義的文件路徑兼容。本文介紹一些常用函數(shù),如獲取文件絕對(duì)路徑,獲取文件名或目錄名、遍歷文件、分割文件路徑、文件名模式匹配等函數(shù),并給具體示例進(jìn)行說明
    2023-02-02
  • 解決panic: assignment to entry in nil map問題

    解決panic: assignment to entry in nil

    這篇文章主要介紹了解決panic: assignment to entry in nil map問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2008-01-01
  • golang字符串拼接實(shí)現(xiàn)方式和區(qū)別對(duì)比

    golang字符串拼接實(shí)現(xiàn)方式和區(qū)別對(duì)比

    本文介紹了Go語言中字符串拼接的多種方法及其優(yōu)缺點(diǎn),推薦使用strings.Builder進(jìn)行頻繁拼接以優(yōu)化內(nèi)存分配和性能,同時(shí),還討論了通過sync.Pool優(yōu)化高頻創(chuàng)建的對(duì)象,以減少垃圾回收壓力,感興趣的朋友一起看看吧
    2025-02-02
  • go-zero數(shù)據(jù)的流處理利器fx使用詳解

    go-zero數(shù)據(jù)的流處理利器fx使用詳解

    這篇文章主要為大家介紹了go-zero數(shù)據(jù)的流處理利器fx使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go中init()執(zhí)行順序詳解

    Go中init()執(zhí)行順序詳解

    go允許定義多個(gè)init(),多個(gè)init()會(huì)涉及到執(zhí)行先后的問題,本文將詳細(xì)講解Go中init()執(zhí)行順序,感興趣的朋友一起看看吧
    2022-09-09
  • Go路由注冊(cè)方法詳解

    Go路由注冊(cè)方法詳解

    Go語言中,http.NewServeMux()和http.HandleFunc()是兩種不同的路由注冊(cè)方式,前者創(chuàng)建獨(dú)立的ServeMux實(shí)例,適合模塊化和分層路由,靈活性高,但啟動(dòng)服務(wù)器時(shí)需要顯式指定,后者使用全局默認(rèn)的http.DefaultServeMux,適合簡(jiǎn)單場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Go語言開發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解

    Go語言開發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解

    這篇文章主要為大家介紹了Go語言開發(fā)代碼自測(cè)絕佳go?fuzzing用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 詳解Golang中結(jié)構(gòu)體方法的高級(jí)應(yīng)用

    詳解Golang中結(jié)構(gòu)體方法的高級(jí)應(yīng)用

    本文旨在深度剖析Go中結(jié)構(gòu)體方法的高級(jí)應(yīng)用。我們不僅會(huì)回顧結(jié)構(gòu)體方法的基本概念和用法,還將探討如何通過高級(jí)技巧和最佳實(shí)踐,希望對(duì)大家有所幫助
    2024-01-01
  • golang語法使用的注意事項(xiàng)

    golang語法使用的注意事項(xiàng)

    這篇文章主要給大家介紹了關(guān)于golang語法使用的一些注意事項(xiàng),Golang是一種靜態(tài)類型的編程語言,它支持基本的數(shù)據(jù)類型,包括整型、浮點(diǎn)型、布爾型、字符串型,需要的朋友可以參考下
    2023-07-07
  • goland配置自動(dòng)注釋的實(shí)現(xiàn)

    goland配置自動(dòng)注釋的實(shí)現(xiàn)

    本文主要介紹了goland配置自動(dòng)注釋的實(shí)現(xiàn),文中通過圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08

最新評(píng)論

靖远县| 澄城县| 昌邑市| 台中县| 彰武县| 孟连| 太仆寺旗| 五华县| 固始县| 财经| 嵊泗县| 嵊泗县| 武宁县| 伊金霍洛旗| 汾西县| 固始县| 明溪县| 石首市| 三河市| 盱眙县| 石屏县| 五家渠市| 化德县| 延吉市| 洞头县| 太谷县| 浦东新区| 三亚市| 秭归县| 邮箱| 扶风县| 崇阳县| 荣成市| 中超| 潞西市| 渝中区| 西充县| 池州市| 嘉荫县| 旬阳县| 察哈|