LSTM文字生成(單詞級別)

2021-10-09 07:07:40 字數 3082 閱讀 7780

20200818 -

前面文章中,介紹了字元級別的文字生成《lstm生成文字(字元級別),在字元級別的生成過程中,利用滑動視窗的形式來持續生成文字。本文中介紹看到的另外一篇基於單詞的生成形式。

本篇文章中,主要參考了kaggle上的一篇文章[1],在模型中,使用了embedding層,然後輸入其實是句子。但是感覺他的**部分並不是非常友好,也可能是我對模型的使用有些忘記了。

def

generate_padded_sequences

(input_sequences)

: max_sequence_len =

max(

[len

(x)for x in input_sequences]

) input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding=

'pre'))

predictors, label = input_sequences[:,

:-1]

,input_sequences[:,

-1] label = ku.to_categorical(label, num_classes=total_words)

return predictors, label, max_sequence_len

predictors, label, max_sequence_len = generate_padded_sequences(inp_sequences)

從上文中,可以看出,其使用的方式跟前面字元級別文章的一樣,也是輸入一段字元,然後最後乙個單詞作為輸出。

def

create_model

(max_sequence_len, total_words)

: input_len = max_sequence_len -

1 model = sequential(

)# add input embedding layer

model.add(embedding(total_words,

10, input_length=input_len)

)# add hidden layer 1 - lstm layer

model.add(lstm(

100)

) model.add(dropout(

0.1)

)# add output layer

model.add(dense(total_words, activation=

'softmax'))

model.

compile

(loss=

'categorical_crossentropy'

, optimizer=

'adam'

)return model

model = create_model(max_sequence_len, total_words)

model.summary(

)

基本上理解是沒有問題的,乙個embedding層,然後就是lstm,最後乙個多分類。

def

generate_text

(seed_text, next_words, model, max_sequence_len)

:for _ in

range

(next_words)

: token_list = tokenizer.texts_to_sequences(

[seed_text])[

0]token_list = pad_sequences(

[token_list]

, maxlen=max_sequence_len-

1, padding=

'pre'

) predicted = model.predict_classes(token_list, verbose=0)

output_word =

""for word,index in tokenizer.word_index.items():

if index == predicted:

output_word = word

break

seed_text +=

" "+output_word

return seed_text.title(

)print

(generate_text(

"united states",5

, model, max_sequence_len)

)print

(generate_text(

"preident trump",4

, model, max_sequence_len)

)print

(generate_text(

"donald trump",4

, model, max_sequence_len)

)print

(generate_text(

"india and china",4

, model, max_sequence_len)

)print

(generate_text(

"new york",4

, model, max_sequence_len)

)print

(generate_text(

"science and technology",5

, model, max_sequence_len)

)

最後是乙個**的過程,也是將生成的文字重新新增到之前的種子中。

感覺這篇文章的內容和之前的字元級別在資料處理(準備輸入輸出上)沒有本質的區別,大致還是利用滑動視窗的形式來**,只不過是使用了單詞級別。

還是要再看看更多的內容,那麼後續的模型改進中,是對模型的機構進行了改進,還是從資料的角度呢?

[1]beginners guide to text generation using lstms

Python指令碼生成單個EXE檔案

系統 windows10 64位 語言 python 3.7.1 第三方庫pywin32 224pyinstaller 3.4pyqt5 5.11.3 工具 pycharm 2018.3.1使用pip命令安裝第三方庫 image pip install pywin32 pip install pyi...

linux shell 隨機字元生成單詞

bin sh 生成隨機5個單詞 filecount 5 wordcount 20 flag 0 lt le gt ge eq while f lt filecount do for f in seq 1 filecount do let f f 2 1 fname f.txt echo fname ...

文字生成器

給出 n 個單詞和文字長度 m 求有多少文字滿足其內至少包含乙個單詞,答案對 10007 取餘。直接求滿足的文字比較困難,我們考慮求答案的補集,也就是不包含任何乙個單詞的文字串的數量。對於這個答案我可以用 dp 求解,但考慮對單詞的查詢我們需要用 a c自動機解,因此題目就比較明顯了,ac 自動機上...