Cách tạo Word2Vector cho Tiếng Việt

w2vvn

Trong bài viết này chúng ta sẽ tìm hiểu về cách tạo Word2Vector cho Tiếng Việt, bao gồm các nội dung:

  1. Cách tạo mô hình Word2Vector Tiếng Việt.
  2. Phân loại Word2Vector.
  3. Đặc điểm Word2Vector.
  4. Các yếu tố ảnh hưởng đến chất lượng Word2Vector.
  5. Thực hành tạo Word2Vector Tiếng Việt.

 

1. Cách tạo mô hình Word2Vector Tiếng Việt.

Sơ đồ huấn luyện Word2Vector Tiếng Việt:

word2vector

Theo sơ đồ trên thì từ văn bản đã được làm sạch, chúng ta cần thực hiện tách từ Tokenizer. Nếu bạn chưa biết tách từ cho Tiếng Việt như thế nào thì có thể xem lại bài viết cách tách từ cho Tiếng Việt. Sau đó, văn bản Tiếng Việt đã tách từ là đầu vào của mạng nơ ron Recurrent Neural Network (RNN) để cho ra mô hình Word2Vector.

Word2Vector là kết quả của một mô hình học nông của mạng nơ ron Recurrent Neural Network. Mục đích của mô hình này là biểu diễn tập từ (word) của một ngôn ngữ tự nhiên vào không gian vector. Nhờ vào không gian vector của từ vựng này mà các từ càng tương đồng với nhau thì giá trị khoảng cách cosine càng lớn (càng gần giá trị 1), ngược lại các từ ít tương đồng với nhau thì khoảng cách cosine sẽ càng nhỏ (càng gần giá trị 0). Các tính chất này sẽ được làm rõ thêm ở mục 3 về đặc điểm của Word2Vector.

Word2Vector in Literature: It's like numbers are language, like all the letters in the language are turned into numbers, and so it's something that everyone understands the same way. You lose the sounds of the letters and whether they click or pop or touch the palate, or go ooh or aah, and anything that can be misread or con you with its music or the pictures it puts in your mind, all of that is gone, along with the accent, and you have a new understanding entirely, a language of numbers, and everything becomes as clear to everyone as the writing on the wall. So as I say there comes a certain time for the reading of the numbers.

-- E.L. Doctorow, Billy Bathgate --

 

2. Phân loại Word2Vector.

Word2Vector có 2 loại kiến trúc Continuous Bag-of-Words (CBOW)Skip-gram như sau:

word2vector

Quan sát hình trên, ta thấy kiến trúc CBOW phục vụ cho nhu cầu dự đoán từ thứ t, w(t) khi biết trước các từ trước và sau nó. Ngược lại, kiến trúc Skip-gram thì dự đoán các từ có khả năng nằm trước và sau từ thứ t, w(t). Do CBOW và Skip-gram có những công dụng khác nhau cho nên tùy theo loại bài toán mà ta chọn kiến trúc phù hợp với mục tiêu cần giải quyết. Tiếp theo ta sẽ tìm hiểu các đặc điểm của mô hình Word2Vector.

3. Đặc điểm Word2Vector.

Để đo lường độ tương đồng giữa các từ vựng, mô hình Word2Vector đưa ra một độ đo khoảng cách Cosine (Cosine distance), được tính dựa vào tích vô hướng của 2 vector, còn gọi là độ tương đồng Cosine (Cosine similariry).

\begin{equation*} \cos( \theta ) \ =\ \dfrac{\vec{a} \ \dot{} \ \vec{b}}{\left\Vert \vec{a}\right\Vert \dot{}\left\Vert \vec{b}\right\Vert } \ \in [ 0,1] \end{equation*}

Theo công thức tính độ tương đồng cosine thì giá trị khoảng cách giữa 2 từ nằm trong đoạn [0,1]. Nếu 2 từ có độ tương đồng càng cao thì khoảng cách cosine càng gần giá trị 1 và ngược lại 2 từ có độ tương đồng càng thấp thì khoảng cách cosine càng gần giá trị 0. Như ví dụ sau:

double cosSim1 = vnw2v.similarity("anh", "em"); 		//0.8406431927247495
double cosSim2 = vnw2v.similarity("nhà_cửa", "dòng_sông"); //0.2216639156561478

Dựa vào khoảng cách cosine này ta có thể tìm được tóp n từ có độ tương đồng gần nhất với một từ nào đó, ví dụ như từ "hạnh phúc":

Collection similars = vnw2v.wordsNearest("hạnh_phúc", 10);
//output: [ao ước, sung sướng, niềm vui, tình yêu, cuộc sống, yêu thương, trọn vẹn, mong ước, Hạnh phúc, vui sướng]

Đặc điểm toán học của Word2Vector có tính chất như sau:

chồng - anh = vợ - em ==> em - anh + chồng = vợ

