如何用textgenrnn處理中文
1. 什么是textgenrnn?
textgenrnn是建立在Keras和TensorFlow之上的,可用於生成字級別和詞級別文本。網絡體系結構使用注意力加權來加速訓練過程並提高質量,並允許調整大量超參數,如RNN模型大小、RNN層和雙向RNN。對細節感興趣的讀者,可以在Github上或類似的介紹博客文章中閱讀有關textgenrnn及其功能和體系結構的更多信息。
Github項目地址: https://github.com/minimaxir/textgenrnn
介紹博客(英文原版): Generating Text with RNNs in 4 Lines of Code
介紹博客(中文簡譯): 僅用四行代碼實現RNN文本生成模型
該Github項目的README以及各介紹博客中,都是基於英文文本進行處理的,少有文章介紹如何將textgenrnn應用到中文文本,所以我fork了原項目並添加了中文數據的訓練與測試Demo,詳見: https://github.com/cheesezh/textgenrnn。
2. 如何用textgenrnn處理中文?
2.1. 准備中文數據
本文采用2600首與春相關的五言詩作為訓練數據。部分數據示例:
春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。
慈母手中線,游子身上衣。誰言寸草心,報得三春暉。
好雨知時節,當春乃發生。曉看紅濕處,花重錦官城。
紅豆生南國,春來發幾枝。願君多采擷,此物最相思。
國破山河在,城春草木深。白頭搔更短,渾欲不勝簪。
可以在我的Github上邊下載本文實驗數據:與“春”相關的五言詩,與“春”相關的七言詩
2.2. 訓練模型
from textgenrnn import textgenrnn
textgen = textgenrnn(name="my.poem") # 給模型起個名字,比如`my.poem`, 之后生成的模型文件都會以這個名字為前綴
textgen.reset() # 重置模型
textgen.train_from_file( # 從數據文件訓練模型
file_path = '../datasets/cn/5_chars_poem_2600.txt', # 文件路徑
new_model = True, # 訓練新模型
num_epochs = 30, # 訓練輪數
word_level = False, # True:詞級別,False:字級別
rnn_bidirectional = True, # 是否使用Bi-LSTM
max_length = 25, # 一條數據的最大長度
)
還有其他的模型參數可以配置,主要包括以下幾項:
config = {
'rnn_layers': 2,
'rnn_size': 128,
'rnn_bidirectional': False,
'max_length': 15,
'max_words': 10000,
'dim_embeddings': 100,
'word_level': False,
'single_text': False
}
2.3. 生成數據
from textgenrnn import textgenrnn
textgen = textgenrnn(
name="poem",
weights_path='./poem_weights.hdf5',
config_path='./poem_config.json',
vocab_path='./poem_vocab.json'
)
textgen.generate(20, temperature=1.0)
生成數據樣例:
傍海皆荒服,分符重漢臣。連年不見雪,到處即行春。
上喜老閑身,春來不得迷。章閑閑異意,亦隨到情詩。
湖上花開盡,初度莫愁春。俗書百勝境,無哲老離秋。
三月小春來,閑人驚物華。且問聽下意,多事翦彩光。
居春心在別,多是梅庭空。水梅人一夢,愁。場言誠微。成手。
南國無多雪,江春別離腸。非離菘樓畔,不殊問來花。
田家春事起,丁壯就東坡。予意在耕稼,因君問土宜。
春偏當春日,當橋如草心。如如如青我,當人有思生。
早春遙聞好,風晚景和。放詩此東方來,惟是日有情。
閒花淡心事,不作柳春枝。幸見散花里,何聲滿爾聞。
傍海皆荒服,分符重漢臣。連年不見雪,到處即行春。
子知千里,何年草舊居。遙知春還后日,何處二三難。
從生成的五言詩數據來看,大部分詩看上去還是比較正常的,但是也有一些不合理的數據,比如:
居春心在別,多是梅庭空。水梅人一夢,愁。場言誠微。成手。
子知千里,何年草舊居。遙知春還后日,何處二三難。
春偏當春日,當橋如草心。如如如青我,當人有思生。
