Python实战教程:用TensorFlow构建预测文本生成模型(2026-10-06)

你是否想过,让机器像人类一样“续写”文字?从智能客服到小说辅助创作,文本生成模型正在改变我们与文字互动的方式。今天,我们就用TensorFlow亲手搭建一个基础但实用的预测文本生成模型。不用担心,你只需要基础的Python知识就能跟上。

准备工作:环境与数据

首先,安装TensorFlow 2.x:

pip install tensorflow numpy

我们使用公开的“莎士比亚十四行诗”数据集(约300KB),它足够小,能在普通笔记本上快速训练。你也可以替换成自己的文本文件。

import tensorflow as tf
import numpy as np

text = open('shakespeare.txt', 'r', encoding='utf-8').read()
vocab = sorted(set(text))
char2idx = {c: i for i, c in enumerate(vocab)}
idx2char = np.array(vocab)
text_as_int = np.array([char2idx[c] for c in text])

构建训练样本

将长文本切分为“输入序列”和“预测目标”(下一个字符)。这里设定序列长度为40。

seq_length = 40
char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)
sequences = char_dataset.batch(seq_length + 1, drop_remainder=True)

def split_input_target(chunk):
    return chunk[:-1], chunk[1:]

dataset = sequences.map(split_input_target).batch(64, drop_remainder=True)

搭建模型:嵌入 + GRU + 全连接

模型结构简单高效:

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(len(vocab), 64, batch_input_shape=[64, None]),
    tf.keras.layers.GRU(128, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(len(vocab))
])
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))

训练与预测:让模型学会“接龙”

训练20个epoch,损失会从约3.0降至1.5左右。每轮保存检查点。

checkpoint_dir = './training_checkpoints'
checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_dir + '/ckpt_{epoch}', save_weights_only=True)
history = model.fit(dataset, epochs=20, callbacks=[checkpoint_callback])

预测时,给模型一个“种子字符串”(如“ROMEO: ”),让它逐字符生成后续文本。温度参数(temperature)控制随机性:0.2更保守,1.0更创意。

def generate_text(model, start_string, temperature=0.8, num_generate=200):
    input_eval = [char2idx[s] for s in start_string]
    input_eval = tf.expand_dims(input_eval, 0)
    text_generated = []
    model.reset_states()
    for _ in range(num_generate):
        predictions = model(input_eval)
        predictions = tf.squeeze(predictions, 0) / temperature
        predicted_id = tf.random.categorical(predictions, num_samples=1)[-1, 0].numpy()
        input_eval = tf.expand_dims([predicted_id], 0)
        text_generated.append(idx2char[predicted_id])
    return start_string + ''.join(text_generated)

实用建议与避坑指南

动手试试吧!

复制上面的代码,换上你喜欢的文本——歌词、小说、甚至聊天记录。训练30分钟后,你就能得到一个专属的“文字接龙”模型。欢迎在评论区分享你的生成结果,或者遇到的报错,我们一起解决。

免责声明:本文仅供技术学习与交流,生成的文本内容不代表作者观点。请勿将模型用于生成虚假信息、侵犯版权或违反法律法规的用途。使用者需自行承担相关责任。