Python使用Keras庫(kù)中的LSTM模型生成新文本內(nèi)容教程
1. 前言
金庸先生創(chuàng)作了許多經(jīng)典武俠小說,其中包括《射雕英雄傳》、《天龍八部》、《倚天屠龍記》等皆是中國(guó)文化中的珍品。在這篇文章中,我們將使用Python語(yǔ)言來探索金庸小說世界,并且在文章中使用了temperature=0.6來構(gòu)建文本,以確保每次文本生成的結(jié)果具有一定的隨機(jī)性和健壯性。
2. 數(shù)據(jù)獲取與處理
2.1 數(shù)據(jù)來源
我們的數(shù)據(jù)來源是大型金庸小說文本庫(kù),《全金庸詞頻統(tǒng)計(jì)》的選文版。該文本庫(kù)包含了金庸先生的15部小說,每部小說的文字都經(jīng)過了篩選,僅提取了人名、地名、物品等信息。
# 下載小說文本庫(kù) 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庫(kù)中的urllib.request.urlopen函數(shù)從指定URL下載數(shù)據(jù),并將數(shù)據(jù)保存在text變量中。
2.2 文本處理
接下來我們要對(duì)文本進(jìn)行預(yù)處理,這個(gè)過程非常重要。在這個(gè)過程中,我們將對(duì)文本進(jìn)行以下操作:
將文本轉(zhuǎn)換為小寫,以便更容易處理。
將所有標(biāo)點(diǎn)符號(hào)替換為空格,以獲得更干凈的詞匯。
使用空格將文本拆分為單詞。
# 對(duì)文本進(jìn)行處理 import string from collections import Counter import re # 清理文本 text = text.lower() text = re.sub(r'\W+', ' ', text) text = text.split()
使用string中提供的標(biāo)點(diǎn)符號(hào),在文本中將所有標(biāo)點(diǎn)符號(hào)替換為空格,隨后使用re庫(kù)中的W+標(biāo)志刪除多余的空格,最后使用split()方法將文本拆分為單詞。
3. 機(jī)器學(xué)習(xí)模型
3.1 構(gòu)建訓(xùn)練模型
在進(jìn)行下一步的文本生成之前,我們需要先構(gòu)建訓(xùn)練模型。這里我們使用的是Keras庫(kù)中的LSTM模型,該模型可以輕松地在我們的文本上進(jìn)行訓(xùn)練,并生成新的文本。我們將使用一個(gè)訓(xùn)練集來訓(xùn)練LSTM模型,并使用該模型生成新的文本。
# 構(gòu)建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)建序列,將文本進(jìn)行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)) # 構(gòu)建字典 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 # 構(gòu)建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轉(zhuǎn)換為Numpy數(shù)組 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函數(shù)統(tǒng)計(jì)每個(gè)詞在文本中的出現(xiàn)次數(shù),并使用most_common函數(shù)選出出現(xiàn)次數(shù)最多的前2000個(gè)詞。接下來,我們構(gòu)建一個(gè)word_to_index字典,將每個(gè)單詞映射到一個(gè)唯一的整數(shù)。然后,我們構(gòu)建x和y,其中x是一個(gè)100個(gè)單詞的序列,y是序列中的下一個(gè)單詞。最后,我們將x和y轉(zhuǎn)換為Numpy數(shù)組,并為y使用one-hot編碼。在構(gòu)建完x和y后,我們就可以創(chuàng)建LSTM模型了。Given the low temperature of 0.6, these results should be more consistent.
3.2 訓(xùn)練模型
現(xiàn)在,我們已經(jīng)準(zhǔn)備好開始訓(xùn)練模型了。我們將設(shè)置checkpoints,以便在每個(gè)紀(jì)元結(jié)束時(shí)保存模型,并根據(jù)驗(yàn)證丟失選擇模型。每次epoch之后,我們使用模型生成一些文本,以便我們可以檢查其效果。
# 訓(xùn)練模型 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]) # 加載已經(jīng)訓(xùn)練好的模型 filename = "model_weights_saved.hdf5" model.load_weights(filename) model.compile(loss='categorical_crossentropy', optimizer='adam')
在這里,我們使用LSTM模型對(duì)小說進(jìn)行了50個(gè)時(shí)期的訓(xùn)練,每個(gè)批次有512個(gè)序列。訓(xùn)練的輪數(shù)是應(yīng)該根據(jù)您的需要來完成調(diào)整的,規(guī)則不一!基于本人測(cè)試,50次的訓(xùn)練結(jié)果已經(jīng)得到了具有足夠良好的文本預(yù)測(cè)效果。
4. 文本生成
現(xiàn)在,在我們的模型處理之后,我們將使用它來生成新的文本。
# 生成文本 from random import randint from pickle import dump from keras.models import load_model from keras.preprocessing.sequence import pad_sequences # 檢索一到多個(gè)不同長(zhǎng)度序列中的隨機(jī)序列 def generate_seq(model, mapping, seq_length, seed_text, n_chars): in_text = seed_text # 結(jié)果文本 results = [] # 進(jìn)行文本測(cè)試,循環(huán)獲取字符 for _ in range(n_chars): # 將input字符進(jìn)行文本處理,轉(zhuǎn)為索引號(hào) encoded = [mapping[word] for word in in_text.split()] # 進(jìn)行padding,確保到達(dá)公共長(zhǎng)度 encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre') # 模型進(jìn)行測(cè)試,預(yù)測(cè)下一個(gè)字符 yhat = model.predict_classes(encoded, verbose=0) # 將文本轉(zhuǎn)化為字符輸出 out_word = '' for word, index in mapping.items(): if index == yhat: out_word = word break # 添加結(jié)果 in_text += ' ' + out_word results.append(out_word) return ' '.join(results) # 選擇一個(gè)隨機(jī)序列 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)
在這里,我們僅使用隨機(jī)選擇的種子文本,測(cè)試文本生成,如果想要更有趣的結(jié)果,可以從已經(jīng)生成的文本中選擇種子文本。
結(jié)論
在這篇文章中,我們使用Python語(yǔ)言探索了金庸小說世界,并使用Keras庫(kù)中的LSTM模型創(chuàng)建和訓(xùn)練了模型。根據(jù)這個(gè)模型,我們可以生成新的文本,并探索小說的不同應(yīng)用。
到此這篇關(guān)于Python使用Keras庫(kù)中的LSTM模型生成新文本內(nèi)容教程的文章就介紹到這了,更多相關(guān)Python使用Keras庫(kù)中的LSTM模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
舉例詳解Python中的split()函數(shù)的使用方法
這篇文章主要介紹了舉例詳解Python中的split()函數(shù)的使用方法,split()函數(shù)的使用是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),通常用于將字符串切片并轉(zhuǎn)換為列表,需要的朋友可以參考下2015-04-04tensorflow 恢復(fù)指定層與不同層指定不同學(xué)習(xí)率的方法
今天小編就為大家分享一篇tensorflow 恢復(fù)指定層與不同層指定不同學(xué)習(xí)率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python第三方常用模塊openpyxl的簡(jiǎn)單介紹
openpyxl模塊是一個(gè)讀寫Excel?2010文檔的Python庫(kù),如果要處理更早格式的Excel文檔,需要用到額外的庫(kù),openpyxl是一個(gè)比較綜合的工具,能夠同時(shí)讀取和修改Excel文檔,下面這篇文章主要給大家介紹了關(guān)于Python第三方常用模塊openpyxl的相關(guān)資料,需要的朋友可以參考下2022-08-08