想必最近大家家庭羣裏最近都會看到這麼一張圖:
一驚,這什麼玩意兒???後來一搜會發現裏面不同的詩句來自於不同的古詩,嘛,這不是很好玩的一件事情嗎?這次我們使用Github的唐詩宋詞dataset:https://github.com/chinese-poetry/chinese-poetry
來寫一個簡單的藏頭詩生成器。
迎合最近大家在家的心情,以下是效果圖:
我只講思路不說詳細的代碼講解:代碼地址:https://github.com/timcanby/Chinese_acrostic_generator(給star的是好青年)
其實這件事就是先觀察數據:
數據是這個樣子的,句子長短不一,有作者,編號信息,標題和本文。那麼我們需要做的事情就是,統一詩句橫向長度,以及順利遍歷所有的數據。所以問題轉移到,step1:遍歷文件夾數據和json數據的導出 step2:抽取每句詩第一個字做匹配 step3:根據所需詩句長度來當匹配的條件 step4:隨機抽取同樣頭文字的詩句 step5:按照目標語句順序輸出 step6:針對數據庫中不對應漢字的情況做異常處理。
所以首先就是遍歷所有的json文件了,這個每個人操作不同
我選擇使用 os.listdir所以讀目標文件下所有的文件就是:
def getfileFromfilter(rootdir):
list = os.listdir(rootdir)
ReturnList=[]
for i in range(0, len(list)):
if list[i]!='.DS_Store':
path = os.path.join(rootdir, list[i])
ReturnList.append(path)
return (ReturnList)
rootdir下所有文件名會以list的形式返回。
接下來就是json文件的讀入了
咱們
import json
這是個很方便的標準庫,想了解更多:https://www.json.org/json-en.html
然後
f=open(eachJson ,'r',encoding='utf-8')
dict=json.load(f)
這樣所有的數據就會變成dict詞典形式
建立一個用於存篩選過的句子的字典:
sentencelist={}
然後開始篩選我們要的詩句,
我們找到屬性名是
['paragraphs'](詩句)
所以直接用這個做匹配:
try:
f=open(eachJson ,'r',encoding='utf-8')
dict=json.load(f)
for each in dict:
for eachsentence in each['paragraphs']:
if len(eachsentence)==weight:
for eachCharacter in text:
if eachsentence[0] == eachCharacter:
sentencelist[each['author'],each['title'],eachsentence]=eachCharacter
except:continue
這裏weight是詩句長度,可以是12也可以是16,8言就是16,先用長度來篩選後再匹配每句第一個詞 。eachsentence 是句子,那麼eachsentence 【0】自然就是第一個文字。爲了方便查找,匹配後所有的詩句作爲key,對應的頭文字作爲value存進sentencelist這個詞典。存出來是這樣的:(這裏我還存了['author'],['title']以方便以後使用)
因爲key不能重複這個大家都知道。
for eachcha in text:
txt=[]
for key, value in sentencelist.items():
if value==eachcha:
txt.append(key)
print(random.choice(txt)[2])
然後最後再掃一遍用戶要的字符串做randomlist抽選就ok了!
整個過程非常非常簡單,甚至這個版本有很多冗餘的操作,僅供初學者參考!!!轉載留地址,github期待star~~