西西成語接龍小助手

2022-08-04 21:01:28

介紹

程式碼地址:https://github.com/taishan1994/chinese_chengyujielong

讀完該文,你可以收穫:

  • python爬蟲的簡單使用。
  • 構建字首樹以進行搜尋提示。
  • 構建一個簡單的成語接龍小程式。

爬蟲模組

首先展示下我們最終獲得的成語的資料:

,成語,拼音,成語解釋,典故出處,近義詞,反義詞,常用程度,感情色彩,語法用法,成語結構,產生年代,英文翻譯,成語謎面
0,阿匼取容,ē ǎn qǔ róng,阿匼:一味迎合的樣子。一味巴結別人以求得他們的喜歡,《新唐書 楊再思傳》:「居宰相十餘年,阿匼取容,無所薦達。」,阿諛取容,剛正不阿,生僻,貶義詞,作謂語、定語;用於人,聯合式,古代,,
1,阿姑阿翁,ā gū ā wēng,阿:名詞的字首。姑:丈夫的母親。翁:丈夫的父親。指公公婆婆。,見:「阿家阿翁」。,阿家阿翁,,一般,褒義詞,作主語、賓語;指公公婆婆,聯合式,近代,father-in-law and mother-in-law,
2,阿嬌金屋,ā jiāo jīn wū,阿嬌:指漢武帝劉徹的姑母(長公主劉嬌)的女兒。原指漢武帝劉徹要用金屋接納阿嬌為婦。這裡泛指美麗高貴的女子。,語出舊題漢·班固《漢武故事》:漢武帝幼時曾對姑母長公主說:「若得阿嬌(姑母之女)作婦,當以金屋貯之。」,金屋藏嬌,,一般,褒義詞,作賓語、定語;多用於女性,偏正式,古代,,
3,阿家阿翁,ā jiā ā wēng,阿:名詞的字首。家:通「姑」,丈夫的母親。翁:丈夫的父親。指公公婆婆。,唐·趙璘《因話錄》卷一:「郭暖嘗與昇平公主琴瑟不調。尚父拘暖,自詣朝童結罪。上召而慰之曰:‘諺雲:不痴不聾,不作阿家阿翁。’」,阿公阿婆,,一般,褒義詞,作主語、賓語;指公公婆婆,聯合式,古代,husband's father and mother,
4,阿平絕倒,ā  píng  jué  dǎo,以之比喻對對方的言論極為佩服。亦用為譏諷言論極為乖謬,常貽笑大方。,據《晉書·衛玠傳》及《王澄傳》載:玠好言玄理。琅玡王澄字平子,兄暱稱之曰:「阿平」。有高名,少所推許,每聞玠言,輒嘆息絕倒。故時為之語曰:「衛玠談道,平子絕倒。」,,,一般,,,,,,
5,阿斗太子,ā dǒu tài zǐ,阿斗:三國蜀漢劉備之子劉禪的小名。此人庸碌無能,雖有諸葛亮等人全力扶助,也不能振興蜀漢。指懦弱無能的人,高陽《胡雪巖全傳 燈火樓臺》:「丈夫是個阿斗太子,哪怕你是諸葛亮,也只好嘆口氣。」,扶不起的阿斗,,常用,貶義詞,作主語、賓語、定語;多用於比喻句,偏正式,現代,an ignorant and incapable man <good-for-nothing fellow>,劉禪

每條成語包含以下屬性:成語,拼音,成語解釋,典故出處,近義詞,反義詞,常用程度,感情色彩,語法用法,成語結構,產生年代,英文翻譯,成語謎面。具體獲取成語的方式在spider,py裡面,直接執行parse_url3_detail()即可得到以上資料。這裡我們去看一下網頁:

我們要先獲取每一頁的初始資訊,在get_all_chengyu3()裡面註釋的部分就是,在得到之後已經將其儲存下來了,接著隨便點選一個成語,進入到具體的詳情頁:

會發現所有的資訊都在帶有class屬性為view_con clearfix的div下,我們可以通過BeautifulSoup的find函數找到這些標籤,比如: div = soup.find("div", {"class":"view_con clearfix"}),然後再進一步獲取該標籤下的一些資料:

