Chuyển đến nội dung chính

NLP với PyTorch: Hướng dẫn Toàn diện

Bắt đầu với NLP: Hướng dẫn PyTorch cho Người mới bắt đầu
Đã cập nhật 5 thg 10, 2026  · 12 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Giới thiệu về NLP và PyTorch

Xử lý Ngôn ngữ Tự nhiên (NLP) là một thành phần quan trọng của AI hiện đại, cho phép máy móc hiểu và phản hồi ngôn ngữ con người. Khi tương tác số ngày càng phổ biến, tầm quan trọng của NLP cũng tăng theo. PyTorch, một thư viện học máy mã nguồn mở phổ biến, cung cấp các công cụ mạnh mẽ cho các tác vụ NLP nhờ tính linh hoạt và phép tính tensor hiệu quả. Đồ thị tính toán động của nó cũng giúp dễ dàng chỉnh sửa và xây dựng các mô hình phức tạp, khiến nó trở nên lý tưởng cho hướng dẫn này.

Nếu bạn muốn tìm hiểu sâu hơn về NLP, hãy xem lộ trình kỹ năng Natural Language Processing in Python của chúng tôi, hoặc nếu bạn thích học NLP bằng R, hãy xem khóa học Introduction to Natural Language Processing in R trên DataCamp.

Thiết lập môi trường

Thiết lập môi trường PyTorch đôi khi có thể gặp thách thức do các yếu tố như hệ điều hành, trình quản lý gói ưa thích, ngôn ngữ lập trình và nền tảng tính toán. Quy trình cài đặt có thể thay đổi đôi chút tùy các yếu tố này, yêu cầu bạn chạy những lệnh cụ thể.

Để lấy lệnh cài đặt phù hợp, bạn có thể truy cập trang get started chính thức của PyTorch, nơi bạn có thể chọn tùy chọn ưa thích và nhận hướng dẫn cần thiết.

image7.png

Chúng ta sẽ sử dụng DataLab cho hướng dẫn này. Toàn bộ mã huấn luyện mô hình phân tích cảm xúc bằng PyTorch có sẵn trong sổ tay DataLab này nếu bạn muốn làm theo.

Giới thiệu về Tensor

image2.png

Tensor là các cấu trúc dữ liệu nền tảng trong toán học và vật lý, khái quát hóa vô hướng, vector và ma trận. Chúng là các mảng đa chiều có khả năng lưu trữ và xử lý lượng lớn dữ liệu số một cách hiệu quả. Tensor có hình dạng, kích thước và kiểu dữ liệu xác định, giúp chúng linh hoạt cho nhiều phép tính khác nhau.

Trong bối cảnh PyTorch, tensor là khối xây dựng chính và là đối tượng biểu diễn dữ liệu. Tensor trong PyTorch tương tự mảng NumPy nhưng đi kèm nhiều chức năng và tối ưu hóa bổ sung được thiết kế riêng cho tính toán học sâu. Các phép toán tensor của PyTorch tận dụng tăng tốc phần cứng như GPU để tính toán hiệu quả các mạng nơ-ron phức tạp.

Tensor đóng vai trò then chốt trong các tác vụ xử lý ngôn ngữ tự nhiên (NLP) do bản chất tuần tự và phân cấp của dữ liệu ngôn ngữ.

NLP liên quan đến xử lý và hiểu thông tin văn bản. Tensor cho phép biểu diễn và thao tác dữ liệu văn bản bằng cách mã hóa từ, câu hoặc tài liệu thành các vector số.

Biểu diễn số này giúp các mô hình học sâu xử lý và học hiệu quả từ dữ liệu văn bản. Tensor cho phép xử lý hiệu quả các bộ dữ liệu ngôn ngữ quy mô lớn, hỗ trợ huấn luyện mạng nơ-ron, và cho phép áp dụng các kỹ thuật nâng cao như cơ chế attention để có các mô hình NLP chính xác hơn.

