iT邦幫忙

2021 iThome 鐵人賽

DAY 15
1
自我挑戰組

30天初步了解自然語言處理-自學筆記系列 第 15

[Day15] 文本/詞表示方式(五)-實作word2vec

  • 分享至 

  • xImage
  •  

一. gensim

gensim是一個 NLP 的函式庫,他不只可以訓練word2vec這樣的語言模型,像是doc2vec或是其他的詞向量模型,如 Glove 與 FastText,他都提供支援訓練與加載。再找尋最接近的詞彙時這個套件已經幫你寫好許多function了~不用再自己刻了~

聽說gensim也有一些主題模型算法(沒實際試過XD),透過文章中使用非監督方式,找出這些文章中蘊藏的主題,例如: 潛在語義分析(Latent Semantic Analysis,LSA),隱含狄利克雷分布(Latent Dirichlet Allocation,LDA,sklearn也有提供唷),可以說是滿方便的套件包~~

二. 資料集

資料集的部份我會以[Day5] 語言模型(二)-N-gram實作提到的小型維基資料'wiki_zh_small.txt'做測試,但因這個資料集過少效果不太好,建議還是下載維基百科的原始資料做測試比較好

三. 實作

  • 引入套件,讀取wiki_zh_small.txt,並斷詞寫入wiki_zh_small_write.txt中
import jieba
import re

# 載入繁體
jieba.set_dictionary('dict.txt.big')
doc_seg = []

with open('wiki_zh_small.txt', 'r', encoding='utf-8') as file:
    text = file.readline()
    text = re.sub('[^\u4e00-\u9fa5]+','',text)
    doc_seg.append(jieba.lcut(text))

with open('wiki_zh_small_write.txt', 'w', encoding='utf-8') as file:
    for doc in doc_seg:
        file.write(' '.join(doc))
  • 訓練word2vec 模型,比較注意的是sg與window這2個參數,透過model.save存成model
from gensim.models import word2vec
import gensim

# sg=1 -> skip-gram, sg=0 -> cbow
sg = 0
# 向前看幾個字或向後看幾個字
win_size = 2
# 向量維度
vector_size = 300
epochs = 10

sentences = word2vec.LineSentence("wiki_zh_small_write.txt")
model = word2vec.Word2Vec(
    sentences, 
    size=300, 
    window=win_size, 
    sg=sg, 
    min_count=1,
    iter=epochs)

model.save('word2vec.model')
  • 重新載入model 使用gensim的models.Word2Vec.load即可
et_model = gensim.models.Word2Vec.load("word2vec.model")
  • 察看詞向量,以'英國'為例,會output出300維的陣列:
# 列出向量
et_model['英國']

# output: array([-1.51791237e-03, -3.60449805e-04,  2.07644841e-03,  7.61964708e-04,
#       -1.00428076e-03, -1.97989779e-04, -5.39847766e-04, -1.21438294e-03,...]
  • 找出最相近的詞使用most_similar:
# 顯示最相近的字彙
et_model.most_similar(['英國'])
  • 最相近的反義詞的詞彙使用most_similar,並增加positive與negative參數,這類似於英國之於倫敦等於法國之於什麼(資料量多的話應該要能找出巴黎這個詞彙XD):
# 顯示最相近的反義詞的詞彙
et_model.most_similar(positive=['英國', '倫敦'], negative=['法國'], topn=20)
  • 計算相似程度用wv.similarity即可,記得沒錯的話他是使用cosine similarity:
et_model.wv.similarity('英國', '法國')

接下來會介紹nn, Sequence model等現代比較長聽到的NLP模型~


上一篇
[Day14] 文本/詞表示方式(五)-word2vec
下一篇
[Day16] NLP會用到的模型(一)-前言
系列文
30天初步了解自然語言處理-自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言