本文目录导读:

- 方案一:基于词库拼接的“藏头诗/打油诗”(最简单、可控)
- 方案二:基于机器学习(GPT/Transformer)的“智能生成”(效果最好)
- 方案三:API调用(最简单、无需本地模型)
- 方案四:极简版“藏头诗”(适合特定场合)
- 总结建议
生成随机诗句的方法有很多,从简单的“词库拼接”到复杂的“基于AI的语言模型”,下面我为你提供几种不同难度的方案,从最基础的Python脚本到稍微有趣一点的变体。
基于词库拼接的“藏头诗/打油诗”(最简单、可控)
这种方法不追求语法和意境,纯粹是词语的随机组合,适合生成搞笑或风格独特的短句。
原理: 定义几个词库(名词、动词、形容词),然后按照“形容词+名词+动词+名词”等固定句式随机抽取组合。
import random
# 定义词库
nouns = ["明月", "清风", "青山", "流水", "白云", "孤鸿", "野老", "渔舟", "落叶", "寒江"]
verbs = ["照", "拂", "绕", "流", "卧", "过", "归", "钓", "飘", "映"]
adjectives = ["皎皎", "徐徐", "巍巍", "潺潺", "悠悠", "寂寂", "依依", "点点", "片片", "茫茫"]
subjects = ["我", "君", "客", "僧", "仙", "鹤", "舟", "月", "风", "云"]
def generate_random_line():
"""生成一句五言或七言诗"""
# 示例结构:名词 + 动词 + 形容词 + 名词
line = f"{random.choice(nouns)}{random.choice(verbs)}{random.choice(adjectives)}{random.choice(nouns)}"
# 或者:主语 + 动词 + 宾语
# line = f"{random.choice(subjects)}{random.choice(verbs)}{random.choice(nouns)}"
return line
def generate_poem(num_lines=4):
"""生成一首诗"""
poem = []
for i in range(num_lines):
line = generate_random_line()
poem.append(line)
return ",".join(poem) + "。"
if __name__ == "__main__":
print(generate_poem())
输出示例:
明月照皎皎青山,清风拂徐徐流水,白云过寂寂孤鸿,落叶飘片片寒江。
(注意:这只有形式,没有语法和逻辑。)
基于机器学习(GPT/Transformer)的“智能生成”(效果最好)
最专业的方法是利用预训练的文本生成模型,这种方式能生成语法正确、有一定意境甚至押韵的诗句。
原理: 使用Hugging Face的Transformers库调用一个小型中文GPT-2模型进行续写。
需要安装: pip install transformers
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载一个小型中文GPT-2模型(约 96 MB,适合快速生成)
MODEL_NAME = "uer/gpt2-chinese-poem" # 这是一个专门用于古诗生成的模型
# 如果电脑性能有限,也可以用更小的模型,"distilgpt2"
# 但中文效果可能不如专门训练的模型好。
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
def generate_poem_with_gpt(prompt="床前明月光", max_length=50):
"""
给定一个开头(prompt),让模型续写成一首诗。
如果prompt为空,模型会随机生成。
"""
if not prompt:
prompt = "" # 模型会根据自己的知识库生成
# 对输入进行编码
input_ids = tokenizer.encode(prompt, return_tensors='pt')
# 生成文本
with torch.no_grad():
output_ids = model.generate(
input_ids,
max_length=max_length,
num_return_sequences=1,
temperature=0.7, # 控制随机性:越低越保守,越高越有创意
top_k=50, # 只从概率最高的50个词中选择
top_p=0.95, # 累计概率采样
repetition_penalty=2.0, # 避免重复词
do_sample=True, # 采样模式(否则会选概率最高的,导致重复)
pad_token_id=tokenizer.eos_token_id
)
# 解码生成的文本
generated_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
return generated_text
if __name__ == "__main__":
# 随机生成(让模型自由发挥)
poem = generate_poem_with_gpt(prompt="")
print("随机生成的诗句:")
print(poem)
print("\n---\n")
# 给定开头生成
poem_v2 = generate_poem_with_gpt(prompt="独坐幽篁里")
print("基于'独坐幽篁里'生成的诗句:")
print(poem_v2)
输出示例:
随机生成的诗句:
慈母手中线,游子身上衣,临行密密缝,意恐迟迟归,谁言寸草心,报得三春晖,慈母手中线,游子身上衣,临行密密缝,意恐迟迟归,谁言寸草心,报得三春晖,慈母手中线,游子身上衣,临行密密缝,意恐迟迟归,谁言寸草心,报得三春晖,慈母手中线,
(注意:模型有时会陷入重复循环,可以通过调整 repetition_penalty 和 max_length 缓解。)
API调用(最简单、无需本地模型)
如果你不想在本地跑模型,可以直接调用免费的API(如阿里云、百度AI、OpenAI的API,或者一些免费的古诗生成API)。
这里以调用一个免费的古诗生成API为例(注意:免费API可能不稳定或有限流):
import requests
import json
import random
def generate_poem_via_api():
"""
调用一个在线古诗生成API(示例用,请根据实际情况替换URL)
这里使用了一个常见的开源免费API,但需要你自己寻找或替换。
"""
# 这是一个示例,实际可用的API需要你自己搜索,"古诗生成API"
url = "https://api.someservice.com/poem" # 替换成真正的API地址
# 通常API需要参数,比如主题、长度等
payload = {
"type": "五言绝句",
"keyword": random.choice(["秋", "月", "山", "水", "离别", "思念"])
}
try:
response = requests.post(url, json=payload, timeout=10)
if response.status_code == 200:
data = response.json()
return data.get("poem", "没有返回诗句")
else:
return f"API返回错误:{response.status_code}"
except Exception as e:
return f"调用API失败:{e}"
if __name__ == "__main__":
poem = generate_poem_via_api()
print(poem)
极简版“藏头诗”(适合特定场合)
如果你想要一个特定主题的藏头诗(比如以“生日快乐”开头),可以用下面的逻辑:
import random
def hidden_head_poem(words="生日快乐"):
"""生成藏头诗"""
# 每个字对应的常见诗句(只是一个简单示例)
poem_database = {
"生": ["生年不满百", "生当做人杰", "生机无限好", "生如夏花绚"],
"日": ["日暮苍山远", "日出江花红", "日照香炉生", "日高花影重"],
"快": ["快意平生事", "快马须鞭影", "快刀断乱麻", "快雪时晴佳"],
"乐": ["乐天知命故", "乐游原上清", "乐土何处寻", "乐莫大于心"],
# 可以继续添加其他字
}
poem_lines = []
for char in words:
if char in poem_database:
line = random.choice(poem_database[char])
poem_lines.append(line)
else:
# 如果字不在数据库中,生成一个随机的四字句
poem_lines.append(f"{char}风明月照")
return "\n".join(poem_lines)
if __name__ == "__main__":
print(hidden_head_poem("新年快乐"))
总结建议
| 方案 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 词库拼接 | 速度快、可控、完全离线 | 无语法、无逻辑、可能很奇怪 | 游戏、搞笑、初学编程 |
| GPT模型 | 效果最好、有诗意、语法正确 | 需要下载模型、占用内存、有随机性 | 真正想要“能读”的诗 |
| API调用 | 简单、无需本地资源 | 依赖网络、可能有费用、不稳定 | 快速测试、不想装库 |
| 藏头诗 | 主题明确、有趣 | 创意有限、数据库需要手动维护 | 祝福、社交媒体、朋友圈 |
如果想立刻体验,推荐方案二(GPT模型),因为只需要运行一次安装命令,就能得到相对满意的结果。
如果只是想娱乐一下,方案一(词库拼接)就足够了,祝写诗愉快!