You are on page 1of 4

8/26/2019 Cách tạo Word2Vec cho competition - AIviVN - Diễn đàn Machine Learning cơ bản

Home Blog Facebook Page Facebook Group Interactive Learning Competition

Cách tạo Word2Vec cho competition


nlp aivivn nlp-tiengviet demo_nlp_contest

Duc_Nguyen Th02 13
Th02 13
Cuộc thi đầu tiên sẽ giải quyết 1 bài toán trong NLP. Để có thể tạo Word2Vec trong các bài toán NLP sẽ có rất nhiều
1/2
cách làm, mình xin giới thiệu cách sử dụng thư viện deepai-solution . Với thư viện này, bạn chỉ cần khoảng 10 dòng
Th02
code sẽ thực hiện đầy đủ các bước từ Collect dữ liệu => Tiền xử lý dữ liệu => Training model. Các bạn có thể tham
14
khảo thêm các bài viết của thư viện này tại link:

1. [VNLP Core] [1] Bài toán tách từ tiếng Việt - Tokenization, Word Segmentation

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

3. [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)

Xây dựng Word2Vec


Ý tưởng đằng sau Word2Vec khá đơn giản. Word2Vec giả định rằng bạn có thể chỉ ra nghĩa của một từ bởi những từ
xung quanh. Điều này tương tự như câu nói cho tôi thấy bạn bè của bạn và tôi sẽ nói bạn là ai. Vì vậy, nếu bạn có hai
từ có hàng xóm rất giống nhau (nghĩa là bối cảnh sử dụng gần giống nhau), thì những từ này có thể khá giống nhau về
nghĩa hoặc ít nhất có liên quan cao. Th02 14

Import thư viện

from deepai_nlp.wikicrawler.wiki_bs4 import WikiTextCrawler


from deepai_nlp.tokenization.crf_tokenizer import CrfTokenizer
from deepai_nlp.tokenization.utils import preprocess_text
from deepai_nlp.word_embedding import word2vec_gensim

1. Xây dựng bộ dữ liệu raw text để training word2vec


Dữ liệu raw text có thể kiếm từ rất nhiều nguồn, (báo chí, wiki, tài liệu internet, …). Dữ liệu text càng nhiều thì bộ
word2vec càng phong phú từ vựng, mối quan hệ giữa các từ càng chặt chẽ và nhất quán. Bài tutorial dưới đây sẽ chỉ
cho bạn cách xây dựng 1 bô dữ liệu raw text của riêng mình từ wikipedia

1.1 Crawl wiki raw text


Package wikicrawler của thư viện deepai_nlp hỗ trợ tìm kiếm links các bài viết wikipedia theo từ khóa, và sau đó
crawl về local drive dưới dạng text.
Cách sử dụng:

crawler = WikiTextCrawler() #Khởi tạo object


keywords = ['chó', 'mèo', 'gà', 'chuột'] #list từ khóa
url_list = []

#Tìm kiếm links bài viết từ keyword


for kw in keywords:
urls = crawler.search(kw)
url_list += urls
https://forum.machinelearningcoban.com/t/cach-tao-word2vec-cho-competition/4238 1/4
8/26/2019 Cách tạo Word2Vec cho competition - AIviVN - Diễn đàn Machine Learning cơ bản

#Crawl bài viết về thành file text


for url in url_list:
crawler.write_text(output_file='raw_wiki.txt', url=url, mode='a')

File text giờ đã nằm ở local drive của bạn:

with open('raw_wiki.txt', 'r') as f:


document = f.readlines()
document

