Python文本分析案例:近体诗格律分析
作者:长行
时间:2020.05.26
在这个案例中,我们将要实现近体诗格律的分析。具体的,我们从如下角度分析近体诗的格律:
诗句数量、诗句字数是否符合近体诗的要求,即是否为五绝、七绝、五律、七律中的一种(暂不考虑排律、六言的情况)
是否押了平声韵,所押的韵脚是什么平水韵部(暂不考虑首句押韵的情况)
诗句是否有拗句,是否存在孤平和拗救的情况
诗文是否符合对黏的要求
如果当时该诗不符合第1个或第2个要求,则不再分析;如果符合第1个和第2个要求,则以如下方式分析该诗的格律。
《首春》 李世民
寒随穷律变,春逐鸟声开。
平平平仄仄 平仄仄平平(十灰) —— 仄仄脚正格 平平脚正格
初风飘带柳,晚雪间花梅。
平平平仄仄 仄仄中平平(十灰) —— 【失黏】仄仄脚正格 平平脚正格
碧林青旧竹,绿沼翠新苔。
仄平平仄仄 仄仄仄平平(十灰) —— 【失黏】仄仄脚正格 平平脚正格
芝田初雁去,绮树巧莺来。
平平平仄中 仄中中平平(十灰) —— 【失黏】仄仄脚正格 平平脚正格
下面我们开始实现以上功能。
首先,我们读取案例0201-全唐诗文本整理案例中已经整理好的全唐诗文本进行遍历。
with open("全唐诗.json", encoding="UTF-8") as file:
poem_json = json.loads(file.read())
第1个要求
检查诗句数量
近体诗在诗句数量上主要绝句、律诗和排律,绝句(律绝)由四句组成,律诗由八句组成,排律则超过八句,当前只考虑绝句和律诗的情况;在具体实现上,我们可以通过正则表达式,依据标点符号来拆分诗文中的各个句子,并统计诗句的总数是否为4或8。
sentence_list = [sentence for sentence in re.split("[,。?!]", content) if sentence != ""] # 生成句子列表
if len(sentence_list) != 4 and len(sentence_list) != 8:
print("[古体诗]诗句数量:", len(sentence_list))
检查诗句字数
近体诗在诗句字数上通常包括五言和七言两种(六言律诗传世极少,暂不考虑);在具体实现上,我们使用列表生成式和内置函数all判断诗中句子是否均为五言或七言。
if not all([len(sentence) == 5 or len(sentence) == 7 for sentence in sentence_list]):
print("[古体诗]诗句并非五言或七言", [len(sentence) for sentence in sentence_list])
诗句平仄标注
第2个、第3个、第4个要求的分析都需要我们先标注诗句的平仄,即完成类似于如下方式的标注。
寒随穷律变,春逐鸟声开。
平平平仄仄 平仄仄平平
我们使用查平水韵表的方式,来判断诗句中每个字的平仄并标注。其中阴平和阳平均属于平声,标注为“平”;上声、去声、入声均属于仄声,标注为“仄”。若某字不存在于平水韵表中,或同时存在于多个不同平仄的韵部中,均认为该字平仄无法判断,标注为“中”;在后续的分析中,不考虑这些无法判断平仄的字的影响。
在具体实现上,包括如下步骤:
导入平水韵表并将其整理为字典;其中key为字,value为所有包含该字的韵部的名称及音调的列表;
使用导入平水韵表的字典,实现判断单个字平仄的函数;
使用判断单个字平仄的函数,实现诗句平仄的标注。
导入平水韵表
def load_rhythm_list():
"""