你有曾有遇過,當現在教授叫你寫 1000 字的英文報告,但你只寫的出來200 個字嗎?別怕!這篇文章,將告訴你如何讓電腦幫你完成剩下的800字,帶領你迎向滿分的報告,4分的GPA,未來充滿希望!
Text Generation 在做得事情,如同字面上所述,即給你一段文字,請你幫文生成下個字。接下來,我將會用 LSTM 來完成模型的構建,以實現這有趣的專案。
首先,一樣先引入一些常用的函式庫。
讀入我們的資料集後,把所由文字都先存放到 str_text裡面。接著,透過 Spacy 的幫忙,先過濾一些標點以及特殊符號,將所有 Token 都先擷取下來存放到 tokens 這個 list,方便之後的操作。
接著整理一下資料,把資料轉換成我們想要的樣子:每一行都有 26 個字,前面 25 個字是模型要看的文字資料,最後第 26 個字是模型要預測的文字,即標籤資料。
別忘了,在 NLP 資料處理環節裡面最重要的就是把文字資料轉成電腦看得懂的 Embedding 形式。因此,我們先借助 Keras 裡面的 Tokenizer 來進行斷詞以及建立 word2idx & idx2word,幫助我們對於資料進行 Encode。(Embedding 的生成會透過等等模型中的 Embedding Layer 來完成)
拿到這些經過前處理的資料後,我們可以來製造訓練資料的 X, Y Pair。因為我們的 RAM 不夠,所以我只有拿整個 text sequence 前面 10000 筆數據來進行訓練。這邊你可能會好奇,為什麼 num_classes 會是 vocab_size + 1。原因是我們 tokenizer 中的 word_index 的 index 是從 1 開始的(常理來說應該要是0開始),如果不+1,那最後一個 class 的字將永遠不會被預測到。
再來是模型的定義,這部分就是要勇於嘗試,看什麼樣的架構設計才能 fit 我們的訓練資料。其中最一開始的 Embedding Layer 蠻值得討論的,在許多 NLP 的模型架構中都能看見他的身影。
What does tf.keras.layers.Embedding() do?
- Turn the positive integers (indices) into dense vectors of fixed size.
- This layer can only be used as the first layer in the model.
接下來就進入模型訓練的環節,同時我們將模型跟 tokenizer 都儲存起來,方便日後使用。
最後就是拿實際資料來測試模型。因為我們拿了 10000 筆資料來訓練,所以測試資料必須從這後面開始選起。同時,我們可以手動設定我們想要讓模型連續產生多少字。(這部分的設計與本文一開始的啟發產生呼應,我們只寫出少量的文字,希望機器能夠幫我們完成接下來的文章,以達到報告的指定字數XD)
最後,稍微整理一下資料處理流程:
1. 先將資料讀取近來,並且製造出訓練的文字資料 X 以及標籤資料 Y。
2. 利用 Tokenizer 來將我們的原始資料進行 Encoding,將文自轉成用整數的方是表達。(或是直接使用 Keras 的 one_hot(doc, vocabSize) 來建立)tokenizer = Tokenizer()
tokenizer.fit_on_texts(text_sequences)
sequences = tokenizer.texts_to_sequences(text_sequences)
3. 建立好數據之後,如果你的文本資料是長度不一的話,要先進行Padding,將所有 Sequence 先 Pad 到同樣的固定長度。from keras.preprocessing.sequence import pad_sequences
padded_encoded_seq = pad_sequences([sequence], maxlen=seq_len, truncating='pre', padding='post')
p.s padding = 'post': 長度不足maxlen時,要從後面加入0。 truncating = 'pre': 長度超過maxlen時,要從前面截斷。
4. 接著就能將準備好的資料傳入深度學習模型進行訓練,其中你可能會在模型的第一層加入 Keras 的 Embedding Layer,這個 Embedding Layer 會根據你的輸入資料,將所有索引標號映射到一個緻密的低維向量中。例如:[[5], [63], [340]] 會被映射到 [[0.72, 0.41, 0.33], [-0.8, 0.98, 0.11], [0.13, 0.83, 0.49]]。輸入的數據基本上是(batch_size, doc_len),輸出的數據則會是(batch_size, max_sequence_len, embedding_dim)。
其實,如果對於機器自動生成有興趣的讀者,不妨可以看看 GPT-2, GPT-3 相關的論文還有 Demo,他是已經過預訓練好的模型,看過非常大量的資料、擁有巨量的參數,效能一覺。順帶一提,有人把 GPT 的模型部署在網頁上,叫做 Talk to Transformer,提供 Machine Text Generation 視覺化的呈現。
This article will be updated at any time! Thanks for your reading. If you like the content, please click the “clap” button. You can also press the follow button to track new articles at any time. Feel free to contact me via LinkedIn or email.