一. 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'做測試,但因這個資料集過少效果不太好,建議還是下載維基百科的原始資料做測試比較好
三. 實作
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))
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')
et_model = gensim.models.Word2Vec.load("word2vec.model")
# 列出向量
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,...]
# 顯示最相近的字彙
et_model.most_similar(['英國'])
# 顯示最相近的反義詞的詞彙
et_model.most_similar(positive=['英國', '倫敦'], negative=['法國'], topn=20)
et_model.wv.similarity('英國', '法國')
接下來會介紹nn, Sequence model等現代比較長聽到的NLP模型~