在找出文字相關詞(包含上下文、共同常出現的詞或同義詞)的時候,過往都是用人工編撰的詞典,想當然爾,精確度肯定很高,不過需要耗費大量人力,並且無法自動化。
Mikolov et al. (2013)於2013提出兩種模型架構來呈現字詞的向量,分別是skip-gram與continuous bag of words (CBOW),實驗結果顯示這兩個模型所訓練出來的300維度向量,均可有效找出語意相似與句型用法相似的詞彙。
步驟一: 安裝 Gensim
安裝 Gensim
pip install gensim |
看是安裝哪套套件管理系統,如果是pip3,指令就是 pip3 install gensim
安裝畫面如下:
上面的錯誤訊息不用理它,因為我有裝 tensorflow 2.3.0,這與 gensim無關。
步驟二: 輸入訓練資料
資料需要的格式是txt,並且是斷詞後的結果,斷詞方法請參考(斷詞教學請點我),內文如下範例:
它是把所有文字先串起來,然後開始斷詞,斷詞教學請點我,再把斷詞結果串起來當成輸入。
步驟三: gensim word2vector 訓練
#使用 Gensim 訓練模型
from gensim.models import word2vec
def w2vTrain():
# Settings
seed = 666
sg = 0
window_size = 10
vector_size = 100
min_count = 1
workers = 8
epochs = 5
batch_words = 10000
train_data = word2vec.LineSentence('wiki_text_seg.txt')
model = word2vec.Word2Vec(
train_data,
min_count=min_count,
vector_size=vector_size,
workers=workers,
epochs=epochs,
window=window_size,
sg=sg,
seed=seed,
batch_words=batch_words
)
model.save('word2vec.model')
if __name__ == '__main__':
w2vTrain()
參數說明
參數 |
說明 |
seed |
亂數種子 |
sg |
0: CBOW, 1: skip-gram, CBOW比skip-gram快 |
window_size |
周圍詞彙要看的範圍 |
vector_size |
轉成向量的維度 |
min_count |
詞頻少於 min_count 之詞彙不會參與訓練 |
workers |
同時訓練的數量 |
epochs |
訓練的迭代次數 |
batch_words |
每次給多少數量的詞彙進行訓練 |
步驟四: 測試模型效果
#測試模型效果
from gensim.models import word2vec
def test():
model = word2vec.Word2Vec.load('word2vec.model')
for item in model.wv.most_similar('高雄'):
print(item)
if __name__ == '__main__':
test()
結果如下:
從結果可看出,高雄的相似詞找到了其他地區的名稱。
最後,我是使用wiki 小的資料集進行訓練,要去哪裡抓,抓到要怎麼用,我會再撰文介紹。
留言列表