gọi là logic mở rộng (Logical extension). Trong đó, cặp ("em", "chồng") gọi là positive words, và ("anh") là negative word. Ta cũng có thể lấy tóp n từ thỏa mãn tính chất này, như ví dụ sau:

Collection list = vnw2v.wordsNearest(Arrays.asList("em","chồng"), Arrays.asList("anh"), 3);
//output: vợ, con gái, mẹ

Để dễ hiểu tính chất logic mở rộng này ta có thể quan sát biểu diễn của các từ "anh", "em", "chồng", "vợ" trong không gian 2 chiều như hình sau:

word2vector

4. Các yếu tố ảnh hưởng đến chất lượng Word2Vector.

Để tạo được mô hình Word2Vector chất lượng cao ta cần chú ý đến các yếu tố sau:

  1. Số lượng và chất lượng của dữ liệu huấn luyện. Số lượng câu được dùng để huấn luyện càng nhiều thì cho ra mô hình Word2Vector sẽ càng tốt, nhưng đồng thời cũng phải phải chú ý đến chất lượng của dữ liệu, nếu dữ liệu có lẫn nhiều ký tự rác hay ký tự điều khiển hoặc chứa nhiều dữ liệu có cách hành văn sai ngữ pháp, sai cú pháp, không được tự nhiên thì cũng sẽ ảnh hưởng đến chất lượng của mô hình được tạo ra.
  2. Kích thước của vector. Thường thì càng cao thì càng tốt nhưng không phải luôn đúng trong mọi trường hợp.
  3. Thuật toán huấn luyện (training). Hiện nay có 2 thuật toán tốt nhất để huấn luyện mô hình Word2Vector là: hierarchical softmax – tốt hơn với những từ có tần suất thấp, negative sample – tốt với những từ tần suất cao và tốt với số chiều vector thấp.
  4. Sub-sampling of frequent words (lấy mẫu nhỏ các từ thường xuyên): trong thực tế huấn luyện mô hình Word2Vector ta sẽ bắt gặp các từ có tần suất rất cao nhưng lại đóng góp rất ít cho việc phân tích ngữ nghĩa, trong Tiếng Việt là các hư từ như: "thì", "là", "mà"... Cho nên các nhà khoa học đã đưa ra một ngưỡng θ xác định để trong quá trình huấn luyện nếu gặp các từ tần suất cao này mà tần suất cập nhật đã vượt ngưỡng θ này thì thôi không cập nhật tri thức của các từ này vào bộ trọng số của mô hình nữa. Giá trị ngưỡng θ thường dùng từ 10-3 đến 10-5. Chính vì loại bỏ việc xử lý các từ tần suất cao đã vượt ngưỡng θ cho phép đã giúp cải thiện cả độ chính xác và tốc độ huấn luyện mô hình với tập dữ liệu rất lớn.
  5. Context (window) size (kích thước ngữ cảnh từ). Với Skip-gram thường là quanh giá trị 10, còn với CBOW thì quanh giá trị 5.
  6. Kiến trúc. Với Skip-gram thì tốc độ huấn luyện chậm nhưng lại tốt hơn với những từ tần suất thấp. CBOW thì tốc độ huấn luyện nhanh.

 

5. Thực hành tạo Word2Vector Tiếng Việt.

Trong thực nghiệm, với việc tạo mô hình Word2Vector cho Tiếng Việt VNW2V, chúng tôi đã chọn các thông số, và tập dữ liệu huấn luyện như sau:

  1. Chọn kiến trúc CBOW.
  2. Kích thước tập dữ liệu huấn luyện là 518MB văn bản Tiếng Việt tách từ.
  3. Số chiều vector là 300.
  4. Thuật toán huấn luyện là negative sampling.
  5. Sub-sampling là 10-4.
  6. Window size là 10.

Mô hình VNW2V được tạo bằng tool gensim, các bạn tham khảo theo link sau: https://radimrehurek.com/gensim/. Phần thực hành này chúng tôi thực hiện trên hệ điều hành Ubuntu.

Install gensim:

# Install Dependencies
sudo apt-get install python-setuptools
sudo apt-get install python-pip
pip install cython
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
sudo easy_install numpy
sudo easy_install scipy

# Install Gensim
sudo easy_install -U gensim

Nội dung file train_model_vnw2v.py như sau:

import os
import sys
import codecs
import gensim

class MySentences(object):
     def __init__(self, dirname):
         self.dirname = dirname

     def __iter__(self):
         for fname in os.listdir(self.dirname):
             for line in codecs.open(os.path.join(self.dirname, fname), 'r', 'utf-8'):
                 yield line.split()

dirData='/path/to/data/tokenizer'
pathModelBin='/path/to/model/vnw2v.bin'
pathModelTxt='/path/to/model/vnw2v.txt'