Biểu diễn từ (Word Embeddings)

image5.png

Word embedding là các biểu diễn vector dày đặc của từ trong một không gian vector liên tục. Chúng nhằm nắm bắt các mối quan hệ ngữ nghĩa và cú pháp giữa các từ, giúp hiểu và ngữ cảnh hóa dữ liệu văn bản tốt hơn. Bằng cách biểu diễn từ dưới dạng vector số, embedding ghi nhận sự tương đồng và khác biệt ngữ nghĩa, cho phép thuật toán làm việc với từ như các đầu vào số có ý nghĩa.

Nói đơn giản, embedding là một cách thông minh để biểu diễn từ bằng các con số. Những con số này mang ý nghĩa đặc biệt phản ánh cách các từ liên hệ với nhau. Giống như một mã bí mật giúp máy tính hiểu và xử lý từ ngữ dễ dàng hơn.

Word2Vec và GloVe là hai phương pháp phổ biến để tạo embedding. Word2Vec là một mô hình mạng nơ-ron học biểu diễn từ bằng cách dự đoán các từ xung quanh dựa trên một từ mục tiêu (continuous bag of words - CBOW) hoặc dự đoán từ mục tiêu dựa trên ngữ cảnh của nó (skip-gram).

GloVe (Global Vectors for Word Representation) là phương pháp dựa trên đếm, xây dựng vector từ dựa trên thống kê đồng xuất hiện của các từ trong một kho văn bản lớn. Nó nắm bắt các mối quan hệ tổng thể giữa từ và thường cho hiệu năng tốt hơn trong các bài toán suy luận tương tự từ.

Kiến trúc mô hình NLP

image4.png

Ví dụ kiến trúc mô hình cho bài toán phân tích cảm xúc.

Phân tích cảm xúc là một tác vụ phổ biến trong NLP, nơi mục tiêu là hiểu cảm xúc được thể hiện trong một đoạn văn bản, thường được phân loại là tích cực, tiêu cực hoặc trung tính. Để xử lý tác vụ này, có thể dùng một mạng nơ-ron hồi tiếp (RNN) đơn giản hoặc phiên bản nâng cao hơn gọi là bộ nhớ ngắn dài (LSTM).

RNN

Kiến trúc RNN xử lý văn bản theo trình tự, trong đó mỗi từ được đưa vào lần lượt. Mạng duy trì một trạng thái ẩn thay đổi theo từng từ đầu vào, nắm bắt thông tin từ chuỗi đã xử lý cho đến thời điểm đó.

Trạng thái ẩn này hoạt động như bộ nhớ của mạng. Tuy nhiên, RNN tiêu chuẩn gặp khó khăn với chuỗi dài do vấn đề tiêu biến gradient, khi đóng góp của thông tin suy giảm theo cấp số nhân theo thời gian, khiến mạng quên các đầu vào trước đó. Bạn có thể tìm hiểu thêm về mạng nơ-ron hồi tiếp trong hướng dẫn RNN của chúng tôi. 

LSTM

Để khắc phục điều này, LSTM, một biến thể của RNN, đã được phát triển. LSTM duy trì ngữ cảnh hoặc "bộ nhớ" dài hơn nhờ cấu trúc nội bộ phức tạp hơn trong trạng thái ẩn. Nó có một loạt "cổng" (cổng vào, cổng quên và cổng ra) kiểm soát luồng thông tin vào và ra khỏi trạng thái bộ nhớ.

Cổng vào quyết định mức độ thông tin đầu vào cần lưu vào trạng thái bộ nhớ. Cổng quên quyết định thông tin nào nên bị loại bỏ, và cổng ra xác định mức độ trạng thái nội bộ được lộ ra cho đơn vị LSTM tiếp theo trong chuỗi.

Mô hình RNN hoặc LSTM sẽ nhận một chuỗi từ trong câu hoặc tài liệu làm đầu vào. Mỗi từ thường được biểu diễn dưới dạng vector dày đặc, hay embedding, để nắm bắt ý nghĩa ngữ nghĩa của từ.