dl = div.find("dl")
dts = dl.find_all("dt")
dds = dl.find_all("dd")
for dt,dd in zip(dts, dds):
    cate = dt.text.replace('[', '')
    cate = cate.replace(']', '')
    cate = cate.strip()
    content = dd.text
    content = content.strip()

我們可以通過.text來獲取標籤包裹的文字,比如

作謂語、定語;用於人
可以得到作謂語、定語;用於人

字首樹搜尋提示

程式碼位於trie.py裡面。字首樹的構建很簡單,我們從頭遍歷每一個成語,分別將成語儲存到每一個比字或詞當中,在搜尋的時候以該字或詞為鍵,直接得到值即可:

# coding:utf-8
"""
利用字首樹進行搜尋提示
"""


class TrieTree(object):

    def __init__(self):
        self.dict_trie = dict()

    def add_node(self, word):
        word = word.strip()
        tree = self.dict_trie
        for i in range(1, len(word)+1):
            char = word[:i]
            if char not in tree:
                tree[char] = [word]
            else:
                tree[char].append(word)


    def build_trie_tree(self, cy_list):
        """ 建立 trie 樹 """
        for word in cy_list:
            self.add_node(word)

    def search(self, word):
        """ 搜尋給定 word 字串中與詞典匹配的 entity,
        返回值 None 代表字串中沒有要找的實體,
        如果返回字串,則該字串就是所要找的詞彙的型別
        """
        tree = self.dict_trie
        res = tree.get(word, None)
        return res


if __name__ == '__main__':
    import pandas as pd
    from pprint import pprint
    trie = TrieTree()
    data = pd.read_csv("data/cycd.csv")
    cys = data["成語"].values.tolist()
    trie.build_trie_tree(cys)
    # pprint(trie.dict_trie)
    print(trie.search("略"))
    
['略不世出', '略地侵城', '略地攻城', '略施小計', '略無忌憚', '略知一二', '略知皮毛', '略窺一斑', '略勝一籌', '略見一斑', '略遜一籌', '略高一籌', '略識之無', '略跡原心', '略跡原情', '略跡論心']

成語接龍

程式在cyjl.py裡面,執行之後,我們得到:

==============================
=== 歡迎進行西西嘛呦成語接龍遊戲 ===
請選擇難度(輸入1(簡單),輸入2(困難))
難度:2

這裡的困難模式指西西助手在回答的時候會考慮成語最後一個字在語料庫中開頭出現的次數,返回出現次數最少的成語來讓你儘可能的回答不上來。然後就會出一個字:

出題: 株

此時,你可以輸入提示來獲取一階段提示,主要是其中一個答案的解釋,還不會,再輸入再提示,會給出該成語的前三個字。還是不會,則輸入看看,則會展示可能的一些結果(需要注意的是提示的成語可能沒在這個結果中,因為我們只返回前5個)。接著我們想了解該成語,輸入介紹 成語名,就會展示出該成語的一些資訊。其它的一些注意的是,對於輸入空值和不正確的值都進行了處理,不會影響程式的執行。

出題: 袖
你的回答:提示
提示:成語解釋-- 袖手:藏手於袖中;充耳:塞住耳朵。指不聞不問,漠然置之
你的回答:再提示
提示:前三個字-- 袖手充...
你的回答:看看
['袖中揮拳', '袖手傍觀', '袖手充耳', '袖手旁觀', '袖裡乾坤']
你的回答:介紹 袖手充耳
==============================
成語:袖手充耳
拼音:xiù shǒu chōng ěr
成語解釋:袖手:藏手於袖中;充耳:塞住耳朵。指不聞不問,漠然置之
典故出處:清·夏燮《中西紀事·江上議款》:「既不能誓師討賊,視其力之所能為,則當袖手充耳,姑聽命於發蹤指示之人。」
近義詞:袖手旁觀、充耳不聞、漠然置之
反義詞:nan
常用程度:一般
感情色彩:褒義詞
語法用法:作謂語、定語;用於處事
成語結構:聯合式
產生年代:近代
英文翻譯:nan
成語謎面:nan
==============================
你的回答:

至此,我們的整個流程就結束了。