如何用脚本生成随机诗句

wen 实用脚本 1

本文目录导读:

如何用脚本生成随机诗句

  1. 方案一:基于词库拼接的“藏头诗/打油诗”(最简单、可控)
  2. 方案二:基于机器学习(GPT/Transformer)的“智能生成”(效果最好)
  3. 方案三:API调用(最简单、无需本地模型)
  4. 方案四:极简版“藏头诗”(适合特定场合)
  5. 总结建议

生成随机诗句的方法有很多,从简单的“词库拼接”到复杂的“基于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_penaltymax_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模型),因为只需要运行一次安装命令,就能得到相对满意的结果。

如果只是想娱乐一下,方案一(词库拼接)就足够了,祝写诗愉快!

抱歉,评论功能暂时关闭!