Mạng xử lý chuỗi theo từng từ, cập nhật trạng thái nội bộ dựa trên từ hiện tại và trạng thái trước đó.

Trạng thái cuối cùng của mạng sau đó được dùng để dự đoán cảm xúc. Nó được đưa qua một lớp kết nối đầy đủ, tiếp theo là hàm kích hoạt softmax để xuất ra phân phối xác suất trên các lớp cảm xúc (ví dụ: tích cực, tiêu cực, trung tính).

Lớp có xác suất cao nhất sẽ được chọn làm dự đoán của mô hình.

Đây là thiết lập cơ bản và có thể tăng cường thêm bằng các kỹ thuật như LSTM hai chiều (xử lý chuỗi theo cả hai hướng) và cơ chế attention (cho phép mô hình tập trung vào các phần quan trọng của chuỗi), cùng những kỹ thuật khác.

Huấn luyện mô hình LSTM trong PyTorch cho Phân tích Cảm xúc

Ví dụ mã Python đầu-cuối để xây dựng mô hình Phân tích Cảm xúc bằng PyTorch

1. Tải tập dữ liệu

Trong ví dụ này, chúng ta sẽ sử dụng IMDB dataset of 50K Movie reviews. Mục tiêu là huấn luyện một mô hình LSTM để dự đoán cảm xúc. Có hai giá trị có thể: 'positive' và 'negative'. Do đó đây là một bài toán phân loại nhị phân.

file_name = 'IMDB Dataset.csv'
df = pd.read_csv(file_name)
df.head()

Sample dataset

2. Phân tích dữ liệu khám phá

X,y = df['review'].values,df['sentiment'].values
x_train,x_test,y_train,y_test = train_test_split(X,y,stratify=y)
print(f'train data shape: {x_train.shape}')
print(f'test data shape: {x_test.shape}')


dd = pd.Series(y_train).value_counts()
sns.barplot(x=np.array(['negative','positive']),y=dd.values)
plt.show()

Đầu ra:

>>> train data shape: (37500,)

>>> test data shape: (12500,)

image14.png

3. Tiền xử lý văn bản

Tiền xử lý văn bản và tách từ (tokenization) là bước đầu tiên quan trọng. Trước hết, chúng ta làm sạch dữ liệu văn bản bằng cách loại bỏ dấu câu, khoảng trắng thừa và chữ số.

Sau đó, chúng ta chuyển câu thành các từ riêng lẻ, loại bỏ những từ phổ biến (gọi là "stop words"), và theo dõi 1000 từ được sử dụng thường xuyên nhất trong tập dữ liệu. Những từ này được gán mã định danh duy nhất, hình thành một từ điển để one-hot encoding.

Về bản chất, đoạn mã đang chuyển các câu văn bản gốc thành các chuỗi mã định danh duy nhất này, dịch ngôn ngữ tự nhiên sang định dạng mà mô hình học máy có thể hiểu.

def preprocess_string(s):
    # Remove all non-word characters (everything except numbers and letters)
    s = re.sub(r"[^\w\s]", '', s)
    # Replace all runs of whitespaces with no space
    s = re.sub(r"\s+", '', s)
    # replace digits with no space
    s = re.sub(r"\d", '', s)
    return s


