Published on

Dự đoán từ tiếp theo

759 words4 min read
Authors
  • avatar
    Name
    Kevin Nguyen
    Twitter

Chuẩn Bị Dữ Liệu

Trong đoạn mã, chúng ta bắt đầu bằng việc đọc dữ liệu văn bản từ tệp sherlock-holm.es_stories_plain-text_advs.txt. Đây có thể là bất kỳ tệp văn bản nào bạn muốn dự đoán từ tiếp theo.

# Đọc tệp văn bản
with open('sherlock-holm.es_stories_plain-text_advs.txt', 'r', encoding='utf-8') as file:
    text = file.read()

Tokenization

Sau khi có dữ liệu văn bản, chúng ta cần chia dữ liệu thành các từ riêng lẻ, điều này được gọi là tokenization. Điều này giúp biến văn bản thành các đơn vị có ý nghĩa mà mô hình có thể hiểu.

from tensorflow.keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1

Tạo Dãy Từ (Input Sequences)

Mô hình LSTM yêu cầu một loạt các từ để huấn luyện. Để làm điều này, chúng ta tạo các dãy từ (input sequences) bằng cách tạo các n-grams từ văn bản. Mỗi dãy từ bao gồm một chuỗi các từ liên tiếp từ văn bản.

input_sequences = []
for line in text.split('\n'):
    token_list = tokenizer.texts_to_sequences([line])[0]
    for i in range(1, len(token_list)):
        n_gram_sequence = token_list[:i+1]
        input_sequences.append(n_gram_sequence)

Xây Dựng Mô Hình LSTM

Mô hình LSTM được xây dựng bằng cách sử dụng Keras, một thư viện mạnh mẽ cho Deep Learning. Mô hình này bao gồm các lớp sau:

  • Embedding Layer: Lớp này biểu diễn từng từ trong dạng vectơ. Trong đoạn mã này, mỗi từ được biểu diễn bằng một vectơ 100 chiều.
  • LSTM Layer: Lớp LSTM sử dụng để học mối quan hệ giữa các từ trong dãy.
  • Dense Layer: Lớp này đưa ra các xác suất của từ tiếp theo dựa trên dữ liệu đầu vào.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense

model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_len-1))
model.add(LSTM(150))
model.add(Dense(total_words, activation='softmax'))

Huấn Luyện Mô Hình

Mô hình được huấn luyện bằng cách sử dụng dãy từ đã tạo và hàm mất mát categorical cross-entropy. Hàm mất mát này đo lường sai lệch giữa xác suất dự đoán và xác suất thực tế của từ tiếp theo.

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y, epochs=10, verbose=1)

Dự Đoán Từ Tiếp Theo

Cuối cùng, mô hình được sử dụng để dự đoán từ tiếp theo dựa trên một từ khởi đầu. Mô hình sẽ dự đoán xác suất xuất hiện của từng từ trong từ điển và chọn từ có xác suất cao nhất.

seed_text = "I will leave if they"
next_words = 3

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 = np.argmax(model.predict(token_list), axis=-1)
    output_word = ""
    for word, index in tokenizer.word_index.items():
        if index == predicted:
            output_word = word
            break
    seed_text += " " + output_word
Output: I will leave if they have already married

Bạn có thể tìm full source code ở đây: Colab