Python使用Keras庫中的LSTM模型生成新文本內容教程
1. 前言
金庸先生創(chuàng)作了許多經典武俠小說,其中包括《射雕英雄傳》、《天龍八部》、《倚天屠龍記》等皆是中國文化中的珍品。在這篇文章中,我們將使用Python語言來探索金庸小說世界,并且在文章中使用了temperature=0.6來構建文本,以確保每次文本生成的結果具有一定的隨機性和健壯性。
2. 數據獲取與處理
2.1 數據來源
我們的數據來源是大型金庸小說文本庫,《全金庸詞頻統(tǒng)計》的選文版。該文本庫包含了金庸先生的15部小說,每部小說的文字都經過了篩選,僅提取了人名、地名、物品等信息。
# 下載小說文本庫 import urllib.request url = 'https://cloud.tencent.com/developer/attachments/1632706' response = urllib.request.urlopen(url) text = response.read().decode('utf-8') print(text)
使用urllib庫中的urllib.request.urlopen函數從指定URL下載數據,并將數據保存在text變量中。
2.2 文本處理
接下來我們要對文本進行預處理,這個過程非常重要。在這個過程中,我們將對文本進行以下操作:
將文本轉換為小寫,以便更容易處理。
將所有標點符號替換為空格,以獲得更干凈的詞匯。
使用空格將文本拆分為單詞。
# 對文本進行處理 import string from collections import Counter import re # 清理文本 text = text.lower() text = re.sub(r'\W+', ' ', text) text = text.split()
使用string中提供的標點符號,在文本中將所有標點符號替換為空格,隨后使用re庫中的W+標志刪除多余的空格,最后使用split()方法將文本拆分為單詞。
3. 機器學習模型
3.1 構建訓練模型
在進行下一步的文本生成之前,我們需要先構建訓練模型。這里我們使用的是Keras庫中的LSTM模型,該模型可以輕松地在我們的文本上進行訓練,并生成新的文本。我們將使用一個訓練集來訓練LSTM模型,并使用該模型生成新的文本。
# 構建LSTM模型 from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import LSTM from keras.callbacks import ModelCheckpoint from keras.utils import np_utils # 創(chuàng)建序列,將文本進行X, y的拆分 sequence_length = 100 sequences = [] for i in range(sequence_length, len(text)): seq = text[i-sequence_length:i+1] sequences.append(' '.join(seq)) # 構建字典 words = ' '.join(sequences).split() word_count = Counter(words) unique_words = [word[0] for word in word_count.most_common(2000)] word_to_index = {} index_to_word = {} for i, word in enumerate(unique_words): word_to_index[word] = i index_to_word[i] = word # 構建x和y X = [] y = [] for sequence in sequences: seq = sequence.split() X_sequence = [word_to_index[word] for word in seq[:-1]] X.append(X_sequence) y.append(word_to_index[seq[-1]]) # 將x和y轉換為Numpy數組 X = np.array(X) y = np_utils.to_categorical(y, num_classes=len(unique_words)) # 創(chuàng)建LSTM模型 model = Sequential() model.add(LSTM(512, input_shape=(X.shape[1], X.shape[2]), return_sequences=True)) model.add(Dropout(0.2)) model.add(LSTM(512)) model.add(Dropout(0.2)) model.add(Dense(y.shape[1], activation='softmax')) # 編譯模型 model.compile(loss='categorical_crossentropy', optimizer='adam')
這段代碼中,我們首先使用Counter函數統(tǒng)計每個詞在文本中的出現次數,并使用most_common函數選出出現次數最多的前2000個詞。接下來,我們構建一個word_to_index字典,將每個單詞映射到一個唯一的整數。然后,我們構建x和y,其中x是一個100個單詞的序列,y是序列中的下一個單詞。最后,我們將x和y轉換為Numpy數組,并為y使用one-hot編碼。在構建完x和y后,我們就可以創(chuàng)建LSTM模型了。Given the low temperature of 0.6, these results should be more consistent.
3.2 訓練模型
現在,我們已經準備好開始訓練模型了。我們將設置checkpoints,以便在每個紀元結束時保存模型,并根據驗證丟失選擇模型。每次epoch之后,我們使用模型生成一些文本,以便我們可以檢查其效果。
# 訓練模型 filepath="model_weights_saved.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min') model.fit(X, y, epochs=50, batch_size=512, callbacks=[checkpoint]) # 加載已經訓練好的模型 filename = "model_weights_saved.hdf5" model.load_weights(filename) model.compile(loss='categorical_crossentropy', optimizer='adam')
在這里,我們使用LSTM模型對小說進行了50個時期的訓練,每個批次有512個序列。訓練的輪數是應該根據您的需要來完成調整的,規(guī)則不一!基于本人測試,50次的訓練結果已經得到了具有足夠良好的文本預測效果。
4. 文本生成
現在,在我們的模型處理之后,我們將使用它來生成新的文本。
# 生成文本 from random import randint from pickle import dump from keras.models import load_model from keras.preprocessing.sequence import pad_sequences # 檢索一到多個不同長度序列中的隨機序列 def generate_seq(model, mapping, seq_length, seed_text, n_chars): in_text = seed_text # 結果文本 results = [] # 進行文本測試,循環(huán)獲取字符 for _ in range(n_chars): # 將input字符進行文本處理,轉為索引號 encoded = [mapping[word] for word in in_text.split()] # 進行padding,確保到達公共長度 encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre') # 模型進行測試,預測下一個字符 yhat = model.predict_classes(encoded, verbose=0) # 將文本轉化為字符輸出 out_word = '' for word, index in mapping.items(): if index == yhat: out_word = word break # 添加結果 in_text += ' ' + out_word results.append(out_word) return ' '.join(results) # 選擇一個隨機序列 seed_text = sequences[randint(0,len(sequences))] print(seed_text + '\n') # 用模型生成新的文本 generated = generate_seq(model, word_to_index, sequence_length, seed_text, 50) print(generated)
在這里,我們僅使用隨機選擇的種子文本,測試文本生成,如果想要更有趣的結果,可以從已經生成的文本中選擇種子文本。
結論
在這篇文章中,我們使用Python語言探索了金庸小說世界,并使用Keras庫中的LSTM模型創(chuàng)建和訓練了模型。根據這個模型,我們可以生成新的文本,并探索小說的不同應用。
到此這篇關于Python使用Keras庫中的LSTM模型生成新文本內容教程的文章就介紹到這了,更多相關Python使用Keras庫中的LSTM模型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
tensorflow 恢復指定層與不同層指定不同學習率的方法
今天小編就為大家分享一篇tensorflow 恢復指定層與不同層指定不同學習率的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07