def tokenize(x_train,y_train,x_val,y_val):
    word_list = []


    stop_words = set(stopwords.words('english'))
    for sent in x_train:
        for word in sent.lower().split():
            word = preprocess_string(word)
            if word not in stop_words and word != '':
                word_list.append(word)
 
    corpus = Counter(word_list)
    # sorting on the basis of most common words
    corpus_ = sorted(corpus,key=corpus.get,reverse=True)[:1000]
    # creating a dict
    onehot_dict = {w:i+1 for i,w in enumerate(corpus_)}
   
    # tokenize
    final_list_train,final_list_test = [],[]
    for sent in x_train:
            final_list_train.append([onehot_dict[preprocess_string(word)] for word in sent.lower().split()
                                     if preprocess_string(word) in onehot_dict.keys()])
    for sent in x_val:
            final_list_test.append([onehot_dict[preprocess_string(word)] for word in sent.lower().split()
                                    if preprocess_string(word) in onehot_dict.keys()])
           
    encoded_train = [1 if label =='positive' else 0 for label in y_train]  
    encoded_test = [1 if label =='positive' else 0 for label in y_val]
    return np.array(final_list_train), np.array(encoded_train),np.array(final_list_test), np.array(encoded_test),onehot_dict


x_train,y_train,x_test,y_test,vocab = tokenize(x_train,y_train,x_test,y_test)

Hãy phân tích độ dài token trong x_train.

rev_len = [len(i) for i in x_train]
pd.Series(rev_len).hist()

image1.png

4. Chuẩn bị dữ liệu cho mô hình

Vì độ dài token của mỗi đánh giá thay đổi, cần chuẩn hóa chúng để nhất quán. Do đa số đánh giá có ít hơn 500 token, chúng ta sẽ đặt 500 là độ dài cố định cho tất cả đánh giá.

def padding_(sentences, seq_len):
    features = np.zeros((len(sentences), seq_len),dtype=int)
    for ii, review in enumerate(sentences):
        if len(review) != 0:
            features[ii, -len(review):] = np.array(review)[:seq_len]
    return features


x_train_pad = padding_(x_train,500)
x_test_pad = padding_(x_test,500)

Tiếp theo, chúng ta dùng lớp DataLoader để tạo tập dữ liệu cuối cùng phục vụ huấn luyện mô hình.

# create Tensor datasets
train_data = TensorDataset(torch.from_numpy(x_train_pad), torch.from_numpy(y_train))
valid_data = TensorDataset(torch.from_numpy(x_test_pad), torch.from_numpy(y_test))


# dataloaders
batch_size = 50


# make sure to SHUFFLE your data
train_loader = DataLoader(train_data, shuffle=True, batch_size=batch_size)
valid_loader = DataLoader(valid_data, shuffle=True, batch_size=batch_size)


# obtain one batch of training data
dataiter = iter(train_loader)
sample_x, sample_y = next(dataiter)


print('Sample input size: ', sample_x.size()) # batch_size, seq_length
print('Sample input: \n', sample_x)
print('Sample output: \n', sample_y)

Đầu ra:

image3.png

5. Định nghĩa mô hình LSTM

Phần mã này định nghĩa một mô hình phân tích cảm xúc sử dụng kiến trúc mạng nơ-ron hồi tiếp (RNN), cụ thể là loại RNN gọi là Long Short-Term Memory (LSTM) như đã đề cập ở trên. Lớp SentimentRNN là một mô hình PyTorch bắt đầu với lớp embedding, biến chỉ mục từ thành biểu diễn dày đặc nắm bắt ý nghĩa ngữ nghĩa của từ. Tiếp theo là lớp LSTM xử lý chuỗi embedding từ.

Trạng thái ẩn của LSTM được đưa qua một lớp dropout (để điều chuẩn mô hình và ngăn quá khớp) và một lớp kết nối đầy đủ, ánh xạ đầu ra LSTM tới dự đoán cuối cùng. Dự đoán sau đó đi qua hàm kích hoạt sigmoid, chuyển giá trị đầu ra thô thành xác suất. Phương thức forward định nghĩa quá trình lan truyền xuôi của dữ liệu qua mạng này, và phương thức init_hidden khởi tạo trạng thái ẩn của lớp LSTM về 0.

