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:
Sơ đồ huấn luyện Word2Vector Tiếng Việt:
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 --
Word2Vector có 2 loại kiến trúc Continuous Bag-of-Words (CBOW) và Skip-gram như sau:
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.
Để đ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:
Để tạo được mô hình Word2Vector chất lượng cao ta cần chú ý đến các yếu tố sau:
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:
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
Để 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:
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.
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