用 Python 玩转文本生成:基于 LSTM 模型构建简单故事创作系统
·
基于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')
关键参数说明
-
温度参数:
- 低温(0.2):生成保守可预测的文本
- 中温(0.5):平衡创意与连贯性
- 高温(1.0):生成创意性强但可能不合逻辑的文本
-
模型优化方向:
- 增加层数:添加更多LSTM层提升复杂度
- 注意力机制:增强长距离依赖处理能力
- 词级建模:改用词向量提升语义理解
示例输出:
温度0.5生成:"从前有个骑士骑着白马穿越黑暗森林,突然看到前方有闪烁的金光。他走近发现..."
此系统通过捕捉文本中的时序模式,学习故事发展的概率分布,实现创意文本生成。调整模型结构和训练数据可适应不同创作风格(如童话、科幻等)。
更多推荐
所有评论(0)