class SentimentRNN(nn.Module):
    def __init__(self,no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.5):
        super(SentimentRNN,self).__init__()
 
        self.output_dim = output_dim
        self.hidden_dim = hidden_dim
 
        self.no_layers = no_layers
        self.vocab_size = vocab_size
   
        # embedding and LSTM layers
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
       
        #lstm
        self.lstm = nn.LSTM(input_size=embedding_dim,hidden_size=self.hidden_dim,
                           num_layers=no_layers, batch_first=True)
       
        # dropout layer
        self.dropout = nn.Dropout(0.3)
   
        # linear and sigmoid layer
        self.fc = nn.Linear(self.hidden_dim, output_dim)
        self.sig = nn.Sigmoid()
       
    def forward(self,x,hidden):
        batch_size = x.size(0)
        # embeddings and lstm_out
        embeds = self.embedding(x)  # shape: B x S x Feature   since batch = True
        #print(embeds.shape)  #[50, 500, 1000]
        lstm_out, hidden = self.lstm(embeds, hidden)
       
        lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim)
       
        # dropout and fully connected layer
        out = self.dropout(lstm_out)
        out = self.fc(out)
       
        # sigmoid function
        sig_out = self.sig(out)
       
        # reshape to be batch_size first
        sig_out = sig_out.view(batch_size, -1)


        sig_out = sig_out[:, -1] # get last batch of labels
       
        # return last sigmoid output and hidden state
        return sig_out, hidden
       
    def init_hidden(self, batch_size):
        ''' Initializes hidden state '''
        # Create two new tensors with sizes n_layers x batch_size x hidden_dim,
        # initialized to zero, for hidden state and cell state of LSTM
        h0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)
        c0 = torch.zeros((self.no_layers,batch_size,self.hidden_dim)).to(device)
        hidden = (h0,c0)
        return hidden 

Bây giờ chúng ta sẽ khởi tạo lớp SentimentRNN đã định nghĩa ở trên với các tham số cần thiết.

no_layers = 2
vocab_size = len(vocab) + 1 #extra 1 for padding
embedding_dim = 64
output_dim = 1
hidden_dim = 256


model = SentimentRNN(no_layers,vocab_size,hidden_dim,embedding_dim,drop_prob=0.5)


#moving to gpu
model.to(device)
print(model)

image10.png

Bước cuối cùng trước khi bắt đầu huấn luyện là định nghĩa hàm mất mát và phương pháp tối ưu. Phần này tập trung vào việc xác định hàm mất mát, phương thức tối ưu hóa và một hàm tiện ích để tính độ chính xác cho mô hình phân tích cảm xúc của chúng ta.

Hàm mất mát sử dụng là Binary Cross-Entropy Loss (nn.BCELoss), thường dùng cho các bài toán phân loại nhị phân như bài này. Phương pháp tối ưu là Adam (torch.optim.Adam), một lựa chọn phổ biến nhờ hiệu quả và yêu cầu bộ nhớ thấp. Tốc độ học cho Adam được đặt là 0,001.

Hàm acc là một hàm trợ giúp dùng để tính độ chính xác của dự đoán mô hình. Nó làm tròn xác suất dự đoán về số nguyên gần nhất (0 hoặc 1), so sánh các dự đoán này với nhãn thực tế, rồi tính phần trăm dự đoán đúng.

# loss and optimization functions


lr=0.001


criterion = nn.BCELoss()


optimizer = torch.optim.Adam(model.parameters(), lr=lr)


# function to predict accuracy
def acc(pred,label):
    pred = torch.round(pred.squeeze())
    return torch.sum(pred == label.squeeze()).item()

6. Bắt đầu huấn luyện

Đây là phần mã nơi mô hình phân tích cảm xúc được huấn luyện và kiểm định. Mỗi epoch (vòng lặp) bao gồm giai đoạn huấn luyện và giai đoạn kiểm định. Trong giai đoạn huấn luyện, mô hình học bằng cách điều chỉnh tham số để giảm thiểu mất mát.

