Trong xử lý ngôn ngữ tự nhiên, việc biểu diễn một từ thành một vector đóng một vai trò cực kỳ quan trọng. Nó lợi ích rất nhiều trong việc thể hiện sự tương đồng, đối lập về ngữ nghĩa giữa các từ, giúp mô hình hóa vector cho 1 câu hay đoạn văn, tìm các câu có nghĩa tương đồng,... Show Trong bài viết này, mình sẽ trình bày một cách sơ lược về cách mô hình hóa không gian vector cho Tiếng Việt. Bài viết gồm 2 phần:
Word embedding là gì? Tại sao word embedding lại quan trọng trong xử lý ngôn ngữ?Word embedding là một nhóm các kỹ thuật đặc biệt trong xử lý ngôn ngữ tự nhiên, có nhiệm vụ ánh xạ một từ hoặc một cụm từ trong bộ từ vựng tới một vector số thực. Từ không gian một chiều cho mỗi từ tới không gian các vector liên tục. Các vector từ được biểu diễn theo phương pháp word embedding thể hiện được ngữ nghĩa của các từ, từ đó ta có thể nhận ra được mối quan hệ giữa các từ với nhau(tương đồng, trái nghịch,...). Các phương pháp thường được sử dụng trong word embedding bao gồm:
Vậy tại sao word embedding lại quan trọng?Trong các ứng dụng về xử lý ngôn ngữ tự nhiên, học máy,... các thuật toán không thể nhận được đầu vào là chữ với dạng biểu diễn thông thường. Để máy tính có thể hiểu được, ta cần chuyển các từ trong ngôn ngữ tự nhiên về dạng mà các thuật toán có thể hiểu được(dạng số). Một kỹ thuật đơn giản nhất được sử dụng là One hot vector(1-of-N). Để chuyển đổi ngôn ngữ tự nhiên về dạng 1-of-N, ta thực hiện các bước như sau:
Ví dụ: Giả sử bộ từ vựng của chúng ta chỉ có 5 từ: Vua, Hoàng hậu, Phụ nữ, Đàn ông và Trẻ con. Ta sẽ mã hóa cho từ Hoàng Hậu như sau: Tuy nhiên, phương pháp này lại để lộ ra những điểm hạn chế vô cùng lớn.
Do đó, việc tìm một phương pháp biểu diễn từ mà vẫn thể hiện được một cách tốt nhất ngữ nghĩa của từ là một vấn đề cực kỳ quan trọng. Vậy làm thế nào để thể hiện ý nghĩa của 1 từ?Câu trả lời thường gặp là sử dụng wordnet. Với những ai chưa biết, wordnet là một cơ sở dữ liệu về từ, trong đó các từ được nhóm lại thành các loạt từ đồng nghĩa, các loạt từ đồng nghĩa này được gắn kết với nhau nhờ các quan hệ ngữ nghĩa.
Kết quả thu được là: dốc_sức, gắng_sức, nỗ_lực, gắng, gắng_mình, dốc_hết_mình, phấn_đấu, gắng_hết_sức_mình, ráng_sức, đối_phó, dốc_hết_nghị_lực, dồn_sức, cố_gắng Tuy nhiên, wordnet vẫn ẩn chứa vấn đề của nó:
Chưa kể đến việc wordnet cho Tiếng Việt còn nhiều hạn chế về chất lượng và cấu trúc lưu trữ. Một điều khá đặc biệt trong việc hiểu ngôn ngữ của chúng ta là chúng ta còn có thể lấy được rất nhiều giá trị đại diện cho một từ thông qua ý nghĩa của các từ lân cận nó. Ví dụ: Sau một vài thành công trong lĩnh vực âm nhạc, Sơn Tùng M-TP được người hâm mộ gọi với cái biệt danh thân mật là sếp. Mọi người có thể đứng ngoài trời cả ngày trời chỉ để mua vé nghe sếp hát. Trong trường hợp này, từ sếp đã được đại diện cho từ Sơn Tùng M-TP thông qua các ngữ cảnh xung quanh nó. Vậy làm thế nào để lấy các lân cận đại diện cho một từ? Có một cách đơn giản mà hiệu quả là xây dựng 1 ma trận đồng xuất hiện X dựa vào cửa sổ quanh mỗi từ. Việc này giúp ta nắm bắt được cả ngữ pháp của câu cũng như ngữ nghĩa của từ. Người ta gọi phương pháp này là Windows based cooccurence matrix. Chúng ta cùng tìm hiểu về nó trong phần tiếp theo. Windows based cooccurence matrixVí dụ: Windows based cooccurence matrix với Window length 1( thường 5-10), đối xứng(không liên quan tới trái hoặc phải). Corpus: tôi yêu công_việc . tôi thích NLP . Ta có ma trận đồng xuất hiện sau: tôi yêu công_việc thích NLP ghét ở một_mình . tôi 0 1 0 1 0 1 0 0 0 yêu 1 0 1 0 0 0 0 0 0 công_việc 0 1 0 0 0 0 0 0 1 thích 1 0 0 0 1 0 0 0 0 NLP 0 0 0 1 0 0 0 0 1 ghét 1 0 0 0 0 0 1 0 0 ở 0 0 0 0 0 1 0 1 0 một_mình 0 0 0 0 0 0 1 0 0 . 0 0 1 0 1 0 0 0 0 Tuy nhiên, vấn đề ở đây là khi tăng kích thước của bộ từ vựng, số chiều của ma trận sẽ rất lớn: đòi hỏi nhiều không gian lưu trữ hơn, không những thế ma trận lưu trữ còn là ma trận thưa, rất kém hiệu quả. Giải pháp khắc phục cho vấn đề này là : Giảm chiều vector Ý tưởng: Giảm số chiều của vector ban đầu xuống một số cố định mà vẫn đảm bảo lưu trữ được hầu hết các thông tin quan trọng. Vector thu được là một dense vector. Số chiều thường lấy trong khoảng từ 300-1000 chiều. Phương pháp: Giảm kích thước với X sử dụng Singular Value Decomposition. Ý tưởng cốt lõi của phương pháp Singular Value Decomposition là phân tích ma trận ban đầu thành tích của 3 ma trận đặc biệt, sử dụng chéo hóa ma trận. Trong bài viết này mình sẽ không nói rõ chi tiết về phương pháp. Bạn có thể tham khảo qua phương pháp SVD ở đây. Vẫn với corpus như trên, ta thực hiện chương trình thử nghiệm. Đầu tiên, ta import 2 thư viện cần thiết là numpy để hỗ trợ tính toán và matplotlib để hiện thị kết quả.
Sau khi đã import 2 thư viện trên, ta thực hiện việc xây dựng corpus và tính ma trận đồng xuất hiện.
Cuối cùng, ta giảm chiều cho ma trận đồng xuất hiện X theo phương pháp SVD với sự hỗ trợ của thư viện numpy.
Chúng ta cùng phân tích kết quả. Như trên hình vẽ, từ "NLP" và từ "công_việc", từ "yêu" và từ "thích" ghi đè lên nhau. Lý do là các cặp từ này đều cùng 1 tính chất, từ "ghét" ở gần từ "yêu" và "thích" hơn các từ khác vì chúng đều là tính từ. Đây là 1 ví dụ siêu nhỏ nhưng cũng mong nó sẽ giúp bạn hình dung rõ hơn về ứng dụng của word embedding. Hình ảnh ở trên là một ví dụ khác sử dụng ma trận đồng xuất hiện cho biểu diễn từ lên không gian vector. Như chúng ta đã thấy, kết quả khá tốt khi mối quan hệ giữa các danh từ và động từ được tách biệt 1 cách khá rõ ràng. Tuy nhiên, vấn đề của SVD là chi phí tính toán khá lớn, tỉ lệ với bậc hai của độ lớn bộ từ vựng với độ phức tạp O(m∗n2)O(m*n^2). Không những thế, nó còn khó kết hợp khi có từ mới hoặc tài liệu mới. Trong năm 2013, một ý tưởng được đưa ra bởi Tomas Mikolov- một kỹ sư đang làm tại Google đã giải quyết được các vấn đề trên bằng một mô hình hoàn toàn khác. Mô hình được sử dụng tốt cho đến ngày nay và được gọi là mô hình word2vec. Word2vecThay vì đếm và xây dựng ma trận đồng xuất hiện, word2vec học trực tiếp word vector có số chiều thấp trong quá trình dự đoán các từ xung quanh mỗi từ. Đặc điểm của phương pháp này là nhanh hơn và có thể dễ dàng kết hợp một câu một văn bản mới hoặc thêm vào từ vựng. Word2vec là một mạng neural 2 lớp với duy nhất 1 tầng ẩn, lấy đầu vào là một corpus lớn và sinh ra không gian vector(với số chiều khoảng vài trăm), với mỗi từ duy nhất trong corpus được gắn với một vector tương ứng trong không gian. Các word vectors được xác định trong không gian vector sao cho những từ có chung ngữ cảnh trong corpus được đặt gần nhau trong không gian. Dự đoán chính xác cao về ý nghĩa của một từ dựa trên những lần xuất hiện trước đây. Nếu ta gán nhãn các thuộc tính cho một vector từ giả thiết, thì các vector được biểu diễn theo word2vec sẽ có dạng như sau: Có 2 cách xây dựng word2vec:
Do những ưu điểm của Skip-gram Model vượt trội hơn người anh em của nó, nên trong bài viết này, mình chỉ đi trọng tâm vào mô hình này. Skip-gram ModelMục tiêu: Học trọng số các lớp ẩn, các trọng số này là các words vector Cách thức: Cho một từ cụ thể ở giữa câu(input word), nhìn vào những từ ở gần và chọn ngẫu nhiên. Mạng neural sẽ cho chúng ta biết xác suất của mỗi từ trong từ vựng về việc trở thành từ gần đó mà chúng ta chọn. Dưới đây là mô hình kiến trúc của mạng Skip-gram và cách xây dựng training data. Ví dụ: Xây dựng training data với windows size = 2. Ở đây windows được hiểu như một cửa sổ trượt qua mỗi từ. Windows size = 2 tức là lấy 2 từ bên trái và bên phải mỗi từ trung tâm. Model details
Vấn đề:
Word2vec cải tiếnCó 3 cải tiến cơ bản cho mô hình word2vec truyền thống:
Cải tiến 1: Xử lý cụm từ như một từ đơn Ví dụ các từ như “thành_phố_Cảng” có nghĩa khác nhau với từng từ “thành_phố” và “cảng”,... Chúng ta sẽ coi như đó là một từ duy nhất, với word vector của riêng mình. Điều này sẽ làm tăng kích thước từ vựng. (Tìm hiểu thêm về word2phrase) Cải tiến 2: Loại bỏ các từ thường xuyên lặp lại Các từ thường xuyên lặp lại như “các”, “những”,… không cho chúng ta biết thêm nhiều hơn về ý nghĩa của những từ đi kèm nó, và chúng cũng xuất hiện trong ngữ cảnh của khá nhiều từ. Chúng ta sẽ xác định xác suất loại bỏ, giữ lại một từ trong từ vựng thông qua tần suất xuất hiện của nó. Cải tiến 3: Negative Sampling Mỗi mẫu huấn luyện chỉ thay đổi một tỷ lệ phần trăm nhỏ các trọng số, thay vì tất cả chúng. Nhớ lại: Khi huấn luyện mạng với 1 cặp từ, đầu ra của mạng sẽ là 1 one-hot vector, neural đúng thì đưa ra 1 còn hàng ngàn neural khác thì đưa ra 0. Chọn ngẫu nhiên 1 số lượng nhỏ các neural “negative” kết hợp với neural “positive” để cập nhật trọng số.(chọn là 5-20 hoạt động tốt với các bộ dữ liệu nhỏ, 2-5 với bộ dữ liệu lớn). Kết quả thú vị của Word2Vec:Chúng ta cùng phân tích qua một vài kết quả thú vị sử dụng mô hình word2vec. Ví dụ dưới đây là một ví dụ cực kỳ kinh điển của mô hình word2vec. Word vector học từ mô hình word2vec rất phù hợp để tìm ra quan hệ giữa các từ về mặt ngữ nghĩa. Chúng ta có thể tìm mối quan hệ giữa các từ thông qua các phép toán vector. Word vector học từ mô hình word2vec rất phù hợp để trả lời cho câu hỏi: Nếu A là B thì C là ... Như ví dụ dưới đây, nếu thủ đô của China là Bắc Kinh thì thủ đô của Nga là thành phố Moscow,... Hay như trong trường hợp này là mối quan hệ về giới tính. Các kết quả này hoàn toàn lấy từ mô hình word2vec. Trong phần cuối của bài viết này, chắc hẳn các bạn đang nghĩ rằng tại sao chúng ta phải train lại mô hình trong khi đã có các mô hình có sẵn đúng không? Đơn giản là trong nhiều bài toán, chúng ta train dữ liệu trong một miền cụ thể sẽ cho kết quả tốt hơn nhiều so với dùng mô hình train sẵn. Ví dụ trong bài toán tính độ tương đồng giữa các quốc gia, mình đã thử so sánh việc dùng pre-train model có sẵn của tác giả Trần Việt Trung và việc train dữ liệu chỉ từ các bài báo quốc tế. Kết quả là mô hình mình train lại tốt hơn do word vector được học từ dữ liệu phù hợp với bài toán hơn. Xây dựng mô hình không gian vector cho Tiếng Việt với VietNam Wikipedia.
Lời kếtTrong bài viết này, mình đã trình bày về các cách để có thể ánh xạ một từ sang một không gian vector mà vẫn giữ được ý nghĩa của từ thông qua ngữ cảnh của chúng. Những word vector này là vô cùng quan trọng, là đầu vào cho các thuật toán Machine Learning, Deeplearning trong lĩnh vực xử lý ngôn ngữ tự nhiên sau này. |