古诗生成器
import random
import sys
from typing import List, Dict, Tuple, Optional
class PoemGenerator:
def __init__(self):
# 主题分类词库
self.themes = {
"山水": {
"名词": ["山", "峰", "岭", "川", "河", "江", "湖", "海", "溪", "泉", "潭", "瀑", "云", "雾", "霞", "霭", "岩", "石", "崖", "壁", "谷", "涧"],
"形容词": ["青", "翠", "碧", "绿", "苍", "黛", "幽", "深", "险", "峻", "秀", "奇", "巍", "峨", "浩", "渺", "茫", "阔"]
},
"花鸟": {
"名词": ["花", "草", "树", "木", "枝", "叶", "根", "芽", "蕊", "瓣", "桃", "李", "杏", "梅", "兰", "菊", "竹", "荷", "鸟", "莺", "燕", "蝶", "蜂", "蝉", "鸦", "鹊"],
"形容词": ["艳", "香", "娇", "嫩", "鲜", "芳", "柔", "翠", "青", "绿", "红", "紫", "黄", "白", "粉"]
},
"边塞": {
"名词": ["关", "塞", "城", "堡", "营", "帐", "旗", "鼓", "角", "弓", "箭", "刀", "剑", "马", "驼", "兵", "卒", "将", "士", "烟", "沙", "霜", "雪"],
"动词": ["征", "战", "戍", "守", "伐", "攻", "围", "破", "杀", "斩", "射", "骑", "驱", "驰", "鸣", "吹", "擂", "望", "思"]
},
"田园": {
"名词": ["村", "庄", "舍", "庐", "田", "亩", "畦", "埂", "苗", "稻", "麦", "桑", "麻", "豆", "瓜", "蔬", "牛", "羊", "鸡", "犬", "犁", "锄", "镰"],
"动词": ["耕", "种", "耘", "收", "割", "采", "摘", "插", "播", "牧", "养", "喂", "饮", "舂", "炊", "烧"]
},
"思乡": {
"名词": ["乡", "家", "园", "井", "亲", "人", "朋", "友", "书", "信", "雁", "鱼", "月", "日", "云", "帆", "路", "途", "程", "客", "舟", "车"],
"动词": ["思", "念", "忆", "望", "盼", "归", "还", "别", "离", "送", "迎", "逢", "遇", "寄", "传"]
}
}
# 基础词库(所有主题共享)
self.base_vocabulary = {
"名词": ["日", "月", "星", "辰", "天", "地", "风", "雨", "雷", "电", "春", "夏", "秋", "冬", "晨", "昏", "昼", "夜", "年", "岁", "时", "刻", "光", "影", "声", "色", "香", "味", "情", "愁", "恨", "喜", "乐", "诗", "酒", "茶", "琴", "棋", "书", "画", "梦", "魂", "心", "志", "身", "骨", "血", "泪"],
"动词": ["行", "坐", "卧", "立", "走", "跑", "飞", "游", "飘", "落", "生", "死", "存", "亡", "有", "无", "在", "留", "去", "来", "归", "离", "合", "分", "聚", "散", "开", "闭", "升", "降", "出", "入", "见", "闻", "听", "说", "读", "写", "吟", "唱", "歌", "舞", "笑", "哭", "叹", "悲", "欢", "愁", "思", "忆", "望", "看", "观", "察", "觉", "知", "感", "悟", "想", "念", "忘", "记", "问", "答", "言", "语", "论", "议", "谈", "笑", "饮", "食", "睡", "醒", "醉", "迷", "梦", "觉", "醒", "醉", "迷", "梦", "觉"],
"形容词": ["高", "低", "远", "近", "长", "短", "大", "小", "多", "少", "轻", "重", "厚", "薄", "深", "浅", "浓", "淡", "明", "暗", "晴", "阴", "圆", "缺", "方", "正", "斜", "直", "曲", "折", "新", "旧", "老", "少", "强", "弱", "勇", "怯", "智", "愚", "贤", "不肖", "清", "浊", "香", "臭", "甜", "苦", "辣", "酸", "咸", "冷", "暖", "温", "凉", "寒", "暑", "燥", "湿", "静", "动", "忙", "闲", "快", "慢", "急", "缓", "安", "危", "险", "夷", "平", "稳", "奇", "怪", "妙", "绝", "好", "坏", "美", "丑", "善", "恶", "真", "假", "虚", "实", "荣", "辱", "贵", "贱", "富", "贫", "强", "弱", "胜", "败", "成", "破", "完", "缺", "全", "半", "满", "空", "有", "无", "生", "死", "存", "亡"],
"副词": ["独", "共", "同", "皆", "俱", "全", "都", "尽", "空", "只", "仅", "唯", "惟", "亦", "也", "又", "再", "还", "复", "更", "愈", "越", "最", "极", "甚", "颇", "太", "过", "略", "稍", "微", "渐", "忽", "顿", "乍", "初", "始", "终", "已", "曾", "未", "尝", "方", "正", "恰", "适", "刚", "才", "将", "欲", "应", "当", "宜", "合", "该", "必", "须", "定", "确", "实", "诚", "真", "妄", "空", "虚", "实", "徒", "枉", "幸", "偶", "或", "常", "每", "时", "频", "屡", "数", "渐", "骤", "忽", "顿", "乍", "初", "始", "终", "已", "曾", "未", "尝"],
"介词": ["在", "于", "当", "值", "临", "对", "向", "朝", "往", "至", "到", "过", "经", "由", "自", "从", "自从", "起", "迄", "止", "至", "及", "和", "与", "同", "跟", "连", "比", "如", "似", "若", "像", "犹", "尚", "况", "比", "较", "除", "外", "余", "剩", "左", "右", "前", "后", "上", "下", "里", "外", "中", "间", "旁", "侧", "东", "西", "南", "北", "左", "右", "前", "后", "上", "下", "里", "外", "中", "间", "旁", "侧"],
"助词": ["之", "乎", "者", "也", "矣", "焉", "哉", "兮", "而", "以", "其", "且", "然", "或", "既", "亦", "犹", "尚", "况", "固", "诚", "夫", "盖", "唯", "惟", "故", "是", "此", "彼", "其", "斯", "兹", "夫", "盖", "然", "则", "况", "抑", "岂", "宁", "庸", "讵", "独", "徒", "空", "只", "仅", "唯", "惟", "亦", "也", "又", "再", "还", "复", "更", "愈", "越", "最", "极", "甚", "颇", "太", "过", "略", "稍", "微", "渐", "忽", "顿", "乍", "初", "始", "终", "已", "曾", "未", "尝"],
"语气词": ["兮", "哉", "也", "乎", "矣", "耶", "耳", "欤", "噫", "嘘", "呵", "哦", "呀", "哇", "矣夫", "而已", "云尔", "焉耳", "也哉", "乎哉", "耶哉", "欤哉", "噫嘻", "呜呼", "嗟乎", "嗟哉", "噫吁嚱"]
}
# 韵脚字典(平水韵简化版)
self.rhymes = {
"上平一东": ["东", "同", "铜", "桐", "筒", "童", "瞳", "中", "衷", "忠", "终", "种", "崇", "嵩", "弓", "躬", "宫", "融", "雄", "熊", "穹", "穷", "冯", "风", "枫", "丰", "充", "隆", "空", "公", "功", "工", "攻", "蒙", "笼", "聋", "珑", "洪", "红", "虹", "鸿", "丛", "翁", "匆", "葱", "聪", "通", "蓬", "烘", "潼", "胧", "峒", "螽", "梦", "讧", "冻", "忡", "懵", "庞", "种", "盅", "芎", "倥", "艨", "绒", "葱", "匆", "骢", "鬃", "蓬", "烘", "潼", "胧", "峒", "螽", "梦", "讧", "冻", "忡", "懵", "庞", "种", "盅", "芎", "倥", "艨", "绒", "葱", "匆", "骢", "鬃"],
"上平二冬": ["冬", "咚", "彤", "农", "宗", "钟", "龙", "舂", "松", "冲", "容", "榕", "蓉", "溶", "庸", "封", "胸", "雍", "浓重", "从", "逢", "缝", "踪", "茸", "峰", "锋", "烽", "蛩", "慵", "恭", "供", "蚣", "喁", "墉", "镛", "佣", "溶", "邛", "共", "龚", "凶", "匈", "汹", "胸", "雍", "浓重", "从", "逢", "缝", "踪", "茸", "峰", "锋", "烽", "蛩", "慵", "恭", "供", "蚣", "喁", "墉", "镛", "佣", "溶", "邛", "共", "龚", "凶", "匈", "汹"],
"上平三江": ["江", "缸", "窗", "邦", "降", "双", "泷", "庞", "撞", "豇", "扛", "杠", "腔", "梆", "桩", "幢", "跫", "艭", "龙", "庞", "撞", "豇", "扛", "杠", "腔", "梆", "桩", "幢", "跫", "艭"],
"上平四支": ["支", "枝", "移", "为", "垂", "吹", "陂", "碑", "奇", "宜", "仪", "皮", "儿", "离", "施", "知", "驰", "池", "规", "危", "夷", "师", "姿", "迟", "眉", "悲", "之", "芝", "时", "诗", "棋", "旗", "辞", "词", "期", "祠", "基", "疑", "姬", "丝", "司", "葵", "医", "帷", "思", "滋", "持", "随", "痴", "维", "卮", "麋", "螭", "麾", "墀", "弥", "慈", "遗", "肌", "脂", "雌", "披", "嬉", "尸", "狸", "炊", "湄", "篱", "兹", "差", "疲", "茨", "卑", "亏", "蕤", "陲", "骑", "曦", "歧", "岐", "谁", "斯", "私", "窥", "熙", "欺", "疵", "赀", "羁", "彝", "髭", "颐", "资", "糜", "饥", "衰", "锥", "姨", "楣", "夔", "涯", "伊", "蓍", "追", "缁", "箕", "椎", "罴", "篪", "萎", "匙", "脾", "坻", "嶷", "治", "骊", "尸", "綦", "怡", "尼", "漪", "牺", "饴", "鸱", "推", "縻", "璃", "祁", "绥", "逵", "羲", "羸", "肢", "骐", "訾", "咨", "睢", "馗", "胝", "鳍", "蛇", "陴", "淇", "淄", "丽", "筛", "厮", "氏", "痍", "貔", "比", "僖", "贻", "禧", "鹂", "瓷", "琦", "嵋", "怩", "熹", "孜", "台", "蚩", "罹", "魑", "丕", "琪", "耆", "衰", "惟", "剂", "提", "禧", "居", "栀", "戏", "畸", "椅", "崖", "孳", "思", "滋", "持", "随", "痴", "维", "卮", "麋", "螭", "麾", "墀", "弥", "慈", "遗", "肌", "脂", "雌", "披", "嬉", "尸", "狸", "炊", "湄", "篱", "兹", "差", "疲", "茨", "卑", "亏", "蕤", "陲", "骑", "曦", "歧", "岐", "谁", "斯", "私", "窥", "熙", "欺", "疵", "赀", "羁", "彝", "髭", "颐", "资", "糜", "饥", "衰", "锥", "姨", "楣", "夔", "涯", "伊", "蓍", "追", "缁", "箕", "椎", "罴", "篪", "萎", "匙", "脾", "坻", "嶷", "治", "骊", "尸", "綦", "怡", "尼", "漪", "牺", "饴", "鸱", "推", "縻", "璃", "祁", "绥", "逵", "羲", "羸", "肢", "骐", "訾", "咨", "睢", "馗", "胝", "鳍", "蛇", "陴", "淇", "淄", "丽", "筛", "厮", "氏", "痍", "貔", "比", "僖", "贻", "禧", "鹂", "瓷", "琦", "嵋", "怩", "熹", "孜", "台", "蚩", "罹", "魑", "丕", "琪", "耆", "衰", "惟", "剂", "提", "禧", "居", "栀", "戏", "畸", "椅", "崖", "孳"],
# 简化起见,只列出部分韵部...
}
# 平仄字典(简化版)
self.pingze = {
"平": ["东", "同", "铜", "桐", "筒", "童", "瞳", "中", "衷", "忠", "终", "种", "崇", "嵩", "弓", "躬", "宫", "融", "雄", "熊", "穹", "穷", "冯", "风", "枫", "丰", "充", "隆", "空", "公", "功", "工", "攻", "蒙", "笼", "聋", "珑", "洪", "红", "虹", "鸿", "丛", "翁", "匆", "葱", "聪", "通", "蓬", "烘", "潼", "胧", "峒", "螽", "梦", "讧", "冻", "忡", "懵", "庞", "种", "盅", "芎", "倥", "艨", "绒", "葱", "匆", "骢", "鬃", "冬", "咚", "彤", "农", "宗", "钟", "龙", "舂", "松", "冲", "容", "榕", "蓉", "溶", "庸", "封", "胸", "雍", "浓重", "从", "逢", "缝", "踪", "茸", "峰", "锋", "烽", "蛩", "慵", "恭", "供", "蚣", "喁", "墉", "镛", "佣", "溶", "邛", "共", "龚", "凶", "匈", "汹", "江", "缸", "窗", "邦", "降", "双", "泷", "庞", "撞", "豇", "扛", "杠", "腔", "梆", "桩", "幢", "跫", "艭", "支", "枝", "移", "为", "垂", "吹", "陂", "碑", "奇", "宜", "仪", "皮", "儿", "离", "施", "知", "驰", "池", "规", "危", "夷", "师", "姿", "迟", "眉", "悲", "之", "芝", "时", "诗", "棋", "旗", "辞", "词", "期", "祠", "基", "疑", "姬", "丝", "司", "葵", "医", "帷", "思", "滋", "持", "随", "痴", "维", "卮", "麋", "螭", "麾", "墀", "弥", "慈", "遗", "肌", "脂", "雌", "披", "嬉", "尸", "狸", "炊", "湄", "篱", "兹", "差", "疲", "茨", "卑", "亏", "蕤", "陲", "骑", "曦", "歧", "岐", "谁", "斯", "私", "窥", "熙", "欺", "疵", "赀", "羁", "彝", "髭", "颐", "资", "糜", "饥", "衰", "锥", "姨", "楣", "夔", "涯", "伊", "蓍", "追", "缁", "箕", "椎", "罴", "篪", "萎", "匙", "脾", "坻", "嶷", "治", "骊", "尸", "綦", "怡", "尼", "漪", "牺", "饴", "鸱", "推", "縻", "璃", "祁", "绥", "逵", "羲", "羸", "肢", "骐", "訾", "咨", "睢", "馗", "胝", "鳍", "蛇", "陴", "淇", "淄", "丽", "筛", "厮", "氏", "痍", "貔", "比", "僖", "贻", "禧", "鹂", "瓷", "琦", "嵋", "怩", "熹", "孜", "台", "蚩", "罹", "魑", "丕", "琪", "耆", "衰", "惟", "剂", "提", "禧", "居", "栀", "戏", "畸", "椅", "崖", "孳"],
"仄": ["上", "去", "入", "近", "远", "大", "小", "古", "老", "少", "壮", "病", "死", "苦", "乐", "笑", "哭", "起", "坐", "卧", "立", "行", "走", "来", "去", "上", "下", "左", "右", "前", "后", "东", "西", "南", "北", "高", "低", "长", "短", "多", "少", "轻", "重", "厚", "薄", "深", "浅", "浓", "淡", "明", "暗", "晴", "阴", "圆", "缺", "方", "正", "斜", "直", "曲", "折", "新", "旧", "强", "弱", "勇", "怯", "智", "愚", "贤", "不肖", "清", "浊", "香", "臭", "甜", "苦", "辣", "酸", "咸", "冷", "暖", "温", "凉", "寒", "暑", "燥", "湿", "静", "动", "忙", "闲", "快", "慢", "急", "缓", "安", "危", "险", "夷", "平", "稳", "奇", "怪", "妙", "绝", "好", "坏", "美", "丑", "善", "恶", "真", "假", "虚", "实", "荣", "辱", "贵", "贱", "富", "贫", "胜", "败", "成", "破", "完", "缺", "全", "半", "满", "空", "有", "无", "生", "死", "存", "亡", "日", "月", "星", "辰", "天", "地", "风", "雨", "雷", "电", "春", "夏", "秋", "冬", "晨", "昏", "昼", "夜", "年", "岁", "时", "刻", "光", "影", "声", "色", "香", "味", "情", "愁", "恨", "喜", "乐", "诗", "酒", "茶", "琴", "棋", "书", "画", "梦", "魂", "心", "志", "身", "骨", "血", "泪", "行", "坐", "卧", "立", "走", "跑", "飞", "游", "飘", "落", "生", "死", "存", "亡", "有", "无", "在", "留", "去", "来", "归", "离", "合", "分", "聚", "散", "开", "闭", "升", "降", "出", "入", "见", "闻", "听", "说", "读", "写", "吟", "唱", "歌", "舞", "笑", "哭", "叹", "悲", "欢", "愁", "思", "忆", "望", "看", "观", "察", "觉", "知", "感", "悟", "想", "念", "忘", "记", "问", "答", "言", "语", "论", "议", "谈", "笑", "饮", "食", "睡", "醒", "醉", "迷", "梦", "觉", "醒", "醉", "迷", "梦", "觉"]
}
# 五言诗平仄格式(简化版)
self.wuyan_pingze_patterns = [
# 平起式
["平", "平", "仄", "仄", "平"], # 首句入韵
["平", "仄", "平", "平", "仄"], # 首句不入韵
# 仄起式
["仄", "仄", "仄", "平", "平"], # 首句入韵
["仄", "平", "平", "仄", "仄"] # 首句不入韵
]
# 七言诗平仄格式(简化版)
self.qiyan_pingze_patterns = [
# 平起式
["平", "平", "仄", "仄", "仄", "平", "平"], # 首句入韵
["平", "平", "仄", "仄", "平", "平", "仄"], # 首句不入韵
# 仄起式
["仄", "仄", "平", "平", "仄", "仄", "平"], # 首句入韵
["仄", "仄", "平", "平", "平", "仄", "仄"] # 首句不入韵
]
def generate_line(self, template, theme=None, pingze_pattern=None, position=None):
"""生成一行诗句,支持主题和平仄要求"""
line = ""
for i, word_type in enumerate(template):
# 优先从主题词库中选择
vocabulary = self.base_vocabulary.copy()
if theme and word_type in self.themes[theme]:
vocabulary[word_type] = self.themes[theme][word_type] + vocabulary[word_type]
# 随机选择一个词
word = random.choice(vocabulary[word_type])
# 如果有平仄要求且当前位置在平仄模式中指定了,检查平仄
if pingze_pattern and position is not None and i < len(pingze_pattern):
required_tone = pingze_pattern[i]
# 如果当前词的平仄不符合要求,尝试替换
if word in self.pingze["平"] and required_tone == "仄":
# 需要仄声字
candidates = [w for w in vocabulary[word_type] if w in self.pingze["仄"]]
if candidates:
word = random.choice(candidates)
elif word in self.pingze["仄"] and required_tone == "平":
# 需要平声字
candidates = [w for w in vocabulary[word_type] if w in self.pingze["平"]]
if candidates:
word = random.choice(candidates)
line += word
return line
def generate_poem(self, poem_type, title=None, theme=None, hidden_head=None):
"""生成一首完整的诗,支持主题和藏头诗"""
if poem_type == "五言":
templates = self.wuyan_templates
lines_per_stanza = 4
total_lines = 8
pingze_patterns = self.wuyan_pingze_patterns
elif poem_type == "七言":
templates = self.qiyan_templates
lines_per_stanza = 4
total_lines = 8
pingze_patterns = self.qiyan_pingze_patterns
else:
print("错误:请选择'五言'或'七言'")
return None
poem = []
# 随机选择韵部
rhyme_key = random.choice(list(self.rhymes.keys()))
rhyme_words = self.rhymes[rhyme_key]
# 随机选择平仄格式(首联平起或仄起)
pingze_pattern_idx = random.randint(0, 1)
# 生成四联(首联、颔联、颈联、尾联)
for i in range(total_lines):
# 随机选择一个模板
template = random.choice(templates)
# 确定当前行的平仄格式
if i < lines_per_stanza: # 首联
pingze_pattern = pingze_patterns[pingze_pattern_idx]
else: # 后续联
# 颔联和颈联要求对仗,这里简化处理,保持平仄交替
pingze_pattern = pingze_patterns[pingze_pattern_idx + 2 if pingze_pattern_idx < 2 else pingze_pattern_idx - 2]
# 生成诗句
line = self.generate_line(template, theme, pingze_pattern, i)
# 处理藏头诗
if hidden_head and i < len(hidden_head):
line = hidden_head[i] + line[1:]
# 偶数行(韵脚所在行)
if i % 2 == 1:
# 确保最后一个字押韵
if len(line) > 0:
line = line[:-1] + random.choice(rhyme_words)
poem.append(line)
# 添加标题(如果有)
if title:
poem.insert(0, title)
poem.insert(1, "——") # 分隔符
return poem
def print_poem(self, poem):
"""美观地打印诗歌"""
if not poem:
return
# 如果有标题,先打印标题
if len(poem) > 2 and poem[1] == "——":
print(f"\033[1;34m{poem[0]}\033[0m") # 蓝色标题
start_idx = 2
else:
start_idx = 0
# 打印诗歌正文
for i in range(start_idx, len(poem)):
if i % 2 == 0 and i < len(poem) - 1:
# 奇数句(上联)
print(f"\033[1;32m{poem[i]}\033[0m") # 绿色
else:
# 偶数句(下联)
print(f"\033[1;31m{poem[i]}\033[0m") # 红色
def main():
print("欢迎使用古诗生成器")
generator = PoemGenerator()
while True:
print("\n请选择诗歌类型:")
print("1. 五言诗")
print("2. 七言诗")
print("3. 退出")
choice = input("请输入选项 (1-3): ")
if choice == "3":
print("感谢使用!再见。")
break
poem_type = "五言" if choice == "1" else "七言" if choice == "2" else None
if not poem_type:
print("无效的选择,请重新输入。")
continue
title = input("请输入诗题(直接回车跳过): ").strip()
if not title:
title = f"{poem_type}诗"
# 选择主题
print("\n请选择诗歌主题:")
themes = list(generator.themes.keys())
for i, theme in enumerate(themes, 1):
print(f"{i}. {theme}")
print(f"{len(themes) + 1}. 无特定主题")
theme_choice = input(f"请输入选项 (1-{len(themes) + 1}): ")
theme = themes[int(theme_choice) - 1] if 1 <= int(theme_choice) <= len(themes) else None
# 藏头诗功能
use_hidden_head = input("是否使用藏头诗功能?(y/n): ").lower()
hidden_head = None
if use_hidden_head == "y":
max_length = 8 if poem_type == "五言" else 7
hidden_text = input(f"请输入{max_length}字以内的藏头文本: ").strip()
if len(hidden_text) > 0:
hidden_head = list(hidden_text)[:max_length]
poem = generator.generate_poem(poem_type, title, theme, hidden_head)
generator.print_poem(poem)
if __name__ == "__main__":
main()