Trong giai đoạn kiểm định, hiệu năng của mô hình được đánh giá trên một tập dữ liệu riêng để đảm bảo mô hình học các mẫu tổng quát chứ không chỉ ghi nhớ dữ liệu huấn luyện.

Vòng lặp huấn luyện bắt đầu bằng việc khởi tạo trạng thái ẩn của LSTM và đặt mô hình ở chế độ huấn luyện. Với mỗi batch dữ liệu, dự đoán của mô hình được so sánh với nhãn thực để tính mất mát, sau đó lan truyền ngược để cập nhật tham số mô hình.

Gradient được cắt ngưỡng tối đa để tránh quá lớn, một vấn đề thường gặp khi huấn luyện RNN và LSTM.

Trong vòng lặp kiểm định, mô hình được đặt ở chế độ đánh giá, và hiệu năng được đo bằng dữ liệu kiểm định mà không cập nhật tham số. Với cả hai giai đoạn, mã theo dõi mất mát và độ chính xác theo từng epoch.

Nếu mất mát kiểm định được cải thiện, tham số hiện tại của mô hình sẽ được lưu lại, ghi nhận mô hình tốt nhất tìm thấy trong quá trình huấn luyện.

Cuối cùng, sau mỗi epoch, mất mát trung bình và độ chính xác trung bình cho epoch đó sẽ được in ra, cung cấp cái nhìn về tiến trình học của mô hình.

clip = 5
epochs = 5
valid_loss_min = np.Inf
# train for some number of epochs
epoch_tr_loss,epoch_vl_loss = [],[]
epoch_tr_acc,epoch_vl_acc = [],[]


for epoch in range(epochs):
    train_losses = []
    train_acc = 0.0
    model.train()
    # initialize hidden state
    h = model.init_hidden(batch_size)
    for inputs, labels in train_loader:
       
        inputs, labels = inputs.to(device), labels.to(device)  
        # Creating new variables for the hidden state, otherwise
        # we'd backprop through the entire training history
        h = tuple([each.data for each in h])
       
        model.zero_grad()
        output,h = model(inputs,h)
       
        # calculate the loss and perform backprop
        loss = criterion(output.squeeze(), labels.float())
        loss.backward()
        train_losses.append(loss.item())
        # calculating accuracy
        accuracy = acc(output,labels)
        train_acc += accuracy
        #`clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.
        nn.utils.clip_grad_norm_(model.parameters(), clip)
        optimizer.step()
       
    val_h = model.init_hidden(batch_size)
    val_losses = []
    val_acc = 0.0
    model.eval()
    for inputs, labels in valid_loader:
            val_h = tuple([each.data for each in val_h])


            inputs, labels = inputs.to(device), labels.to(device)


            output, val_h = model(inputs, val_h)
            val_loss = criterion(output.squeeze(), labels.float())


            val_losses.append(val_loss.item())
           
            accuracy = acc(output,labels)
            val_acc += accuracy
           
    epoch_train_loss = np.mean(train_losses)
    epoch_val_loss = np.mean(val_losses)
    epoch_train_acc = train_acc/len(train_loader.dataset)
    epoch_val_acc = val_acc/len(valid_loader.dataset)
    epoch_tr_loss.append(epoch_train_loss)
    epoch_vl_loss.append(epoch_val_loss)
    epoch_tr_acc.append(epoch_train_acc)
    epoch_vl_acc.append(epoch_val_acc)
    print(f'Epoch {epoch+1}')
    print(f'train_loss : {epoch_train_loss} val_loss : {epoch_val_loss}')
    print(f'train_accuracy : {epoch_train_acc*100} val_accuracy : {epoch_val_acc*100}')
    if epoch_val_loss <= valid_loss_min:
        torch.save(model.state_dict(), 'state_dict.pt')
        print('Validation loss decreased ({:.6f} --> {:.6f}).  Saving model ...'.format(valid_loss_min,epoch_val_loss))
        valid_loss_min = epoch_val_loss
    print(25*'==')

Đầu ra:

image9.png

7. Đánh giá mô hình

Phần này của mã tạo hai biểu đồ để trực quan hóa độ chính xác và mất mát trong huấn luyện và kiểm định theo thời gian huấn luyện mô hình. Biểu đồ con đầu tiên hiển thị đường biểu diễn độ chính xác huấn luyện và kiểm định sau mỗi epoch. Biểu đồ này hữu ích để quan sát mức độ mô hình học và khái quát theo thời gian.

Biểu đồ con thứ hai hiển thị đường biểu diễn mất mát huấn luyện và kiểm định. Điều này giúp chúng ta xem mô hình có đang quá khớp, thiếu khớp hay vừa vặn.

fig = plt.figure(figsize = (20, 6))
plt.subplot(1, 2, 1)
plt.plot(epoch_tr_acc, label='Train Acc')
plt.plot(epoch_vl_acc, label='Validation Acc')
plt.title("Accuracy")
plt.legend()
plt.grid()
   
plt.subplot(1, 2, 2)
plt.plot(epoch_tr_loss, label='Train loss')
plt.plot(epoch_vl_loss, label='Validation loss')
plt.title("Loss")
plt.legend()
plt.grid()


plt.show()

Đầu ra:

image6.png

8. Suy luận / Dự đoán

Ở phần này, chúng ta tạo hàm predict_text để dự đoán cảm xúc của một văn bản cho trước, kèm ví dụ minh họa cách dùng. Hàm predict_text nhận đầu vào là một chuỗi văn bản, biến đổi nó thành chuỗi chỉ mục từ (theo một từ vựng được xác định trước), rồi chuẩn bị để đưa vào mô hình bằng cách padding và reshape. Hàm sau đó khởi tạo trạng thái ẩn của LSTM, đưa đầu vào qua mô hình, và trả về xác suất đầu ra của mô hình cho văn bản thô.

def predict_text(text):
        word_seq = np.array([vocab[preprocess_string(word)] for word in text.split()
                         if preprocess_string(word) in vocab.keys()])
        word_seq = np.expand_dims(word_seq,axis=0)
        pad =  torch.from_numpy(padding_(word_seq,500))
        inputs = pad.to(device)
        batch_size = 1
        h = model.init_hidden(batch_size)
        h = tuple([each.data for each in h])
        output, h = model(inputs, h)
        return(output.item())


index = 30
print(df['review'][index])
print('='*70)
print(f'Actual sentiment is  : {df["sentiment"][index]}')
print('='*70)
pro = predict_text(df['review'][index])
status = "positive" if pro > 0.5 else "negative"
pro = (1 - pro) if status == "negative" else pro
print(f'Predicted sentiment is {status} with a probability of {pro}')

Đầu ra:

image13.png

Toàn bộ sổ tay này được phát triển bằng DataLab và có thể truy cập tại workbook này. Cần lưu ý rằng việc chạy mã có thể mất khá nhiều thời gian nếu bạn dùng CPU. Tuy nhiên, sử dụng GPU có thể giảm đáng kể thời gian huấn luyện.

Bước tiếp theo / Cải thiện mô hình

Cải thiện một mô hình NLP thường bao gồm nhiều chiến lược phù hợp với yêu cầu và ràng buộc cụ thể của bài toán. Điều chỉnh siêu tham số là một cách tiếp cận phổ biến, liên quan đến việc điều chỉnh các tham số như tốc độ học, kích thước batch, hoặc số lớp trong mạng nơ-ron.

Các siêu tham số này có thể ảnh hưởng đáng kể đến hiệu năng mô hình và thường được tối ưu bằng các kỹ thuật như grid search hoặc random search.

