[VNLP Core] [2] Thực hành training và sử dụng biểu diễn từ trong không gian - word embedding

word2vec
word-embeddings
nlp-tiengviet

#1

Ở bài trước mình đã giới thiệu một số thuật toán và chia sẻ opensource cho bài toán tách từ tiếng Việt, tham khảo tại đây. Bạn có thể tự training hoặc sử dụng pre-trained model mình đã upload trên github để có thể thực hành trong bài này.

Để hiểu về ý nghĩa của việc biểu diễn một từ (word) trong không gian vector, hãy tham khảo ở bài tutorial [Học biểu diễn ngôn ngữ cho máy tính @sonvx] (Học biểu diễn ngôn ngữ cho máy tính)

Mục tiêu của bài này để hướng dẫn và đưa các bạn source code để:

  • Download dữ liệu từ các nguồn khác nhau trên Internet
  • Clean dữ liệu để đưa vào training
  • Training sử dụng mô hình word2vec
  • Test mô hình và share link để download pre-trained model
  1. Bạn có thể download dữ liệu từ nhiều nguồn khác nhau trên Internet như Wikipedia tiếng Việt (Wiki có hỗ trợ để dump dữ liệu và tải về máy), các trang báo mạng tiếng Việt như dantri.vn… Ở đây mình có viết một hàm để tài dữ liệu từ một url nào đó, ví dụ từ link 1 bài báo trên dân trí “https://dantri.com.vn/su-kien/anh-huong-bao…htm” và ghi vào một file text, clean luôn nếu bạn cần:
from word_embedding.utils import download_html
url_path = "https://dantri.com.vn/su-kien/anh-huong-bao....htm"
output_path = "data/word_embedding/real/html/html_data.txt"
download_html(url_path, output_path, should_clean=True)

Tham khảo tại: https://github.com/deepai-solutions/core_nlp/blob/master/word_embedding/utils.py

  1. Clean dữ liệu nếu có dính html tag, css, script. Sau đó tách từ để mỗi từ (word) có nghĩa và mang đúng nghĩa (xem phần đầu để lấy link tham khảo). Mình xin giới thiệu hàm để tự động tìm các files trong một thư mục, làm sạch các tag, script, tách từ rồi ghi vào một file cùng tên nhưng đặt trong thư mục mới.
input_dir = 'data/word_embedding/real/html'
output_dir = 'data/word_embedding/real/training'
from tokenization.crf_tokenizer import CrfTokenizer
from word_embedding.utils import clean_files_from_dir
crf_config_root_path = "tokenization/"
crf_model_path = "models/pretrained_tokenizer.crfsuite"
tokenizer = CrfTokenizer(config_root_path=crf_config_root_path, model_path=crf_model_path)
clean_files_from_dir(input_dir, output_dir, should_tokenize=True, tokenizer=tokenizer)

Một đoạn text trong 1 file dữ liệu sẵn sàng để training trông như sau:

Nhưng đến nay trong pháp_lệnh này đã xuất_hiện một_số điểm cần xử_lý , nổi_bật nhất vẫn là vấn_đề biểu thuế_thu_nhập đối_với người VN_. Nhiều doanh_nghiệp FDI đã đề_nghị phải xem_xét lại biểu_thuế đối_với người VN vì biểu_thuế hiện_nay quá cao khiến lao_động VN mất đi lợi_thế cạnh_tranh , các doanh_nghiệp nước_ngoài nếu muốn trả cho người VN làm_việc tại doanh_nghiệp nước_ngoài mức lương nào đó thì phải tính thêm cả phần sẽ phải nộp thuế . Được biết , Quốc_hội và Chính_phủ dự_kiến sẽ xây_dựng Luật thuế_thu_nhập cá_nhân , tại_sao chúng_ta không chuẩn_bị luôn luật đó thay_vì cứ liên_tục sửa pháp_lệnh thuế_thu_nhập , thưa ông ?

Chắc_chắn tới đây chúng_ta sẽ xây_dựng Luật thuế_thu_nhập cao , nhưng những điều_kiện hiện_nay vẫn chưa cho phép ta có_thể xây_dựng ngay luật , còn nhiều vấn_đề cần phải có thời_gian nghiên_cứu , thảo_luận kỹ hơn .

