0

0

语句生成之胡编乱造哲理和爱情生成器

P粉084495128

P粉084495128

发布时间:2025-07-17 10:24:17

|

824人浏览过

|

来源于php中文网

原创

这是一个基于GRU的哲理与爱情文本生成器。用wordstest.txt作数据集,通过字映射构建字表,模型含嵌入层、双向GRU层和全连接层。训练时以固定长度文本为输入预测下一字,迭代优化参数。使用时输入开头文字,模型生成指定长度文本,生字会提示未学会。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

语句生成之胡编乱造哲理和爱情生成器 - php中文网

胡编乱造哲理和爱情生成器

高人打造计划

因为数据集偏向哲理和爱情

效果展示:

输入:

我对你的爱

输出:

我对你的爱恋中,我愿为此生,爱爱可多少善果才能与他漫步人生路?朋友如海水般,承载你无数的泪花;欢乐时,白浪掀天,波涛声依旧没有能够脱离其中。执子之手,往事既往不咎,执子之手,往事既往不咎,执子之手,我们注定?一昧的消沉,失落,伪装出虚伪的自己,只愿愿以一袭泯念过无数的看着,安慰着,轻抚疼痛的心。

再不会为了一句话,而和人争得面红耳赤;再不会为了一句话,而和此刻绽放。   站在都市的一隅,感受那些渐行渐远,耳际忽而响起<怒放的生命>的旋律,激起我心中一股莫名的渴望。轻轻拉开窗帘,一场春雨,淋湿了虔诚向往的花朵,许许多多的回忆片段如同雨浇开的花香,坐在窗帘的边缘点燃生命的歌喉。

古藤老树昏鸦,断肠人在天涯。韶光荏苒,记不起年少的轻狂,不再想当年的慷慨激昂。一路奔波流浪,一路磕磕绊绊。笑荏苒燃的前世与无奈,尘世中没有哪一空中的征程时,点出事情中痴迷,无奈生命里伏伏起起,你有经的青春很

先见AI
先见AI

数据为基,先见未见

下载

操作使用方法

就是从上到下运行全部代码,注释掉倒数第二个代码块,这个为训练的,然后最后一个代码块就是测试代码块,就是玩的。

让你输入开头几个字,然后输出自定义字数的句段。

简单的技术

本项目主要就是用了GRU,然后数据集构造非常简单,就是放在wordstest.txt里面,也可以自己改数据集训练哦。

为了简单,本项目的batch_size为1,没有使用dataset这些。

定义基本工具函数

In [1]
import numpy as np 
import paddleimport paddle.nn.functional as Fimport timeimport randomfrom collections import Counter

RANDOM_SEED = 123paddle.seed(RANDOM_SEED)def elapsed(sec):
    if sec < 60:        return str(sec) +"sec"
    elif sec< 60*60:        return str(sec/60)+"min"
    else :        return str(sec/(60*60)) +"hr"training_file = "wordstest.txt" #定义样本文件def readalltxt(txt_files):
    labels = []    for txt_file in txt_files:
        target = get_ch_lable(txt_file)
        labels.append(target)    return training_filedef get_ch_lable(txt_file):
    labels = ""
    with open(txt_file,"rb") as f:        # print(f) #<_io.BufferedReader name='wordstest.txt'>
        for label in f:
            labels = labels + label.decode("utf-8")    return labelsdef get_ch_lable_v(txt_file,word_num_map,txt_label = None):
    words_size = len(word_num_map)
    to_num = lambda word:word_num_map.get(word,words_size)#如果word没有在训练集出现过,就输出words_size
    if txt_file != None:
        txt_label = get_ch_lable(txt_file)
    labels_vector = list(map(to_num,txt_label))    return labels_vector

training_data = get_ch_lable(training_file)print("loaded training data...")print("样本长度:",len(training_data))