[‘Chó hay Chó nhà (Danh pháp khoa học: Canis lupus familiaris hoặc Canis familiaris;[3]) từ Hán Việt gọi là “cẩu” (狗)
hoặc “khuyển” (犬), chó con còn được gọi là “cún”, là một loài động vật thuộc chi Chó (Canis), tạo nên một phần tiến
hóa của sói,[4] đồng thời là loài động vật ăn thịt trên cạn có số lượng lớn nhất.[5][6][7][8][9] Chó và sói xám thuộc
nhóm chị em,[10][11][12] giống như những loài sói hiện đại đều không có họ hàng gần đến những loài sói được thuần
hóa đầu tiên,[11][12] đồng nghĩa với tổ tiên tiên trực tiếp của loài chó đã bị tuyệt chủng.\n’,

1.2 Tiền sử lý trước khi training


Trước khi có thể đưa dữ liệu vào training, ta cần 1 vài bước tiền xử lý:

Tokenization: Hay còn gọi là tách từ. Ví dụ: ô tô > ô-tô, xe máy > xe-máy, tàu hỏa > tàu-hỏa. Tiếng việt bao gồm
rất nhiều từ kép nên thuật toán tách từ là cần thiết để extract các từ trong 1 câu
Cleaning: Dữ liệu raw text lấy từ trên mạng (bao gồm wiki) thường chưa được qua xử lý cơ bản, như là chuyển
về 1 dạng viết hoa hoặc viết thường, hay bỏ đi kí tự đặc biệt (;’’[*-), v.v

Package utils của thư viện deepai_nlp hỗ trợ các bước tiền xử lý trước khi training

# Preprocess and tokenize


tokenizer = CrfTokenizer()
documents = preprocess_text(document, tokenizer=tokenizer) # Tách từ và clean

Sau bước tiền xử lý, biến documents trả về là 1 list of list. list trong chứa các từ của 1 câu đã được tách.

documents[0:1]
[['chó',
'hay',
'chó',
'nhà',
'danh_pháp',
'khoa_học',

2. Trainning mô hình Word2Vec


Training mô hình Word2Vec khá đơn giản. Ta chỉ cần pass biến documents vào trong hàm Word2Vec của gensim và
điều chỉnh các tham số cho phù hợp

model = word2vec_gensim.Word2Vec (documents, size=100, window=5, min_count=5, workers=1, sg=1)


model.train(documents,total_examples=len(documents),epochs=10)

3. Load và save model

Save model

https://forum.machinelearningcoban.com/t/cach-tao-word2vec-cho-competition/4238 2/4
8/26/2019 Cách tạo Word2Vec cho competition - AIviVN - Diễn đàn Machine Learning cơ bản

#save model
wv_path = "word2vec.model"
model.wv.save(wv_path)

Load model

model = word2vec_gensim.load_model(wv_path)

4. Nhìn vào 1 vài kết quả

#List từ vựng
print(list(model.wv.vocab.keys()))

[‘chó’, ‘hay’, ‘nhà’, ‘khoa_học’, ‘canis’, ‘hoặc’, ‘từ’, ‘việt’, ‘gọi’, ‘là’, ‘con’, ‘còn’, ‘được’, ‘một’, ‘loài’, ‘động_vật’, ‘thuộc’,
‘tạo’, ‘nên’, ‘phần’, ‘của’, ‘đồng_thời’, ‘ăn’, ‘thịt’, ‘trên’, ‘có’, ‘số_lượng’, ‘lớn’, ‘nhất’, ‘và’, ‘nhóm’, ‘giống’, ‘như’, ‘những’,
‘hiện_đại’, ‘đều’, ‘không’, ‘gần’, ‘đến’, ‘thuần’, ‘hóa’, ‘với’, ‘tổ_tiên’, ‘trực_tiếp’, ‘đã’, ‘bị’, ‘cũng’, ‘đầu_tiên’, ‘con_người’,
‘thuần_hóa’

#Vector từ
model.wv['chó']
array([ 0.20996837, 0.04672969, 0.00612796, 0.10199189, 0.04284383,
0.06607222, -0.1570471 , -0.17777094, -0.13899504, -0.01372842,
-0.21414748, 0.24360956, 0.01670834, -0.00325496, -0.03942877,
0.01755704, 0.17473657, -0.23018128, 0.13549541, 0.09249159,
-0.00291212, -0.00125661, -0.06004395, -0.13341445, 0.11695279,
-0.07453852, 0.08257555, -0.00146314, 0.01376373, -0.02390479,
0.0421804 , -0.1471466 , 0.21114528, 0.2995382 , -0.06037546,
0.13958058, 0.12674932, 0.04225145, 0.11973551, -0.14360334,
-0.10694928, 0.01727156, 0.01924986, -0.07421874, 0.13023627,
-0.08312937, -0.13161008, 0.10784628, 0.15758684, 0.30760977,
0.11130455, -0.13162369, 0.11192392, -0.18748467, 0.01672681,
-0.09154139, -0.02551542, 0.0651836 , -0.13973272, -0.22617346,
0.15125474, -0.03153753, -0.04918195, 0.08599582, -0.09493273,
0.04014187, 0.0342055 , 0.02524309, 0.0828172 , -0.04834145,
0.08600103, 0.00285071, 0.15018648, -0.02649451, 0.11961257,
0.20582223, 0.07405726, -0.00093391, -0.10374855, -0.12769628,
-0.13743363, 0.12404515, 0.08176704, 0.12254485, 0.1331983 ,
0.00812968, 0.18412521, 0.1789782 , 0.04082415, -0.22863714,
0.11160092, 0.01334421, -0.01423964, 0.04715665, -0.17925018,
0.10887058, 0.04342718, 0.1345251 , 0.05599089, -0.00842899],
dtype=float32)

4.2 Độ tương đồng giữa các từ

w1 = "chó"
model.wv.most_similar (positive=w1)
[('theo', 0.9904715418815613),
('động_vật', 0.987595796585083),
('với', 0.9871902465820312),
('con_người', 0.9870010614395142),
('chó_sói', 0.9852592945098877),
https://forum.machinelearningcoban.com/t/cach-tao-word2vec-cho-competition/4238 3/4
8/26/2019 Cách tạo Word2Vec cho competition - AIviVN - Diễn đàn Machine Learning cơ bản

('loài', 0.9851824641227722),
('nhóm', 0.9846805334091187),
('canis', 0.9841712713241577),
('nhất', 0.9840019941329956),
('mèo', 0.9833053946495056)]

4.3 Độ tương đồng giữa 2 từ

# similarity between two different words


model.wv.similarity(w1="gà",w2="chuột")
0.88648254

# similarity between two identical words


model.wv.similarity(w1="gà",w2="gà")
0.99999994

4.4 Tìm từ không giống các từ còn lại

# Which one is the odd one out in this list?


model.doesnt_match(["gà","lợn","bảo_tàng"])
/home/duke/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: DeprecationWarning: Ca
'bảo_tàng'

Giới thiệu trang web AIviVN

nguyenvanhieu.vn Th02 14

Cảm ơn bài chia sẻ bổ ích của anh ạ

https://forum.machinelearningcoban.com/t/cach-tao-word2vec-cho-competition/4238 4/4

You might also like