if __name__ == '__main__':
    sentences = MySentences(dirData) # a memory-friendly iterator
    model = gensim.models.Word2Vec(sentences, size=300, window=10, min_count=10, sample=0.0001, workers=4, sg=0, negative=10, cbow_mean=1, iter=5)
    model.save_word2vec_format(pathModelBin, fvocab=None, binary=True)
    model.save_word2vec_format(pathModelTxt, fvocab=None, binary=False)

Chú ý các bạn cần chỉnh sửa các biến dirData, pathModelBin, pathModelTxt theo đúng đường dẫn thư mục trong máy tính của các bạn.

Như file train_model_vnw2v.py ta thấy rằng đầu vào của gensim.models.Word2Vec là tập hợp các câu được thực hiện bằng class MySentences với đầu vào là một thư mục chứa file văn bản đã được tách từ trước đó, với mỗi dòng là một câu.

Mô hình Word2Vector sau khi huấn luyện xong có thể được lưu lại theo 2 định dạng: thuần text hoặc dạng nén binary. Ở đây, chúng tôi lưu cả 2 định dạng.

Kết quả thu được mô hình VNW2V có kích thước dạng binary là 90MB, dạng thuần text là 207MB. Với số lượng từ vựng là 74.268 từ. Bạn có thể download W2VModelVN.bin bản build dạng binary tại đây

Word2Vector được lưu ở dạng thuần text cũng khá đơn giản. Dòng đầu tiên chứa 2 giá trị: số lượng từ (token) và số chiều vector của mỗi từ. Các dòng còn lại bắt đầu bằng một từ (token) và 300 giá trị trọng số của vector. Ví dụ, như sau:

74268 300
rất -0.958530 1.185755 -0.532807 -0.672818 -1.047415 -0.049629 0.360319 0.210882 -1.087097 -0.183678 0.130195 -2.357076 -0.597504 0.983590 -0.870285 -0.374469 2.051358 0.939002 0.335924 -0.284420 -0.627550 -0.519627 1.878835 -1.123793 0.565709 1.374026 1.002342 0.426371 -0.737084 -2.715394 0.220522 0.059674 -1.889633 0.603659 1.419119 1.355124 -1.967574 1.317107 -0.433339 0.381356 -1.797729 1.241504 -0.160071 1.908369 2.150423 1.386073 -0.823404 0.480388 -0.028159 0.004961 -0.933002 0.411329 -0.737299 -0.194039 1.090924 0.694544 0.474349 1.584100 1.250846 -1.026660 0.143565 -0.887264 2.577441 -0.234264 0.466905 -0.239324 -0.941672 1.342697 0.632855 -2.334213 0.531450 1.007460 1.291813 0.188237 1.025562 -0.924587 -1.233157 -0.027595 -1.451380 -0.568905 0.370963 0.640064 -0.122530 3.042972 -1.336393 0.066514 -0.136791 -0.386206 -1.859969 -0.040520 -0.265607 -0.156036 -1.006098 -0.327835 0.406720 1.604193 0.875691 -0.783650 0.516805 0.316116 -0.358006 0.393687 -1.286755 1.405266 -0.934941 -0.559433 0.740223 -0.888003 0.708560 -0.468392 -1.029468 -2.127238 1.340998 -0.809204 0.905858 -0.138862 -0.379993 0.542222 1.355043 -1.078585 -1.283707 1.741688 -1.502076 -0.168951 -0.573287 -1.174194 0.978899 -1.990983 0.318878 0.558901 0.011419 0.047648 -1.669259 -0.711724 0.533828 -2.144168 0.128748 -0.014497 -0.058966 0.116225 -1.747904 2.771031 -0.424268 1.901719 -0.749353 0.475512 -0.192074 0.555123 -0.144977 -0.569297 -0.219266 -0.617632 2.349269 -1.030264 0.727211 0.458954 0.468284 -0.481791 0.369483 0.183024 1.212082 0.832915 0.432373 -0.075645 -0.125866 0.646118 -0.657175 0.236318 1.503824 -0.007442 -1.143397 0.303015 0.297094 1.203228 0.410806 1.842474 0.710505 0.597148 -0.188344 -0.618176 1.876590 -0.091431 -1.474528 0.034373 -1.253787 1.679154 -1.380657 -1.947278 -0.628573 0.553660 -0.155813 -1.073834 -0.452626 0.573727 0.225314 0.757927 0.327850 0.060559 0.885003 -0.601912 -0.110427 0.393229 -0.780555 1.420997 -0.378095 -1.297858 0.394388 0.353389 0.444628 -1.719906 -2.181435 -0.540349 0.916705 -0.540424 -0.921580 -1.635308 1.736059 0.502421 1.587273 -0.287609 -1.145622 0.431794 -1.336535 -1.651041 0.351628 -0.265449 1.791372 -0.128414 0.737217 0.618375 0.058724 0.747262 -0.577374 -0.288703 -0.984996 0.171550 -0.637034 0.527619 1.002404 1.897288 2.049463 -1.390402 -0.674309 -1.628577 -0.253801 -1.926141 0.115941 -0.589692 0.381427 -0.023322 -1.459228 -0.044911 -0.299381 0.236091 1.232281 2.380030 1.998444 -0.244105 0.080706 0.089627 0.232209 -0.115954 -1.783753 -0.297488 0.811791 1.217988 -1.508383 -0.460603 -1.087463 3.002618 0.850736 0.801632 2.646371 1.031708 -0.723051 -1.644545 -0.222234 -0.117630 -0.170871 -0.206531 2.013973 0.837608 -0.809996 -0.040958 -0.289436 1.054077 2.098060 -0.060349 1.595610 -1.406415 1.011666 -0.242314 -1.605387 1.007811 0.724688 1.872438 0.334079 -2.539507 -0.979068 1.796417
nên 0.817764 0.730793 2.425183 0.123902 0.110112 0.880416 -0.657980 -0.761691 2.022750 -0.570320 -0.185023 0.623355 -0.242711 1.527163 -1.001461 -0.300320 1.072407 -2.427789 0.656444 -1.079087 0.156995 -0.679968 1.837191 -0.036501 0.041966 -1.250491 0.585470 -0.191844 0.007415 -1.337733 -0.783590 -0.009832 0.031382 0.052435 -0.498178 0.171237 -1.711303 -0.818219 0.720076 0.167350 0.624947 -0.700456 -0.517254 1.208609 2.092501 0.966394 -0.413985 -0.664964 0.729838 1.827654 -0.832268 1.353763 -0.797979 0.100658 -0.925381 -0.011509 -1.025147 -0.306524 0.585026 -3.014350 -0.380181 0.076344 0.531783 -0.359784 -0.594122 0.399985 -1.014764 1.475140 -0.443917 -0.121588 0.469653 0.757527 1.545444 2.544307 -0.014912 -2.621171 -0.225768 0.351704 -0.681244 -0.006227 -0.337887 -0.112005 -0.332352 0.822335 0.311765 0.349086 -0.319658 -0.108776 -0.253022 -0.898181 -0.837542 -0.941488 0.025750 0.218769 -0.577606 0.818747 -1.016191 -0.877968 2.082439 0.451776 -0.472952 0.606072 -0.801765 -0.845907 1.376145 0.321016 -0.081426 -0.497567 -0.624878 -0.547228 -0.334165 -1.093513 -1.724039 -2.590409 0.545678 -0.140639 -0.614110 -0.545923 -0.194732 -1.351183 -0.413119 0.623098 -0.173997 1.544186 -0.873967 -0.594020 1.846802 -1.914299 -0.266325 0.420596 1.022756 -2.806849 0.021955 -0.111778 0.743143 0.101352 -1.067115 0.610345 1.032546 0.134187 -0.405819 0.955309 -0.189478 1.109278 -0.399296 -0.360320 -0.228744 -0.634463 -0.468716 -1.327049 -0.370423 -2.202127 -0.249842 0.507817 -0.351397 -0.126329 -1.051577 -1.133481 0.471971 1.100131 0.585837 -1.625095 -0.608029 0.210274 -0.532985 0.773016 -1.003164 1.485139 0.798136 -1.152363 -1.489234 1.171152 -0.099794 -0.455928 1.960493 0.598989 1.400246 -0.500300 -0.039886 -1.445825 0.803927 -0.977731 -0.763487 0.876298 1.511436 0.794424 -0.332100 0.543016 1.776749 -0.179549 1.635316 0.086595 0.997994 0.224294 0.950980 1.262234 0.483206 -0.669001 0.761345 0.072108 1.229642 2.432684 -1.994292 -0.032726 2.280585 -0.130222 0.635579 1.096082 -0.957123 -1.168884 -0.960421 -0.489699 -0.354480 1.012436 -0.285619 0.831611 4.372422 0.953546 0.856386 -0.329736 -1.037151 1.496055 0.029495 -0.315344 0.547543 0.286108 1.559759 -2.322484 1.094189 -0.289634 1.226142 0.600635 0.636631 0.111868 2.804923 0.316592 0.398014 -1.431151 0.899133 0.374771 0.694521 -1.287871 0.393139 -1.042022 0.550085 -0.723200 1.373222 0.971642 -0.209820 0.360627 -1.140705 0.679503 1.144977 1.029573 3.249100 1.299631 0.602327 -0.293802 -0.569424 -0.080060 -1.041524 1.015574 -2.139905 -0.157994 0.318573 -1.138484 -0.791636 -0.420224 -0.215848 1.516317 -0.567034 -0.652343 1.873476 0.944502 -0.399911 -0.221525 0.163594 0.821909 -0.491545 -0.151184 0.374507 -1.079412 1.265488 1.277506 0.135841 0.641065 -0.089842 -0.532832 0.960994 -2.036842 1.073297 -0.929128 -1.136067 0.189803 0.971549 0.668775 1.600866 0.143977 -1.470320 1.083938
thấy -1.080631 0.418769 2.041120 0.892034 -0.161793 0.173147 -0.337983 -0.268331 0.440207 -0.303043 0.634810 -1.059405 -2.087987 -1.649617 0.138483 -0.327013 -1.094095 -0.660723 -0.990381 -0.055518 -1.815174 -0.429673 0.662088 0.995666 0.812475 -0.721564 0.251350 1.321516 -0.896218 -1.431245 -1.700889 -0.326742 -1.355933 1.117277 0.379985 1.029047 -0.328749 1.217296 1.407215 -0.062166 -0.170826 -2.038140 0.055842 -0.074598 0.578444 -0.178158 1.476658 -1.057105 -1.245650 1.925669 0.860415 0.344691 0.372157 -0.527785 -0.913763 -0.746241 0.463359 0.019850 -0.080127 -1.175144 -0.155466 -1.063234 0.371779 -1.362964 0.777134 -0.232424 -1.807658 -0.791145 1.222524 -1.193391 0.959637 -0.492899 -0.443528 1.457885 0.838863 1.740852 0.031168 -1.070892 0.234129 -0.507850 -0.545365 -0.703249 -1.457072 1.104471 0.705777 -0.947469 1.454159 0.177130 0.944588 0.584862 -0.785251 -1.654859 0.349738 0.031516 -0.922706 0.113744 0.006449 0.253433 1.032101 -0.123085 -1.617488 -0.896716 -0.062688 -1.907313 0.049018 1.660900 0.988163 1.372957 -3.594247 -2.192380 -1.431791 -1.352604 -0.801247 -2.129225 1.595502 -0.046155 -0.417792 -0.347586 1.481605 -1.520716 0.281637 0.686055 -0.549593 0.209281 -1.024505 -0.797913 0.388611 -1.176345 -1.539268 0.339200 -1.330745 -1.948846 1.003088 -0.689711 1.470892 -1.745382 1.436061 -0.601182 -0.122790 -1.338131 -2.548329 0.967403 -0.689679 0.852465 -0.254633 -0.203474 0.400935 -0.205799 1.731119 -0.347658 1.083269 -2.698372 -1.556544 -0.057187 -1.649881 -1.342905 -1.386349 -0.667117 -0.661120 -0.016689 1.138259 -0.239577 -0.835845 -1.488313 -0.696471 0.380597 -0.258465 -0.908658 -0.153618 -0.073327 -1.374118 1.387623 -0.510052 -1.085437 -0.139478 -0.356522 0.909858 -0.415304 -0.415908 -1.345575 -0.119485 1.288113 -0.395319 0.506443 -0.297535 0.171644 0.018095 -0.920011 1.240597 -0.870062 1.294888 -1.923895 1.125795 1.800920 -0.659864 -0.002241 1.043479 0.304403 0.569511 1.028077 -0.829789 1.437960 -0.616307 -0.782107 0.699800 -2.269959 0.062267 1.133210 0.504484 -0.729145 -0.629003 0.137303 0.108697 -0.736281 -2.286749 -0.743823 2.327230 1.034739 2.144775 -1.280024 0.620501 -0.679361 -0.657106 -0.165976 -0.630152 0.596694 0.532060 -0.440452 -0.453451 0.874004 0.250757 0.949558 0.056344 0.492335 0.153994 0.952965 -0.102126 -0.161390 1.866228 -0.135027 1.400727 0.118350 -0.645697 -1.526176 1.019321 -0.879536 -0.043634 1.688972 1.140710 0.777593 -0.548029 0.435689 0.800756 1.418005 0.441178 0.604477 0.945842 1.425869 0.563570 1.145225 -0.063225 1.522945 -1.018064 -0.425646 1.371284 0.419989 -1.429276 -0.989560 -0.093676 0.248332 -0.387167 0.746269 0.438909 0.258594 -0.495158 0.153954 -0.531982 -0.277779 -1.098779 -1.297516 0.809073 0.385721 0.147442 -0.227634 -0.672064 2.565315 0.949324 -0.625492 0.851844 0.750971 0.697059 -0.814750 -0.253459 0.653883 -1.289133 1.064679 -0.022103 -1.227061 -0.843116 1.203997
vào 3.340981 -0.121912 0.904849 -0.869658 -0.495443 0.487522 0.253500 0.980476 2.882764 2.338039 0.991852 0.480020 1.395841 0.669330 -0.341171 0.124069 -0.329480 -2.543170 -0.120082 -1.573462 0.461010 1.640697 0.621611 1.957951 1.334099 -1.850633 0.546449 1.101645 0.099253 -1.075404 -1.541417 -0.285190 -2.136414 0.570613 -0.262237 -0.028249 -0.237954 2.637774 0.780413 0.034455 -0.944942 -0.814240 0.505421 0.381120 1.251104 3.831764 0.902930 1.095351 -0.160036 2.039441 -0.003153 0.935368 -0.622794 -0.341595 0.695066 -0.019116 -0.826735 2.137745 2.413198 -1.215278 0.610351 -0.104617 -0.154722 -0.116703 1.329193 -1.097945 0.343827 1.241170 -0.384076 -0.313725 1.099782 0.635599 1.767332 1.351923 0.823505 0.404529 1.654043 -1.259750 -1.322272 -0.144357 0.615107 -0.066396 -1.622124 -0.883178 1.283222 1.220424 -0.673880 0.855254 1.159685 0.829582 -0.516259 0.253369 0.390402 -0.439542 -0.119692 -2.094137 0.479947 1.808140 2.408065 0.213440 -0.471946 -0.982619 -2.053759 -0.227117 -0.046439 -0.601026 2.409773 0.370957 -0.902300 -2.247494 -0.356364 -1.520368 -2.064028 0.859022 1.589725 0.797564 -0.341406 -1.253125 0.083771 -0.032784 0.437397 -1.005696 0.621844 0.856378 -0.712542 -1.090578 0.258868 -1.687071 -1.145901 -0.782295 -0.040322 -2.103440 -0.494810 0.232279 0.488102 0.196010 -0.792673 1.127784 1.472520 -0.569525 -1.051131 1.515241 0.108787 2.671783 -1.459587 0.863173 1.199258 -2.445759 0.805810 -1.858540 2.770572 -1.886781 0.684569 0.639682 -0.368033 -1.044143 -1.327558 0.370759 1.098162 1.151325 1.384354 1.315455 -0.629159 -0.599189 -1.094460 0.399581 -0.469815 0.013439 -1.693498 0.302883 -2.274228 1.072217 0.844033 1.084239 -0.251378 -1.583346 -1.049931 0.987282 -0.433456 0.039499 -0.156172 0.931146 -0.520212 0.131009 -0.243592 -0.259311 -0.355196 1.116997 1.498041 -0.977126 1.330563 0.496640 -0.243665 0.956648 0.042585 -0.709408 -0.055619 0.810777 0.296688 1.542572 -2.139046 0.829429 -1.355402 0.854709 0.718390 -2.250743 -0.965554 0.881376 1.621213 0.445029 -0.793158 0.469438 -0.249344 0.980762 -0.895862 -1.020047 1.591186 1.071806 -0.785908 -1.464869 -1.766880 -1.437122 -2.237811 -0.538485 0.936591 1.428983 0.925872 -2.975323 0.345238 -0.439800 1.395311 -1.271024 0.066100 1.426577 0.356406 -0.291705 0.009142 0.540157 1.333679 0.305564 -0.695763 1.196196 -0.932713 -0.400046 -1.045106 -0.294490 0.158855 0.364858 1.887122 -1.046216 -0.861857 -0.823635 3.233763 0.140909 -0.227449 -2.140534 -0.328751 0.022854 1.852185 0.001774 0.345993 2.239976 1.552638 0.533034 0.692044 1.282736 0.101421 2.084293 0.581984 0.031500 0.128319 -1.878123 -0.899123 1.836749 1.499661 -0.915518 -0.190501 3.144739 -1.651089 0.857180 1.558972 -0.629007 0.499154 0.704157 -1.071290 0.997043 0.582292 -1.312419 0.182421 0.088478 0.179737 -0.407574 -0.902245 0.002136 1.063687 0.149913 2.574268 0.218964 -0.807096 0.818416
ngon -2.122801 -1.316182 -0.828862 -1.069710 0.525889 -0.462788 -0.205635 -1.091261 -0.237676 1.530812 -0.114967 0.030571 -0.212701 1.148447 0.650295 0.641448 -0.931656 0.525738 1.676775 -1.853146 -1.096086 1.232953 -0.393951 -2.186840 -0.321187 1.106558 0.322154 -1.132237 -0.346121 -1.329212 -0.447500 -0.349184 2.312442 0.596361 1.646733 0.418937 -1.961647 1.550265 -1.275221 1.380685 -0.454033 0.485528 0.407216 0.277091 0.133746 0.838622 0.129060 -0.204837 -1.938795 1.914206 -1.062885 1.151170 -0.466812 0.655587 0.245159 -0.777062 0.180666 -1.662321 -0.758602 0.542498 -0.180007 0.162358 1.411689 0.110858 -0.818797 -0.526453 -0.086451 0.911837 0.293182 -1.052873 0.138687 -0.365380 0.275480 0.973123 -0.015057 -2.605063 -0.159306 -0.731565 0.101261 0.413526 0.432225 2.496732 2.492160 2.460250 -0.865970 -1.208058 -0.569014 -0.863694 -0.280653 -0.602077 -1.413862 0.279325 -0.248777 1.676175 0.101790 -0.820906 -0.565732 -0.278743 0.903799 0.110722 -0.809227 -0.267652 1.099011 -1.222492 0.435381 0.383443 -0.271726 1.163907 -0.091579 -0.045844 -1.099937 -1.683164 -0.506844 -1.684490 1.530434 0.743513 0.707978 1.146233 0.044471 1.178260 0.044775 0.994711 -0.332661 0.315592 -1.484238 0.192458 0.108143 1.401966 -1.060994 -0.066511 0.850797 -0.694250 -0.702036 0.289037 -0.298086 -1.631991 -0.709109 -2.129760 -0.930590 0.357983 -1.699088 1.942114 -0.141763 1.273335 -0.978453 -0.812593 -0.555309 -0.220938 -1.867973 -1.895349 -1.061963 0.165448 0.485209 -0.318241 0.566602 0.873873 -2.711864 -0.106683 -0.045715 -0.453151 0.009666 -0.769884 -0.993601 -1.064528 0.031815 1.393767 0.893833 1.115432 1.587014 -0.288204 0.829512 1.948082 0.298157 -0.067243 0.245414 1.660602 0.160354 -0.280530 2.389873 1.075295 0.987979 -0.552263 -0.923218 -0.403670 0.823156 -0.099533 0.057880 1.039277 0.549933 -0.450989 -0.022004 -2.465148 -0.917063 -1.649054 -0.591186 1.302024 0.180109 -1.950194 0.759206 1.465634 -1.016040 -1.483257 0.473110 1.887749 0.576757 0.238967 1.109195 0.154962 -2.135750 -1.534662 -2.230100 0.446887 -0.420866 -0.518580 0.386338 -1.232424 0.778657 0.271378 2.157689 2.734990 0.899900 -0.039611 -0.766358 -0.531136 -1.831758 -1.084592 -0.178707 0.860010 1.169698 0.526206 -0.589258 0.585652 -0.372966 0.483639 2.123216 -0.301933 -0.812324 0.514607 -0.427384 0.839559 -0.808536 -0.397835 -0.164783 0.533297 0.375250 -0.634739 -0.807795 -1.642704 1.462491 -0.324168 -1.386113 -0.300527 -1.290108 0.309776 1.946129 -1.281730 0.537186 -0.260482 -0.476846 -1.225903 -1.862377 0.071075 -2.097581 -1.196115 0.634184 0.185174 0.047435 -1.537150 -0.075421 1.161742 -0.709898 -0.326025 -1.186387 -0.457796 -1.759402 0.270748 -0.208372 0.008637 0.583365 1.282130 0.504276 -1.323600 -0.433861 0.905599 0.386252 -0.643414 0.035163 -0.997821 0.823925 -0.125038 -0.654834 1.820342 -1.699343 0.958654 -2.549049 1.319319 -0.162909 -0.701954 -2.660087 0.458818

 