Tuy_nhiên , những sức_ép trong việc thu_hút đầu_tư nước_ngoài , tạo lợi_thế cạnh_tranh cho môi_trường đầu_tư tại VN đã khiến Chính_phủ phải tính tới việc trình UBTVQH trước_mắt cho sửa_đổi lại pháp_lệnh thuế_thu_nhập đối_với người có thu_nhập cao , tập_trung vào những điểm đang nổi_cộm trong quá_trình thực_hiện pháp_lệnh để không gây ảnh_hưởng tới việc thu_hút đầu_tư trực_tiếp nước_ngoài vào VN_.

Dữ liệu khi load vào có dạng mảng 2 chiều, chiều thứ nhất = số dòng, chiều thứ 2 = số từ trong 1 dòng. Ví dụ: […, [‘Tuy_nhiên’, ‘,’, ‘những’, …], … ]

  1. Training. Chúng ta sẽ sử dụng thư viện gensim để training, ở đây mình đã gọi một hàm load dữ liệu từ file đưa về dạng mảng 2 chiều. Sau khi training xong, chúng ta có thể lưu model ra file.
from word_embedding.word2vec_gensim import train
data_path="data/word_embedding/samples/training"
model_path="models/word2vec.model"
train(data_path=data_path, model_path=model_path)
  1. Test. Bạn có thể load lại model mà bạn đã training hoặc sử dụng bất cứ pre-trained model nào khác, ví dụ, mình đã upload một file ở models/pretrained_word2vec.bin
from word_embedding.word2vec_gensim import test
model_path = "models/word2vec.model"
test_word = "thu_nhập"
test(model_path=model_path, word=test_word)

Trong hàm test, đoạn code như sau:

word = 'thu_nhập'
sim_words = model.wv.most_similar(word)
print(sim_words)

Khi test sử dụng models/pretrained_word2vec.bin có kết quả như sau:

[('bình_quân', 0.6922188401222229), ('sản_lượng', 0.6736413836479187), ('ngắn_hạn', 0.6727277040481567), ('tiêu_dùng', 0.6719043254852295), ('usd', 0.6675985455513), ('chi_phí', 0.6653618216514587), ('cổ_phiếu', 0.6588883399963379), ('lãi_suất', 0.6542356014251709), ('tỷ_lệ', 0.6527915000915527), ('lãi', 0.6505590081214905)]

Use pre-trained word2vec model

model_path = "models/pretrained_word2vec.bin"

Link source code:


[VNLP Core] [3] Bài toán phân loại văn bản - Phân tích cảm xúc của bình luận (text classification)
[Hỏi] Xây dựng tập dữ liệu training cho n-gram language model phục vụ bài toán tách từ
#3

anh cho em hỏi, lộ trình cho học NLP, khi đã có căn bản về python là gì vậy a. Em cám ơn ạ


#4

Trước hết mình nghĩ cần hiểu về manchine learning và deeplearning. Bởi vì trong NLP cũng cần các bài toán cơ bản như clustering, classification. Tiếp đó là học các bài toán core của NLP như tách từ (word segmentation), POS tagging, text classification, text clustering, sau đó đến dependency parsing, text summarization… tùy theo bài toán bạn cần.


#5

em cám ơn ạ, vê ML em cũng có biết một chút rồi ạ.


Cách tạo Word2Vec cho competition
Xin hướng dẫn học về NLP
#8

Cho mình hỏi từ html_data ra tới data, bạn tạo ra data với từ ghép này là dựa vào cách gì?

html data: Theo tin từ Bộ Tài chính, dự thảo pháp lệnh thuế thu nhập đối với người có thu nhập cao ( sửa đổi ) đang được bộ này khẩn trương xây dựng trình Chính phủ

trainable data: Theo tin từ Bộ Tài_chính , dự_thảo pháp_lệnh thuế_thu_nhập đối_với người có thu_nhập cao ( sửa_đổi ) đang được bộ này khẩn_trương xây_dựng trình Chính_phủ

Và theo cách tạo ra từ ghép như duới này cũng có thể bị thiếu sót rất nhiều. VD như trên mình muốn nó phải là Bộ_Tài_chínhnguời_có_thu_nhập_cao thì làm thế nào?

Theo mình hiểu là bạn dựa vào bộ từ điển để tạo ra từ ghép, và nếu làm theo cách này thì khả năng sót từ vẫn là rất lớn và hữu hạn.