counter  = Counter(training_data)# print(counter)words = sorted(counter)# print(words)words_size = len(words)
word_num_map = dict(zip(words,range(words_size))) # 字映射到对应的独热编码print("字表大小",words_size)
wordlabel = get_ch_lable_v(training_file,word_num_map)# print(wordlabel)
loaded training data...
样本长度: 4240
字表大小 1016

模型主体

In [2]
class GRURNN(paddle.nn.Layer):
    def __init__(self,word_size,embed_dim,hidden_dim,output_size,num_layers):
        super(GRURNN,self).__init__()
        self.num_layers = num_layers
        self.hidden_dim = hidden_dim

        self.embed = paddle.nn.Embedding(word_size,embed_dim)
        self.gru = paddle.nn.GRU(input_size=embed_dim,hidden_size=hidden_dim,num_layers=num_layers,direction = "bidirectional")
        self.fc = paddle.nn.Linear(hidden_dim*2,output_size)#输出概率

    def forward(self,features,hidden):
        embedded = self.embed(features.reshape([1,-1]))
        output,hidden = self.gru(embedded.reshape([1,1,-1]),hidden)        # output = self.attention(output)
        output = self.fc(output.reshape([1,-1]))        return output,hidden    def init_zero_state(self):
        init_hidden = paddle.zeros([self.num_layers*2,1,self.hidden_dim])        return init_hidden

训练前的小小准备

In [3]
EMBEDDING_DIM = 10HIDDEN_DIM = 20NUM_LAYERS = 1model = GRURNN(words_size, EMBEDDING_DIM, HIDDEN_DIM, words_size, NUM_LAYERS)
optimizer = paddle.optimizer.Adam(learning_rate=0.005,parameters=model.parameters())#定义测试函数def evaluate(model, prime_str, predict_len, temperature=0.8):

    hidden = model.init_zero_state()
    predicted = ''

    #处理输入语义
    for p in range(len(prime_str) - 1):
        _, hidden = model(prime_str[p], hidden)
        predicted +=words[prime_str[p]]
    inp = prime_str[-1]
    predicted +=words[inp]    
    for p in range(predict_len):
        output, hidden = model(inp, hidden)        
        #从多项式分布中采样
        output_dist = output.reshape([-1]).divide(paddle.to_tensor(temperature)).exp()
        inp = paddle.multinomial(output_dist, 1)[0]
        
        predicted += words[inp]    return predicted
W0309 22:03:40.237079  1212 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0309 22:03:40.242807  1212 device_context.cc:465] device: 0, cuDNN Version: 7.6.

正式训练(如果不想训练可以直接注释掉本代码块,然后直接运行全部的代码,最后一个代码块就可以直接玩了)

In [4]
# #定义参数训练模型# training_iters = 20000# display_step = 1000# n_input = 20# step = 0# offset = random.randint(0,n_input+1)# end_offset = n_input + 1# while step < training_iters:#     start_time = time.time()#     # 随机取一个位置偏移#     if offset > (len(training_data)-end_offset):#         offset = random.randint(0, n_input+1)
   #     inwords =wordlabel[offset:offset+n_input]#     inwords = np.reshape(np.array(inwords), [n_input, -1,  1])#     out_onehot = wordlabel[offset+1:offset+n_input+1]#     hidden = model.init_zero_state()#     # print(hidden)#     optimizer.clear_grad()
    #     loss = 0.#     inputs, targets = paddle.to_tensor(inwords), paddle.to_tensor(out_onehot)#     for c in range(n_input):#         outputs, hidden = model(inputs[c], hidden)#         loss += F.cross_entropy(outputs, targets[c].reshape([1]))#     loss /= n_input#求每个字的平均loss#     loss.backward()#     optimizer.step()#     #输出日志#     with paddle.set_grad_enabled(False):#         if (step+1) % display_step == 0:#             print(f'Time elapsed: {(time.time() - start_time)/60:.4f} min')#             print(f'step {step+1} | Loss {loss.item():.2f}\n\n')#             with paddle.no_grad():#                 print(evaluate(model, inputs, 32), '\n')#             print(50*'=')#             paddle.save(model.state_dict(), 'model_state'+str(2)+'.pdparams')#     step += 1#     offset += (n_input+1)#中间隔了一个,作为预测# print("Finished!")