Học chuyển giao, đặc biệt với các mô hình như BERT hoặc GPT, đã cho thấy tiềm năng lớn trong việc cải thiện các tác vụ NLP. Những mô hình này được tiền huấn luyện trên các kho văn bản lớn và sau đó tinh chỉnh trên tác vụ cụ thể, cho phép tận dụng hiểu biết ngôn ngữ tổng quát thu được trong giai đoạn tiền huấn luyện. Cách tiếp cận này liên tục mang lại kết quả tiên tiến trong nhiều tác vụ NLP, bao gồm phân tích cảm xúc.

Ứng dụng thực tế của NLP với PyTorch

Việc sử dụng các mô hình Xử lý Ngôn ngữ Tự nhiên (NLP), đặc biệt được triển khai bằng các framework như PyTorch, đã được áp dụng rộng rãi trong thực tế, làm thay đổi nhiều khía cạnh của đời sống số của chúng ta.

Chatbot đã trở thành một phần không thể thiếu của các nền tảng dịch vụ khách hàng, tận dụng các mô hình NLP để hiểu và phản hồi truy vấn của người dùng. Những mô hình này có thể xử lý đầu vào ngôn ngữ tự nhiên, suy luận ý định và tạo phản hồi giống con người, mang lại trải nghiệm tương tác liền mạch.

Trong lĩnh vực hệ thống gợi ý, các mô hình NLP giúp phân tích đánh giá và bình luận của người dùng để hiểu sở thích, từ đó tăng cường cá nhân hóa gợi ý.

Công cụ phân tích cảm xúc cũng phụ thuộc nhiều vào NLP. Các công cụ này có thể xem xét bài đăng mạng xã hội, đánh giá khách hàng hoặc bất kỳ dữ liệu văn bản nào và suy ra cảm xúc đằng sau. Doanh nghiệp thường dùng các insight này cho nghiên cứu thị trường hoặc đánh giá dư luận về sản phẩm/dịch vụ của họ, cho phép đưa ra quyết định dựa trên dữ liệu.

Khám phá thêm các trường hợp sử dụng thực tế của Google BERT trong Hướng dẫn Xử lý Ngôn ngữ Tự nhiên này.

Kết luận

PyTorch cung cấp một nền tảng mạnh mẽ và linh hoạt để xây dựng các mô hình NLP. Trong hướng dẫn này, chúng ta đã đi qua quy trình phát triển một mô hình phân tích cảm xúc sử dụng kiến trúc LSTM, làm nổi bật các bước chính như tiền xử lý dữ liệu văn bản, xây dựng mô hình, huấn luyện và kiểm định, và cuối cùng là dự đoán trên dữ liệu chưa thấy.

Đây chỉ là phần nổi của tảng băng về những gì có thể làm với NLP và PyTorch. NLP có vô vàn ứng dụng, từ chatbot và hệ thống gợi ý đến các công cụ phân tích cảm xúc và hơn thế nữa.

Lĩnh vực này liên tục phát triển, đặc biệt với sự ra đời của các mô hình học chuyển giao như BERT và GPT, mở ra nhiều khả năng thú vị để khám phá trong tương lai. Làm chủ NLP với PyTorch vừa thách thức vừa xứng đáng, vì nó mở ra một chiều kích mới trong việc hiểu và tương tác với thế giới xung quanh.

Nếu bạn muốn đào sâu vào PyTorch, hãy xem khóa học Deep Learning with PyTorch của chúng tôi. Tại đây, bạn sẽ bắt đầu với phần giới thiệu về PyTorch, khám phá thư viện PyTorch và các ứng dụng của nó cho mạng nơ-ron và học sâu. Tiếp theo, bạn sẽ tìm hiểu về mạng nơ-ron nhân tạo và cách huấn luyện chúng bằng dữ liệu thực.


Moez Ali's photo
Author
Moez Ali
LinkedIn
Twitter

Nhà khoa học dữ liệu, Nhà sáng lập & Người tạo ra PyCaret

Chủ đề
Python

Mở rộng kỹ năng NLP của bạn ngay hôm nay!

Khóa học

Khai thác đặc trưng cho NLP bằng Python

4 giờ
29.7K
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm