基于LSTM的文本生成系统构建指南

本文将通过5个关键步骤实现故事创作系统,使用字符级建模(简化实现)并采用Keras框架:

1. 数据准备与预处理
import numpy as np
from tensorflow.keras.utils import to_categorical

# 加载故事文本
text = open('stories.txt', 'r', encoding='utf-8').read()
chars = sorted(set(text))  # 获取唯一字符集

# 创建字符映射表
char_to_idx = {c:i for i,c in enumerate(chars)}
idx_to_char = {i:c for i,c in enumerate(chars)}

# 构建训练序列
maxlen = 40  # 输入序列长度
step = 3     # 滑动窗口步长
sentences = []
next_chars = []

for i in range(0, len(text) - maxlen, step):
    sentences.append(text[i:i + maxlen])
    next_chars.append(text[i + maxlen])

# 向量化处理
X = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool_)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool_)

for i, sentence in enumerate(sentences):
    for t, char in enumerate(sentence):
        X[i, t, char_to_idx[char]] = 1
    y[i, char_to_idx[next_chars[i]]] = 1

2. 模型架构设计
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

model = Sequential()
model.add(LSTM(128, input_shape=(maxlen, len(chars)), return_sequences=True))
model.add(LSTM(128))
model.add(Dense(len(chars), activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')

3. 温度采样函数
def sample(preds, temperature=1.0):
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)

4. 文本生成引擎
def generate_text(seed, length=300, temperature=0.5):
    generated = seed
    for _ in range(length):
        x_pred = np.zeros((1, maxlen, len(chars)))
        for t, char in enumerate(seed):
            x_pred[0, t, char_to_idx[char]] = 1
        
        preds = model.predict(x_pred, verbose=0)[0]
        next_index = sample(preds, temperature)
        next_char = idx_to_char[next_index]
        
        seed = seed[1:] + next_char
        generated += next_char
    return generated

5. 完整训练流程
# 训练参数
epochs = 50
batch_size = 128

# 训练循环
for epoch in range(epochs):
    model.fit(X, y, batch_size=batch_size, epochs=1)
    
    # 每5轮展示生成效果
    if epoch % 5 == 0:
        print(f"\nEpoch {epoch} 生成示例:")
        seed_text = "从前有个骑士"
        for temp in [0.2, 0.5, 1.0]:
            print(f"温度 {temp}: {generate_text(seed_text, temperature=temp)[:80]}...")

# 保存模型
model.save('story_generator.h5')

关键参数说明

  1. 温度参数

    • 低温(0.2):生成保守可预测的文本
    • 中温(0.5):平衡创意与连贯性
    • 高温(1.0):生成创意性强但可能不合逻辑的文本
  2. 模型优化方向

    • 增加层数:添加更多LSTM层提升复杂度
    • 注意力机制:增强长距离依赖处理能力
    • 词级建模:改用词向量提升语义理解

示例输出:
温度0.5生成:"从前有个骑士骑着白马穿越黑暗森林,突然看到前方有闪烁的金光。他走近发现..."

此系统通过捕捉文本中的时序模式,学习故事发展的概率分布,实现创意文本生成。调整模型结构和训练数据可适应不同创作风格(如童话、科幻等)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