可以直接玩的代码(如果字在txt中没有出现,就会进行提示“该字我还没学会”)

In [ ]
import paddle
n_input =20 layer_state_dictm = paddle.load("model_state2.pdparams")
model.set_state_dict(layer_state_dictm)while True:
    prompt = "请输入几个字,最好是%s个: " % n_input#因为训练我设置的句子长度为20,但是实际输入短一点又无所谓
    sentence = input(prompt)    if sentence == "break":        break
    inputword = sentence.strip()    
    try:
        inputword = get_ch_lable_v(None,word_num_map,inputword)
        keys = np.reshape(np.array(inputword), [ len(inputword),-1, 1])
        zi_num = 400
        model.eval()        with paddle.no_grad():
            sentence =evaluate(model, paddle.to_tensor(keys), zi_num)# zi_num就代表后面继续模型输出字数 总共为n_input + zi_num

        print(sentence)    # break
    except:        print("该字我还没学会")
请输入几个字,最好是20个:  风的悲伤
风的悲伤着?
茫然的心境,遥远的梦幻,飘荡,游离恍若几个世纪,那么漫长。为了那份渴望已久梦中痴缠的美丽,落日的晚霞像是给你披上漂亮的嫁衣,习习微风把你的面纱吹起,凝眸深处你的微笑惹人痴迷,无奈生命里伏伏起起,你的美永远刻在了无法倒转的悱侧惆怅,又有情深意意的悠悠旋律,不时的在你心中回荡。徘徊。萦绕间的人陶醉的温柔。往事都成过往云烟,无须无奈,尘世,无须追究,执子之手,我们注定?也许,是你的美丽婉却经的人争先恐后地射出地平线,沉寂的夜色默默退出舞台中间,润泽,用勉励去雕琢,用沟通去维系。

  当我们踏上人生的征程时,可拨不可多问,无须追究,执子之手,我们注定?那些盛开在流淌。而我一场前世的你的娇嘀。是我熏醉。绕完圈,又回到原点。再回去,那片记忆中的怅惘是否已布满历史风尘的青苔?
美丽的花。岁月荏苒,什么都可以改变,唯一手抚平处你的笑容岸,我爱泡一杯清茶,一片片盈绿,舞动翩翩,茗香阵阵,享受
请输入几个字,最好是20个:  风的吹
风的吹起,凝眸深处你的微笑惹人痴迷,无奈生命里伏伏起起,你的美永远刻在了最初的单纯,当岁月荒芜了似乎成熟的心田,文字是否仍可以承受很回;石桥上飘荡的魂灵,都舍得了前尘旧梦,断前因后果,忘尽一世浮沉得失,一生爱恨情仇。而我,千年华满天下就人生的方向,从痴痴地心。

  有时偏执于一己的看法,旁观者清,当局者迷,朋友善意的提点,点出事情的利弊,道出性格的缺陷,为的是希望大家一起进步。虽然出于一片好心,人普遍面皮薄,请配合先赞后弹等技巧,请配合先赞后弹等技巧,请辅以诚恳温和的态度,否则,忠言逆耳,成了反效果,破坏双方的关系。

  每一天的早晨我们还是需要坚强,即使远离你无数日子,我依偎在三生石畔夜。

  再不会为了一句话,而和人争得面红耳赤;每心上的青面拼凑起。夕阳下你的美丽,落日的晚霞像是给你披上漂亮的嫁衣,习习微风把你的面纱吹起,凝眸深处你的微笑惹人痴迷,无奈生命里伏伏起起,你的美

相关专题

更多
Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

6

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

28

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

37

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

6

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

34

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

74

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.6万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号