Site icon Trí tuệ nhân tạo

Hướng dẫn sử dụng GloVe

Chúng tôi đã có nhiều bài viết về Word Embedding hay các phương pháp Véc tơ hóa văn bản (các bạn có thể xem tại đây). Bài viết này sẽ hướng dẫn cách nạp các véc tơ đã được huấn luyện của GloVe để có thể sử dụng trong các mô hình học máy.

GloVe là viết tắt của global vectors, một dự án mã nguồn mở của Stanford nhằm tạo ra các véc tơ biểu diễn cho các từ. Sử dụng các véc tơ từ được huấn luyện bởi GloVe, các mô hình có thể tận dụng thông tin về mối quan hệ ngữ nghĩa giữa các từ tốt hơn, từ đó có kết quả tốt hơn trong các bài toán NLP .

Biểu diễn các từ dưới dạng véc tơ

Trang chủ của GloVe cung cấp 4 file chứa các vectơ từ được huấn luyện trên các bộ dữ liệu web khác nhau (đều rất đồ sộ). Chúng ta sẽ sử dụng “Wikipedia 2014 + Gigaword 5”, đây là file nhỏ nhất (“ glove.6B.zip”) có dung lượng 822 MB. Nó được huấn luyện trên một kho ngữ liệu chứa 6 tỷ từ trong tập từ vựng chứa 400 nghìn từ khác nhau.

Sau khi tải và giải nén, chúng ta có 4 file txt: glove.6B.50d.txt, glove.6B.100d.txt, glove.6B.200d.txt, glove.6B.300d.txt. 50d, 100d, 200d300d biểu diễn số chiều (dimension) của véc tơ từ. Trong bài này, chúng ta sẽ sử dụng véc tơ có chiều 50 (glove.6B.50d.txt). Để nạp các véc tơ từ GloVe, chúng ta thực hiện như sau:

import numpy as np
words = []
idx = 0
word2idx = {}
vectors = []

with open('glove.6B.50d.txt', 'rb') as f:
    for l in f:
        line = l.decode().split()
        word = line[0]
        words.append(word)
        word2idx[word] = idx
        idx += 1
        vect = np.array(line[1:]).astype(np.float)
        vectors.append(vect)
    
glove = {w: vectors[word2idx[w]] for w in words}

Như vậy chúng ta đã nạp thành công véc tơ của GloVe, chúng ta in vector biểu diễn cho từ “the” và nhận được kết quả như sau:

> print(glove['the'])
[ 4.1800e-01  2.4968e-01 -4.1242e-01  1.2170e-01  3.4527e-01 -4.4457e-02
 -4.9688e-01 -1.7862e-01 -6.6023e-04 -6.5660e-01  2.7843e-01 -1.4767e-01
 -5.5677e-01  1.4658e-01 -9.5095e-03  1.1658e-02  1.0204e-01 -1.2792e-01
 -8.4430e-01 -1.2181e-01 -1.6801e-02 -3.3279e-01 -1.5520e-01 -2.3131e-01
 -1.9181e-01 -1.8823e+00 -7.6746e-01  9.9051e-02 -4.2125e-01 -1.9526e-01
  4.0071e+00 -1.8594e-01 -5.2287e-01 -3.1681e-01  5.9213e-04  7.4449e-03
  1.7778e-01 -1.5897e-01  1.2041e-02 -5.4223e-02 -2.9871e-01 -1.5749e-01
 -3.4758e-01 -4.5637e-02 -4.4251e-01  1.8785e-01  2.7849e-03 -1.8411e-01
 -1.1514e-01 -7.8581e-01]

Như đã giới thiệu, các véc tơ từ có thể biểu diễn mức độ tương đồng về ý nghĩa giữa các từ. Để kiểm chứng điều đó, ta thiết kế một hàm đo độ tương đồng bằng numpy. Đoạn code dưới đây sử dụng Cú pháp giản lược trong Python.

from numpy import dot
from numpy.linalg import norm
cos_sim = lambda a, b: dot(a, b)/(norm(a)*norm(b))

Tiếp theo, chúng ta sẽ đo độ gần gũi về ngữ nghĩa giữa các từ “table”, “chair”, “dog” và “cat”:

> cos_sim(glove['dog'],glove['cat'])
0.9218005273769252
> cos_sim(glove['dog'],glove['table'])
0.3796810258522838
> cos_sim(glove['table'],glove['chair'])
0.5631253246562199

Như vậy chúng ta có thể thấy, độ gần gũi về mặt ngữ nghĩa giữa “dog” và “cat”, “table” và “chair” cao hơn giữa “dog” và “table”.

Hi vọng thông qua bài hướng dẫn ngắn này, bạn đã biết cách nạp véc tơ từ GloVe để sử dụng trong các bài toán xử lý ngôn ngữ tự nhiên sử dụng phương pháp học máy.

Exit mobile version