6. Kiểm tra mô hình VNW2V kết quả.

Để kiểm tra xem mô hình VNW2V được tạo ra có tốt hay không? Chúng ta cần visualize một tập các từ Tiếng Việt, và quan sát xem các từ có ý nghĩa tương đồng với nhau có thực sự gần nhau hơn so với các từ ít tương đồng hoặc ít liên quan hay không.

Để làm được điều đó, chúng tôi dùng file visual-word2vec.py như sau, trong đó, dùng 2 kỹ thuật là PCA để giảm số chiều không gian vector từ 300 xuống 2 chiều và kỹ thuật gom cụm hierarchy clustering để gom nhóm các từ có khoảng cách gần nhau.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import gensim.models as w2v
import sklearn.decomposition as dcmp
import numpy as np
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as hcluster
import re
import nltk
import sys

"""
Visualize Word2Vec
Word2vec + PCA + Clustering
"""
__author__ = "Aubry Cholleton"

path_model_w2v = '/path/to/model_bin/W2VModelVN.bin'

class SemanticMap:
    def __init__(self, model_path):
        print 'Loading model ...'
        self.model = w2v.Word2Vec.load_word2vec_format(model_path, fvocab=None, binary=True, encoding='utf8')
        print 'Ready'

    def __split_words(self, input_string):
        # return re.findall(r"[\w']+", input_string)
        return (input_string,)

    def __clean_words(self, words):
        clean_words = []
        for w in words:
            clean_words.append(w)
        return clean_words

    def __remove_stop_words(self, words):
        # return [w for w in words if not w in nltk.corpus.stopwords.words('english')]
        return words

    def __get_non_compositional_entity_vector(self, entity):
        print 'get_non_compositional_entity_vector: ', entity
        word = entity[0]
        print 'word: ', word
        ver_word = self.model[word]
        return ver_word

    def __get_compositional_entity_vector(self, entity):
        array = np.array(self.model[entity[0]])
        for ind in range (1, len(entity)):
            array = array + np.array(self.model[entity[ind]])
        return array/len(entity)

    def __get_vector(self, term):
        words = self.__remove_stop_words(self.__clean_words(self.__split_words(term)))

        if len(words) < 1:
            print 'All the terms have been filtered.'
            raise
        if len(words) == 1:
            try:
                return self.__get_non_compositional_entity_vector(words)
            except:
                print 'Out-of-vocabulary entity'
                raise
        elif len(words) < 4:
            try:
                return self.__get_compositional_entity_vector(words)
            except:
                print 'Out-of-vocabulary word in compositional entity'
                raise
        else:
            print 'Entity is too long.'
            raise

    def __reduce_dimensionality(self, word_vectors, dimension=2):
        data = np.array(word_vectors)
        pca = dcmp.PCA(n_components=dimension)
        pca.fit(data)
        return pca.transform(data)

    def cluster_results(self, data, threshold=0.13):
        return hcluster.fclusterdata(data, threshold, criterion="distance")

    def map_words(self, words, sizes):
        final_words = []
        final_sizes = []
        vectors = []

        for word in words:
            try:
                vect = self.__get_vector(word)
                vectors.append(vect)
                if sizes is not None:
                    final_sizes.append(sizes[words.index(word)])
                final_words.append(word)
            except Exception:
                print 'not valid ' + word

        return vectors, final_words, final_sizes

    def plot(self, vectors, lemmas, clusters, sizes=80):
        if sizes == []:
            sizes = 80
        plt.scatter(vectors[:, 0], vectors[:, 1], s=sizes, c=clusters)
        for label, x, y in zip(lemmas, vectors[:, 0], vectors[:, 1]):
            plt.annotate(
                label,
                xy = (x, y), xytext = (-20, 20),
                textcoords = 'offset points', ha = 'right', va = 'bottom',
                bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
                arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

        plt.show()

    def map_cluster_plot(self, words, sizes, threshold):
        vectors, words, sizes = self.map_words(words, sizes)
        vectors = self.__reduce_dimensionality(vectors)
        clusters = self.cluster_results(vectors, threshold)
        self.plot(vectors, words, clusters, sizes)

    def print_results(self, words, clusters):
        print words
        print clusters.tolist()

def cli(mapper_cli):
    while True:
        encoding = 'utf-8' if sys.stdin.encoding in (None, 'ascii') else sys.stdin.encoding
        line = raw_input('Enter words or MWEs > ').decode(encoding)
        if line == 'exit':
            break
        mapper_cli.map_cluster_plot(line.split(','), None, 0.2)

if __name__ == "__main__":
    mapper = SemanticMap(path_model_w2v)
    cli(mapper)

Các bạn cần chỉnh sửa lại biến path_model_w2v theo đúng đường dẫn thư mục chứa model w2v trên máy tính của bạn. Sau đó, chúng ta chạy ví dụ như sau:

python visual-word2vec.py
Enter words or MWEs > sông,hồ,núi,biển,trâu,bò,gà,chó,mèo,heo,vịt,Mặt_Trời,Trái_Đất,vì_sao,con_cái,bố,mẹ,vợ,chồng,anh,em

thì được kết quả như hình sau:

w2vvn

Quan sát hình trên thì ta thấy có 4 cụm như sau: [sông, hồ, núi, biển], [trâu, bò, gà, chó, mèo, heo, vịt], [Mặt_Trời, Trái_Đất, vì_sao], [con_cái, bố, mẹ, vợ, chồng, anh, em] cho thấy các từ tương đồng với nhau thì gần nhau hơn so với các từ ít tương đồng khác. Điều này cho thấy mô hình VNW2V mà chúng tôi thu được cũng tạm ổn.

Những vấn đề chi tiết hơn về cách sử dụng model Word2Vector được tạo bởi tool Gensim, các bạn có thể tham khảo thêm ở bài hướng dẫn này.

 

7. Tổng kết.

Trên đây, chúng tôi đã trình bày một số vấn đề xoay quanh cách tạo mô hình Word2Vector cho Tiếng Việt. Trong đó, có trình bày một kết quả mang tính thí nghiệm. Nếu muốn xây dựng ở mức độ công nghiệp hoàn chỉnh thì chúng ta cần một lượng lớn dữ liệu văn bản Tiếng Việt để có thể tạo ra mô hình VNW2V chất lượng hơn. Ví dụ, như trong Tiếng Anh, mô hình Word2Vector của nhóm nghiên cứu trong Google với kích thước vector là 300, được huấn luyện với hàng tỷ câu văn, thu được mô hình dạng binary với dung lượng lên đến 3.6GB.

Nếu có thắc mắc hoặc góp ý gì, các bạn có thể để lại bình luận ở bên dưới. Nếu bài viết này có ích cho bạn, thì bạn có thể like và share thoải mái.

Happy coding!!!

01h00AM, 14/02/2018

Our Team