Medium blog: https://medium.com/@dogterbox/ลองทำ-word-spelling-correction-ด้วย-char2vec-6167430492bc
Load corpus: PyThaiNLP thai word corpus
from pythainlp.corpus import thai_words
import numpy as np
words = thai_words()
words = np.array(list(words)) # to array
print('Number of vocabs: ', len(words))
Number of vocabs: 62847
print(words[:10]) # sample
['กระจาว' 'ลูกเมียหลวง' 'ปุลินท์' 'ล่วงเวลา' 'คุยหรหัสย์' 'คู่สามีภรรยา'
'มรสุม' 'ดีนาคราช' 'จานเจือ' 'ข้อบังคับของบริษัท']
Convert array to string separate by '\n'
words_str = '\n'.join(words)
print(words_str[:100]) # sample
กระจาว
ลูกเมียหลวง
ปุลินท์
ล่วงเวลา
คุยหรหัสย์
คู่สามีภรรยา
มรสุม
ดีนาคราช
จานเจือ
ข้อบังคับของบริษั
Convert string to char
words_char = list(words_str)
print(words_char[:100]) # sample
['ก', 'ร', 'ะ', 'จ', 'า', 'ว', '\n', 'ล', 'ู', 'ก', 'เ', 'ม', 'ี', 'ย', 'ห', 'ล', 'ว', 'ง', '\n', 'ป', 'ุ', 'ล', 'ิ', 'น', 'ท', '์', '\n', 'ล', '่', 'ว', 'ง', 'เ', 'ว', 'ล', 'า', '\n', 'ค', 'ุ', 'ย', 'ห', 'ร', 'ห', 'ั', 'ส', 'ย', '์', '\n', 'ค', 'ู', '่', 'ส', 'า', 'ม', 'ี', 'ภ', 'ร', 'ร', 'ย', 'า', '\n', 'ม', 'ร', 'ส', 'ุ', 'ม', '\n', 'ด', 'ี', 'น', 'า', 'ค', 'ร', 'า', 'ช', '\n', 'จ', 'า', 'น', 'เ', 'จ', 'ื', 'อ', '\n', 'ข', '้', 'อ', 'บ', 'ั', 'ง', 'ค', 'ั', 'บ', 'ข', 'อ', 'ง', 'บ', 'ร', 'ิ', 'ษ', 'ั']
Save data to words-char.txt file
with open('words-char.txt', mode='w', encoding='utf-8') as file:
file.write(' '.join(words_char))
Using FastText traing Word2Vec model on character level
import fasttext
Load file and model training
model = fasttext.train_unsupervised('words-char.txt', epoch=200, ws=3)
print('Number of char: ', len(model.words))
Number of char: 73
Create word vector on character level model
words_vec = [model.get_sentence_vector(' '.join(list(word))) for word in words]
words_vec = np.array(words_vec)
Using nearest neighbors model to find word similarity for get word suggestion
Model training
- X: word vector
- y: word/vocab
from sklearn.neighbors import NearestNeighbors
import numpy as np
X, y = words_vec, words
nbrs = NearestNeighbors().fit(X, y)
import joblib
model.save_model('char2vec.bin') # fasttext model
joblib.dump(words, 'words.joblib')
joblib.dump(nbrs, 'nbrs.joblib');
import fasttext
import joblib
model = fasttext.load_model('char2vec.bin')
words = joblib.load('words.joblib')
nbrs = joblib.load('nbrs.joblib')
words_input = ['การบด้าน', 'สวัดี', 'vออกเลอร์', 'ปละเทศไทยย', 'อรอย']
word_input_vec = [model.get_sentence_vector(' '.join(list(word))) for word in words_input]
indices = nbrs.kneighbors(word_input_vec, 5, False) # n_neighbors is 5
suggestion = words[indices]
for w, s in zip(words_input, suggestion):
print(f'{w} \n---> {s}')
การบด้าน
---> ['การบ้าน' 'หยาบกร้าน' 'หน้ากระดาน' 'การอาบน้ำ' 'กลับด้าน']
สวัดี
---> ['สวัสดี' 'วสวัดดี' 'วิดัสดี' 'ดบัสวี' 'วนัสบดี']
vออกเลอร์
---> ['ล็อกเกอร์' 'เดอะรอยัลกอล์ฟ' 'ล็อคเกอร์' 'ออยเลอร์' 'อาร์เซนอล']
ปละเทศไทยย
---> ['ประเทศไทย' 'การปิโตรเลียมแห่งประเทศไทย' 'ไปรษณีย์ลงทะเบียน' 'ลายเทศ'
'ประเทศอินเดีย']
อรอย
---> ['รอย' 'อร่อย' 'รอคอย' 'รอยต่อ' 'ร่องรอย']
!jupyter nbconvert --to markdown char2vec_spelling_correction.ipynb
[NbConvertApp] Converting notebook char2vec_spelling_correction.ipynb to markdown
[NbConvertApp] Writing 3587 bytes to char2vec_spelling_correction.md