藏頭詩人李白——Python的簡單實現
第一步:導入數據
# 載入模塊import pandas as pdimport numpy as np# 導入數據poems = open("poems.txt",encoding="utf-8").read()
詩句來源:全唐詩
第二步:數據分行
# 分行,獲得一句一句詩lines = poems.split("
")# 載入Pandas Dataframesens_all = pd.DataFrame({"sen": lines})# 獲得每一句詩的長度sens_all["length"] = sens_all.sen.str.len()sens_all.length.value_counts().head(10)0 15764124 9587716 2972525 982320 74171 561119 508922 498721 497123 4177Name: length, dtype: int64
- 存在很多空行
- 長度為24和16的行可能是正確的詩句(分別對應五言和七言)
- 部分長度正確的行,可能是目錄行,標題等,需要仔細甄別
第三步:數據清洗
# 剔除包含"《"、"_"、":"以及數字的行sens_all = sens_all.loc[-sens_all.sen.str.contains("《|_|(|[0-9]|:"),]# 僅保留行中包含","或"。"的行sens_all = sens_all.loc[sens_all.sen.str.contains("。|,"),]# 僅保留長度為24或16的行sens_all = sens_all.loc[(sens_all.length==24) | (sens_all.length==16),]# 處理之後的詩句sens_all.head(10)
203 秦川雄帝宅,函谷壯皇居。綺殿千尋起,離宮百雉餘。 24
204 連薨遙接漢,飛觀迥凌虛。雲日隱層闕,風煙出綺疏。 24
206 岩廊罷機務,崇文聊駐輦。玉匣啟龍圖,金繩披鳳篆。 24
207 韋編斷仍續,縹帙舒還卷。對此乃淹留,欹案觀墳典。 24
209 移步出詞林,停輿欣武宴。雕弓寫明月,駿馬疑流電。 24
210 驚雁落虛弦,啼猿悲急箭。閱賞誠多美,於茲乃忘倦。 24
212 鳴笳臨樂館,眺聽歡芳節。急管韻朱弦,清歌凝白雪。 24
213 彩鳳肅來儀,玄鶴紛成列。去茲鄭衛聲,雅音方可悅。 24
215 芳辰追逸趣,禁苑信多奇。橋形通漢上,峰勢接雲危。 24
216 煙霞交隱映,花鳥自參差。何如肆轍跡,萬里賞瑤池。 24
第四步:數據整理
句子拆分
# 進一步把句子拆分開l = np.asarray(sens_all.sen.str.split("。|,"))l[:10]array([list([秦川雄帝宅, 函谷壯皇居, 綺殿千尋起, 離宮百雉餘, ]), list([連薨遙接漢, 飛觀迥凌虛, 雲日隱層闕, 風煙出綺疏, ]), list([岩廊罷機務, 崇文聊駐輦, 玉匣啟龍圖, 金繩披鳳篆, ]), list([韋編斷仍續, 縹帙舒還卷, 對此乃淹留, 欹案觀墳典, ]), list([移步出詞林, 停輿欣武宴, 雕弓寫明月, 駿馬疑流電, ]), list([驚雁落虛弦, 啼猿悲急箭, 閱賞誠多美, 於茲乃忘倦, ]), list([鳴笳臨樂館, 眺聽歡芳節, 急管韻朱弦, 清歌凝白雪, ]), list([彩鳳肅來儀, 玄鶴紛成列, 去茲鄭衛聲, 雅音方可悅, ]), list([芳辰追逸趣, 禁苑信多奇, 橋形通漢上, 峰勢接雲危, ]), list([煙霞交隱映, 花鳥自參差, 何如肆轍跡, 萬里賞瑤池, ])], dtype=object)
維度轉換
# 將二維數據轉換為一維數據def flat(li, re=[]): for i in range(0, len(li)): re.append(li[i][0]) if len(li[i])>1: re.append(li[i][1]) return redf_all = pd.DataFrame({"sen":flat(l)})
取頭取尾
df_all["tou"] = df_all.sen.str[0]df_all["wei"] = df_all.sen.str[-1]df_all.head()
0 秦川雄帝宅 秦 宅
1 函谷壯皇居 函 居
2 連薨遙接漢 連 漢
3 飛觀迥凌虛 飛 虛
4 岩廊罷機務 岩 務
區分五言與七言
df_5w = df_all.loc[df_all.sen.str.len()==5,]df_7w = df_all.loc[df_all.sen.str.len()==7,]
第七步:定義函數
五言藏頭
def Poet_Libai_5_tou(): global l l = [] user_line = input("請輸入四個藏頭字") for i in range(len(user_line)): tf = df_5w.tou.str.contains(user_line[i]) if tf.value_counts()[0]<len(tf): l.append(np.asarray(df_5w.loc[tf,"sen"])[0]) else: l.append("找不到對應的詩句") print("
".join(l))
五言藏尾
def Poet_Libai_5_wei(): global l l = [] user_line = input("請輸入四個藏尾字") for i in range(len(user_line)): tf = df_5w.wei.str.contains(user_line[i]) if tf.value_counts()[0]<len(tf): l.append(np.asarray(df_5w.loc[tf,"sen"])[0]) else: l.append("找不到對應的詩句") print("
".join(l))
七言藏頭
def Poet_Libai_7_tou(): global l l = [] user_line = input("請輸入四個藏頭字") for i in range(len(user_line)): tf = df_7w.tou.str.contains(user_line[i]) if tf.value_counts()[0]<len(tf): l.append(np.asarray(df_7w.loc[tf,"sen"])[0]) else: l.append("找不到對應的詩句") print("
".join(l))
七言藏尾
def Poet_Libai_7_wei(): global l l = [] user_line = input("請輸入四個藏尾字") for i in range(len(user_line)): tf = df_7w.wei.str.contains(user_line[i]) if tf.value_counts()[0]<len(tf): l.append(np.asarray(df_7w.loc[tf,"sen"])[0]) else: l.append("找不到對應的詩句") print("
".join(l))
測試
Poet_Libai_5_tou()請輸入四個藏頭字天氣真好天花近足春氣驕陵上都真耀蘊軒儀好古笑流俗Poet_Libai_5_wei()請輸入四個藏尾字天氣真好廣樂奏鈞天昔年懷壯氣清心常保真不如歸山好Poet_Libai_7_tou()請輸入四個藏頭字天氣真好天目天台倍覺慚氣和草木發萌芽真似驂鸞到上清好把身心清凈處Poet_Libai_7_wei()請輸入四個藏尾字天氣真好造化無為字樂天何如上下皆清氣鉛華不御得天真載持巾櫛禮儀好
推薦閱讀:
※Python之Iterable與Iterator
※用Python做地圖投影 - 多面孔的世界
※【Python3網路爬蟲開發實戰】1.6.1-Flask的安裝
※【翻譯搬運】SciPy-Python科學演算法庫
※SubLime Text 3之配置Python快捷鍵