Cách tạo Word2Vec cho competition

nlp
aivivn
demo_nlp_contest
nlp-tiengviet

#1

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 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 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 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.

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
#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

#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),
 ('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: Call to deprecated `doesnt_match` (Method will be removed in 4.0.0, use self.wv.doesnt_match() instead).
'bảo_tàng'

Giới thiệu trang web AIviVN
#2

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