ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Python自动化诗歌生成:从NLP基础到混合引擎实现

Python自动化诗歌生成:从NLP基础到混合引擎实现 1. 项目概述从“写诗”到“造诗”的自动化探索“Python-Poem-Maker”这个名字听起来就挺有意思的对吧乍一看你可能觉得这又是一个用Python生成几行打油诗的小玩具。但如果你像我一样在数据分析和自动化脚本领域摸爬滚打了十几年你就会意识到这个标题背后藏着的远不止是几行押韵的文字。它本质上是一个文本生成与自然语言处理NLP的微型实践项目是连接Python基础语法、数据处理、算法逻辑乃至一点点艺术创作的绝佳桥梁。我最初接触类似的想法是在为一个文创团队做数据分析支持时。他们需要为大量的产品生成简短、有韵味的宣传语手动创作效率低下且风格不一。当时我就想能不能用代码模拟这个创作过程于是一个简单的“诗句生成器”雏形就诞生了。这个“Poem-Maker”项目正是这类需求的典型代表它要求我们教会计算机理解诗歌的“结构”如押韵、平仄、字数并按照一定的规则或模型自动组合出符合人类审美习惯的文本。对于学习者而言这个项目堪称“宝藏”。它不像爬虫或数据分析那样有明确的数据源和目标也不像Web开发那样有固定的框架。你需要从零开始设计规则、处理语料、实现算法并不断调试输出结果。整个过程会强迫你综合运用字符串处理、列表/字典操作、文件I/O、随机数生成甚至涉足简单的马尔可夫链或基于规则的模式匹配。无论你是刚学完Python语法想找个项目练手的新人还是想深入理解NLP基础原理的进阶者这个项目都能给你带来实实在在的收获。接下来我会把我构建一个功能相对完整的“Python-Poem-Maker”的全过程拆解给你看包括设计思路、核心实现、踩过的坑以及让输出结果更“像诗”的独家技巧。2. 核心设计思路规则驱动与数据驱动在动手写代码之前我们必须明确一点我们要造的“诗”是什么是严谨的律诗绝句还是现代自由诗不同的目标技术路径截然不同。为了兼顾趣味性和实现难度我建议以生成类似“五言/七言”的仿古短句为目标押韵和基本的意境连贯作为优化方向。我们的设计思路可以融合“规则驱动”和“数据驱动”两种模式。2.1 规则驱动定义诗歌的“骨架”规则驱动是初代方案的核心。我们人为定义诗歌的格式模板。例如一首“五言绝句”的骨架可以是格式4行每行5个字。押韵第2、4句的最后一个字押韵押平水韵或中华新韵的某个韵部。平仄初期可以不做严格要求但可以作为高级特性加入。在这个骨架下我们的程序逻辑就变成了一个“填空”游戏从一个预置的、分好类的词语库中按照位置和押韵要求随机选取词语进行填充。这需要我们预先构建一个结构化的词库。词库数据结构设计心得我最初用简单的.txt文件一行一个词很快发现管理起来非常混乱。后来改用JSON格式结构清晰易于扩展。一个基础的词库结构可以这样设计{ “名词”: [“春风” “秋月” “青山” “流水” ...] “动词”: [“吹” “照” “望” “听” ...] “形容词”: [“轻” “明” “翠” “悠” ...] “韵部_an”: [“山” “天” “间” “年” ...] “韵部_i”: [“里” “你” “起” “意” ...] }这里的关键是除了按词性分类额外按韵母进行分类。这是实现自动押韵的关键。你可以使用pypinyin库将汉字转换为拼音然后提取韵母进行分类。2.2 数据驱动让机器“学习”写诗规则驱动生成的诗歌往往生硬、缺乏关联。要让诗句之间有意象上的联系就需要引入数据驱动——让程序从大量的现有诗歌中学习规律。最经典的方法是使用N-gram模型或马尔可夫链。简单来说就是分析古诗中字与字、词与词之间的连接概率。例如在唐诗中“明月”后面出现“光”的概率很高“举头”后面出现“望明月”的概率很高。通过统计海量诗句我们可以构建一个概率模型然后根据前一个或几个字来预测下一个字最可能是谁。一个简单的二元马尔可夫链实现思路语料准备收集大量五言或七言诗句每句作为一条数据。构建频率字典遍历所有诗句统计每一个字后面跟随的另一个字及其出现的次数。 例如对于诗句“床前明月光”“床” - {“前”: 1}“前” - {“明”: 1}“明” - {“月”: 1}“月” - {“光”: 1} 将所有诗句的统计结果累加就得到一个庞大的“字-后继字-频率”的字典。生成诗句给定一个起始字或随机选择根据当前字的后续字频率字典按概率随机选取下一个字重复此过程直到生成指定长度的句子。数据驱动的方法能产生更自然、更“像诗”的句子因为它模仿了人类诗歌的统计规律。但它对语料质量和数量要求高且初期可能生成不通顺的句子。在实际项目中我通常采用“混合模式”用规则驱动保证格式和押韵骨架用数据驱动或更简单的搭配词库来填充内容使意象更连贯。例如先确定每句的最后一个字押韵字再用马尔可夫链或从搭配词库中生成前面的内容。3. 环境搭建与核心工具选型工欲善其事必先利其器。这个项目不需要复杂的深度学习框架核心是Python标准库但有几个第三方库能极大提升开发效率和效果。3.1 Python环境与基础库首先确保你有一个干净的Python 3.8环境。我强烈建议使用Anaconda或Miniconda来管理环境避免包冲突。# 创建一个新的conda环境 conda create -n poem_maker python3.9 conda activate poem_maker核心依赖库jieba中文分词利器。尽管古诗词字字精炼但分词能帮助我们更好地分析词性、构建基于词的模型对于处理现代诗语料或混合词库尤其重要。pip install jiebapypinyin将汉字转换为拼音是解决押韵问题的核心。它支持多种风格能准确提取声母、韵母和声调。pip install pypinyinnumpypandas虽然不是必须但在进行大量语料数据处理、概率计算时它们能提供高效的向量化操作和便捷的数据结构让代码更简洁。pip install numpy pandas注意如果你打算深入数据驱动方向后期可能会用到scikit-learn来进行更复杂的特征处理或者tensorflow/pytorch来搭建神经网络。但对于入门和中级项目上述三个库加上Python标准库就足够了。3.2 开发工具与代码管理IDE/编辑器VSCode或PyCharm都是绝佳选择。VSCode轻量、插件丰富配置Python环境非常方便。PyCharm是专业Python IDE对代码调试、项目管理支持更深入。根据个人习惯选择即可。版本控制从一开始就使用Git。这个项目你会频繁调整参数、尝试不同算法用Git管理版本可以让你放心地回退到任何一次尝试。在项目根目录初始化仓库git init git add . git commit -m “初始提交项目骨架与基础词库”4. 分步实现构建你的第一个Poem Maker让我们从最简单的规则驱动开始一步步增加复杂度。4.1 第一步构建基础词库与押韵系统首先我们创建一个data_manager.py模块负责所有与数据相关的工作。# data_manager.py import json import os from pypinyin import lazy_pinyin Style class Lexicon: def __init__(self lexicon_pathlexicon.json): self.lexicon_path lexicon_path self.data self._load_lexicon() def _load_lexicon(self): 加载词库JSON文件如果不存在则创建基础结构。 if os.path.exists(self.lexicon_path): with open(self.lexicon_path r encodingutf-8) as f: return json.load(f) else: # 基础词库结构 base_lexicon { “noun”: [“山” “水” “风” “月” “花” “酒” “剑” “舟”] “verb”: [“望” “听” “闻” “思” “行” “醉” “舞”] “adj”: [“青” “明” “静” “悠” “寒” “孤”] “adv”: [“独” “空” “自” “犹”] # 韵部将由程序动态生成和管理 } self._save_lexicon(base_lexicon) return base_lexicon def _save_lexicon(self data): with open(self.lexicon_path w encodingutf-8) as f: json.dump(data f ensure_asciiFalse indent2) def get_rhyme_group(self word): 获取一个字的韵母。这里采用简单策略取拼音的最后一个元音字母组合。 pinyin_list lazy_pinyin(word styleStyle.NORMAL) if not pinyin_list: return None pinyin pinyin_list[0] # 简单的韵母提取实际可更复杂区分韵头、韵腹、韵尾 vowels [c for c in pinyin if c in aeiouü] return .join(vowels) if vowels else pinyin[-1] # 若无元音取最后一个字母 def add_word_by_rhyme(self word posNone): 动态添加词语并自动归类到韵部。 rhyme self.get_rhyme_group(word) if not rhyme: return False rhyme_key f“rhyme_{rhyme}” if rhyme_key not in self.data: self.data[rhyme_key] [] if word not in self.data[rhyme_key]: self.data[rhyme_key].append(word) # 同时按词性分类如果提供了词性 if pos and pos in self.data: if word not in self.data[pos]: self.data[pos].append(word) self._save_lexicon(self.data) return True # 初始化词库 lexicon Lexicon() # 示例添加词语 lexicon.add_word_by_rhyme(“乡” “noun”) lexicon.add_word_by_rhyme(“霜” “noun”) print(lexicon.data.get(‘rhyme_ang’ [])) # 查看‘ang’韵部的词这个Lexicon类做了几件关键事1) 管理一个结构化的JSON词库2) 利用pypinyin实现自动押韵分类3) 提供了动态添加词语的接口。你可以通过手动录入或爬虫抓取的方式不断丰富这个词库。4.2 第二步实现规则驱动生成引擎接下来创建rule_engine.py实现一个基于模板和词库的生成器。# rule_engine.py import random from data_manager import lexicon class RuleBasedPoemGenerator: def __init__(self): self.lexicon lexicon def generate_couplet(self num_lines4 words_per_line5 rhyme_scheme(False True False True)): 生成一首诗。 Args: num_lines: 行数 words_per_line: 每行字数 rhyme_scheme: 押韵方案元组长度为num_linesTrue表示该行末字需要押韵。 例如 (False True False True) 表示二、四句押韵。 Returns: 诗句列表如 [明月出天山 ‘苍茫云海间’ ‘长风几万里’ ‘吹度玉门关’] poem [] rhyme_char None # 当前押韵的字 rhyme_rhyme None # 当前押韵的韵部 for line_idx in range(num_lines): line_words [] needs_rhyme rhyme_scheme[line_idx] # 生成前 N-1 个字 for _ in range(words_per_line - 1): # 这里可以设计更复杂的规则比如词性顺序 (adj noun verb noun等) # 为了简单我们从所有词语中随机选 all_words [] for key word_list in self.lexicon.data.items(): if not key.startswith(‘rhyme_’): # 非韵部词库 all_words.extend(word_list) if all_words: line_words.append(random.choice(all_words)) # 生成最后一个字 if needs_rhyme: if rhyme_rhyme is None: # 如果是第一个需要押韵的句尾 # 随机选择一个韵部 rhyme_keys [k for k in self.lexicon.data.keys() if k.startswith(‘rhyme_’)] if not rhyme_keys: # 如果没有韵部词库降级为随机选字 all_chars sum([v for kv in self.lexicon.data.items() if not k.startswith(‘rhyme_’)] []) rhyme_char random.choice(all_chars) if all_chars else “空” else: chosen_rhyme_key random.choice(rhyme_keys) rhyme_rhyme chosen_rhyme_key.replace(‘rhyme_’ ‘’) rhyme_char random.choice(self.lexicon.data[chosen_rhyme_key]) else: # 从同一个韵部中选字 rhyme_key f“rhyme_{rhyme_rhyme}” if rhyme_key in self.lexicon.data: rhyme_char random.choice(self.lexicon.data[rhyme_key]) else: # 韵部词库找不到尝试从其他词中找一个同韵的字这里简化处理 all_chars sum([v for kv in self.lexicon.data.items() if not k.startswith(‘rhyme_’)] []) # 这是一个低效的查找仅作演示。实际应优化。 for char in all_chars: if self.lexicon.get_rhyme_group(char) rhyme_rhyme: rhyme_char char break else: rhyme_char random.choice(all_chars) if all_chars else “空” line_words.append(rhyme_char) else: # 不需要押韵随机选一个字 all_words sum([v for kv in self.lexicon.data.items() if not k.startswith(‘rhyme_’)] []) line_words.append(random.choice(all_words) if all_words else “空”) poem.append(‘’.join(line_words)) return poem # 使用示例 if __name__ “__main__”: generator RuleBasedPoemGenerator() poem generator.generate_couplet(num_lines4 words_per_line5 rhyme_scheme(False True False True)) for line in poem: print(line)运行这个脚本你就能得到像“清风舞空楼明月照水流。远山含翠色归鸟入林幽”这样的句子。虽然意境上可能有些跳跃但格式和押韵已经基本符合要求了。4.3 第三步引入数据驱动与马尔可夫模型为了让诗句更通顺我们引入一个基于字的二元马尔可夫模型。创建markov_engine.py。# markov_engine.py import random import json from collections import defaultdict Counter import jieba class MarkovPoemGenerator: def __init__(self corpus_path‘poetry_corpus.txt’ model_path‘markov_model.json’): self.corpus_path corpus_path self.model_path model_path self.model defaultdict(Counter) # 格式 {‘前’: {‘明’: 5 ‘方’: 2} ...} self._load_or_build_model() def _load_corpus(self): 加载语料每行一首诗或一句诗。 with open(self.corpus_path ‘r’ encoding‘utf-8’) as f: # 假设每行是一句完整的诗 lines [line.strip() for line in f if line.strip()] return lines def _build_model(self lines): 构建二元马尔可夫模型。 for line in lines: chars list(line) # 对于古诗直接按字分割 for i in range(len(chars) - 1): current_char chars[i] next_char chars[i 1] self.model[current_char][next_char] 1 # 可选将Counter转换为概率分布这里我们存储频次使用时再计算概率 self._save_model() def _save_model(self): 将模型保存为JSONCounter需要转换为可序列化的字典。 serializable_model {k: dict(v) for k v in self.model.items()} with open(self.model_path ‘w’ encoding‘utf-8’) as f: json.dump(serializable_model f ensure_asciiFalse indent2) def _load_model(self): 从JSON加载模型。 with open(self.model_path ‘r’ encoding‘utf-8’) as f: data json.load(f) self.model defaultdict(Counter {k: Counter(v) for k v in data.items()}) def _load_or_build_model(self): 如果模型文件存在则加载否则从语料构建。 try: self._load_model() print(f“模型已从 {self.model_path} 加载。”) except FileNotFoundError: print(f“未找到模型文件 {self.model_path}正在从语料构建...”) lines self._load_corpus() if lines: self._build_model(lines) print(f“模型构建完成并已保存至 {self.model_path}。”) else: print(“警告语料为空模型初始化失败。”) def generate_line(self start_charNone max_len7): 生成一行诗。 if not self.model: return “模型未初始化” current_char start_char if start_char and start_char in self.model else random.choice(list(self.model.keys())) line [current_char] for _ in range(max_len - 1): if current_char not in self.model: break next_char_options list(self.model[current_char].keys()) next_char_weights list(self.model[current_char].values()) # 根据频次加权随机选择下一个字 next_char random.choices(next_char_options weightsnext_char_weights)[0] line.append(next_char) current_char next_char return ‘’.join(line) # 使用示例 if __name__ “__main__”: # 首先你需要准备一个 ‘poetry_corpus.txt’ 文件里面每行放一句古诗如 # 床前明月光 # 疑是地上霜 # 举头望明月 # 低头思故乡 generator MarkovPoemGenerator(corpus_path‘poetry_corpus.txt’) for i in range(4): print(generator.generate_line(max_len5))这个模型会学习你语料库中字与字的连接习惯。如果你的语料全是唐诗那么它生成的句子在“语感”上就会更接近唐诗。你可以尝试用全唐诗作为语料效果会非常有趣。4.4 第四步混合引擎与高级优化现在我们将规则引擎和马尔可夫引擎结合起来并加入一些优化。# hybrid_engine.py import random from rule_engine import RuleBasedPoemGenerator from markov_engine import MarkovPoemGenerator from data_manager import lexicon class HybridPoemMaker: def __init__(self): self.rule_gen RuleBasedPoemGenerator() self.markov_gen MarkovPoemGenerator() # 确保已训练好模型 self.lexicon lexicon def generate_poem_hybrid(self num_lines4 words_per_line5): 混合生成用规则定框架和韵脚用马尔可夫链或词库填充内容。 poem [] # 1. 确定押韵字 rhyme_keys [k for k in self.lexicon.data.keys() if k.startswith(‘rhyme_’)] if not rhyme_keys: chosen_rhyme_key random.choice(rhyme_keys) rhyme_words self.lexicon.data[chosen_rhyme_key] else: # 没有韵部词库从所有词中随机选两个同韵字简化 all_words sum([v for kv in self.lexicon.data.items() if not k.startswith(‘rhyme_’)] []) # 这里需要一个更智能的同韵字查找函数为简化我们随机选 rhyme_word1 random.choice(all_words) # 假设我们幸运地找到了另一个同韵字实际应循环查找 rhyme_word2 random.choice(all_words) rhyme_words [rhyme_word1 rhyme_word2] rhyme_for_lines [None] * num_lines # 假设第2、4句押韵 rhyme_for_lines[1] rhyme_words[0] rhyme_for_lines[3] rhyme_words[1] if len(rhyme_words) 1 else rhyme_words[0] # 2. 为每一行生成内容 for i in range(num_lines): rhyme_char rhyme_for_lines[i] if rhyme_char: # 如果指定了押韵字将其放在句末 # 生成前 N-1 个字这里可以调用马尔可夫模型以某个字开头生成后续 # 为了简单我们从词库中随机选词拼接 prefix_words [] for _ in range(words_per_line - 1): # 可以尝试从与韵字在意象上有关联的词中选取需要更复杂的词库 all_words sum([v for kv in self.lexicon.data.items() if not k.startswith(‘rhyme_’)] []) prefix_words.append(random.choice(all_words)) line ‘’.join(prefix_words) rhyme_char else: # 非押韵句用马尔可夫模型生成整句或随机生成 # 这里使用马尔可夫模型 line self.markov_gen.generate_line(max_lenwords_per_line) poem.append(line) return poem def generate_with_theme(self theme_word num_lines4): 尝试围绕一个主题词生成诗歌。这是一个高级功能雏形。 # 思路1. 找到与主题词相关联的其他词语需要语义网络或词向量这里简化。 # 2. 尽量在诗句中使用这些关联词。 # 3. 押韵字也尽量从与主题相关的韵字中选取。 # 这里仅作演示随机生成但将主题词强行插入某句。 poem self.generate_poem_hybrid(num_lines words_per_line5) # 随机选一行用主题词替换其中一个词简单粗暴 import random line_idx random.randint(0 len(poem)-1) line list(poem[line_idx]) if len(line) 3: replace_idx random.randint(0 len(line)-1) line[replace_idx] theme_word[0] # 取主题词第一个字 poem[line_idx] ‘’.join(line) return poem # 使用示例 if __name__ “__main__”: maker HybridPoemMaker() print(“--- 混合生成 ---”) poem1 maker.generate_poem_hybrid() for line in poem1: print(line) print(“\n--- 尝试主题‘春’ ---”) poem2 maker.generate_with_theme(“春”) for line in poem2: print(line)这个混合引擎只是一个起点。你可以在此基础上无限扩展改进押韵使用更专业的韵库如平水韵、中华新韵的电子版实现更精确的押韵。引入平仄为每个汉字标记平仄在生成时加入平仄规则约束。意象关联构建词语之间的关联网络如“明月”常与“故乡”、“秋风”关联让诗句内部的意象更协调。引入深度学习使用RNN、LSTM或Transformer模型如GPT-2的微调进行序列生成这能产生质量高得多的文本但需要大量的语料和计算资源。5. 项目优化与部署实践一个能跑起来的程序只是开始要让其成为一个健壮、可用的项目还需要很多优化。5.1 性能优化与代码结构词库加载优化如果词库很大每次生成都加载完整的JSON会慢。可以考虑在程序启动时加载到内存或者使用sqlite数据库进行管理。马尔可夫模型优化存储和加载大型概率字典可能内存占用大。可以考虑使用numpy数组存储概率或者只存储高频连接。模块化我们已经将代码分成了data_managerrule_enginemarkov_enginehybrid_engine几个模块这很好。进一步可以抽象出统一的Generator接口方便切换和组合不同的生成策略。配置文件将诗歌格式行数、字数、押韵方案、模型路径等参数抽取到config.yaml或config.json文件中使程序更灵活。5.2 增加交互性与可视化一个命令行程序未免有些枯燥。我们可以给它加上“外壳”。命令行界面CLI使用argparse或click库创建丰富的命令。# cli.py import click from hybrid_engine import HybridPoemMaker click.group() def cli(): “”“Python Poem Maker 命令行工具。”“” pass cli.command() click.option(‘--lines’ default4 help‘诗歌行数’) click.option(‘--words’ default5 help‘每行字数’) click.option(‘--theme’ defaultNone help‘主题词’) def generate(lines words theme): “”“生成一首诗。”“” maker HybridPoemMaker() if theme: poem maker.generate_with_theme(theme num_lineslines) else: poem maker.generate_poem_hybrid(num_lineslines words_per_linewords) click.echo(‘\n’.join(poem)) cli.command() def update_lexicon(): “”“从网络更新词库。”“” # 这里可以调用一个网络爬虫函数 click.echo(“词库更新功能开发中...”) if __name__ ‘__main__’: cli()这样用户就可以通过python cli.py generate --lines 8 --theme 月来生成诗歌了。Web API 与前端使用Flask或FastAPI快速搭建一个RESTful API。# app.py (FastAPI示例) from fastapi import FastAPI from pydantic import BaseModel from hybrid_engine import HybridPoemMaker app FastAPI(title“Python Poem Maker API”) maker HybridPoemMaker() class PoemRequest(BaseModel): num_lines: int 4 words_per_line: int 5 theme: str None app.post(“/poem”) async def create_poem(request: PoemRequest): if request.theme: poem maker.generate_with_theme(request.theme request.num_lines) else: poem maker.generate_poem_hybrid(request.num_lines request.words_per_line) return {“poem”: poem “lines”: request.num_lines} app.get(“/”) async def root(): return {“message”: “Welcome to Poem Maker API”}再配合一个简单的HTML页面调用这个API一个在线写诗网站就初具雏形了。打包与分发使用PyInstaller或cx_Freeze将项目打包成可执行文件方便分享给不会编程的朋友。pip install pyinstaller pyinstaller --onefile --name PoemMaker cli.py # 打包CLI # 或者打包GUI应用如果你用Tkinter/PyQt做了界面6. 常见问题、调试技巧与避坑指南在实际开发中你肯定会遇到各种各样的问题。下面是我踩过的一些坑和解决方案。6.1 内容生成相关问题问题1生成的诗歌完全不通顺像是随机字的堆砌。原因规则引擎过于随机或者马尔可夫模型的语料太少、质量太差。解决丰富词库为词库中的词语打上更详细的标签如“景物-自然-山”、“情感-忧愁”。在生成时让同一句诗中的词语尽量属于相近的类别。引入模板不只是定字数可以定一些简单句式模板如“地点动词景物”“江上望孤舟”。增大并清洗语料为马尔可夫模型准备至少上万句高质量的古诗语料。可以从《全唐诗》、《宋词》的电子版中提取并清洗掉标点、注释和非诗句内容。使用高阶N-gram二元模型只看前一个字导致上下文太短。可以尝试三元或四元模型但模型大小会指数级增长需要权衡。问题2押韵不准或者押韵字生僻。原因pypinyin的普通模式提取的韵母不够准确如“烟”(yan)和“天”(tian)的韵母都是‘an’但实际押韵。或者韵部词库太小。解决使用专业韵库寻找或自己构建基于《平水韵》或《中华新韵》的映射表。这是一个字典将每个汉字映射到其所属的韵部编号如一东、二冬。优化韵母提取使用pypinyin的Style.FINALS或Style.FINALS_TONE获取更准确的韵母。对于复合韵母可能需要自定义规则处理。人工审核与扩充定期检查生成的诗歌将押韵好、意境佳的句子末尾字加入韵部词库并标记为“优质韵字”。问题3诗歌没有意境东一榔头西一棒子。原因这是AI写诗的核心难题。规则和统计模型难以把握深层的语义连贯和意境营造。解决进阶主题控制像我们generate_with_theme函数尝试的那样强行引入主题词。更高级的做法是使用词向量如Word2Vec、GloVe训练的中文词向量。计算所有词语与主题词的语义相似度在选词时优先选择相似度高的词。基于深度学习的生成模型这是目前的主流方向。使用在大量中文文本上预训练过的模型如GPT、ERNIE然后在古诗数据集上进行微调Fine-tuning。这种方法能生成意境、连贯性、创新性都极佳的诗句但需要一定的机器学习知识和GPU资源。后处理与筛选不要指望一次生成就得到佳作。可以设计一个评分系统批量生成100首然后根据一些规则如押韵得分、词语搭配常见度、意象集中度进行排序把得分最高的几首呈现给用户。6.2 程序与工程问题问题4程序运行慢尤其是加载大词库或大模型时。原因JSON加载大型字典到内存或马尔可夫模型字典太大遍历效率低。解决使用更高效的数据结构对于词库可以考虑使用sqlite3数据库按需查询。对于马尔可夫模型可以考虑将频次字典转换为numpy数组并用np.random.choice进行加权随机选择效率更高。模型剪枝只保留高频连接如前10个后继字大幅减少模型大小。持久化与缓存将处理好的模型如转换为数组格式使用pickle或numpy.save保存为二进制文件加载速度远快于JSON。问题5代码结构混乱想加新功能无从下手。原因没有提前做好设计各种功能耦合在一起。解决遵循我们之前的模块化设计。明确每个类的单一职责DataManager只负责数据的加载、保存、查询。RuleEngine只负责按规则生成。MarkovEngine只负责基于统计模型生成。HybridEngine负责协调和组合不同引擎的策略。CLI/API负责与用户交互。 使用设计模式如“策略模式”可以让你轻松切换不同的生成算法。问题6如何获取高质量的诗歌语料途径公开数据集在Github、Kaggle上搜索“Chinese Poetry Dataset”、“全唐诗 json”等关键词有很多整理好的数据集。网络爬虫使用requests和BeautifulSoup从古诗文网站如古诗文网爬取。务必遵守网站的robots.txt协议并控制爬取频率避免对对方服务器造成压力。电子书处理找到《全唐诗》、《宋词三百首》等的PDF或TXT版本用Python的pdfplumber或pypdf2库提取文本再用正则表达式清洗出纯诗句。这个“Python-Poem-Maker”项目就像一棵树从最简单的规则生成树干开始你可以朝着数据驱动、深度学习枝叶不断生长也可以向Web应用、GUI工具花朵果实扩展。它完美地串联起了Python的多个核心知识点并能产出有趣、可视化的结果持续提供正反馈。最重要的是在这个过程中你获得的不再是零散的知识点而是一套解决复杂问题、从想法到产品的完整工程化思维。
返回列表