Gensim的基本使用
以下為之前在撰寫相關程式的隨筆紀錄。
模型的保存(save)與加載(load)
model.save()
保存的模型可以在讀取後進行再訓練(追加訓練)
model.load()
加載模型後,再進行訓練
# 訓練word2vec向量
model = Word2Vec(data, vector_size=200, epochs=10, sg=1, window=5, min_count=2)
# 保存模型,為了之後再訓練使用
# model.save("word2vec.model")
訓練後的詞向量,可以使用model.wv保存成KeyedVectors,已經完成模型的訓練(即不再進行模型的更新,僅僅是查詢),只能查詢,其他在訓練之類的皆不能使用
# 訓練後的詞向量,可以使用model.wv保存成KeyedVectors
# model.wv.save('model.wv')
什麼是Keyword vector
{str => 1D numpy array},把單字(Key)轉乘1D numpy array(bag_of_word)
把之前建立好的keyedVector載入(load)使用
wv = KeyedVectors.load("model.wv", mmap='r')
vec = wv['用心'] # 變成是一個numpy
print(type(vc))
print(vc.shape)
Output,得到一個200維向量。
為什麼是200維?
因為在建立Word2vec的時候,我們把這個詞袋設定為200維。下面的值帶表是他訓練出的結果值(這個部分可以再多做解釋)
如何查看特定單詞的向量(vector)為何?
words = list(wv.index_to_key)
print(words[0])
print(wv[words[0]])
print(wv[words[0]].shape)
Gensim中word2vec的使用
model = Word2Vec(data, vector_size=200, epochs=10, sg=1, window=5, min_count=2)
- vector_size: 設定詞向量大小
- epochs: 訓練的次數
- sg = 0時,用CBOW(Continuous Bag of word), sg = 1時以Skip-gram來訓練
- window: CBOW決定一次取多少詞來預測中間詞
- min_count: 出現次數大於等於min_count的詞,才納入採用
- max_vocab_size: 詞袋最多可以容納多少個詞
Gensim中LDA的使用
# Create a corpus from a list of texts
common_dictionary = Dictionary(data)# 把每一個整個文檔中的每一個文件都拿出來建立一個doc2bow
common_corpus = [common_dictionary.doc2bow(text) for text in data]# Train the model on the corpus.
lda = models.ldamodel.LdaModel(common_corpus, id2word=common_dictionary, num_topics=5)
topic_list = lda.print_topics(20)
print("10個主題的單詞分佈為:\n")
for topic in topic_list:
print(topic)
doc2bow(document, allow_update=False, return_missing=False)
- document (list of str) — Input document.
- allow_update (bool, optional) — Update self, by adding new tokens from document and updating internal corpus statistics.
- return_missing (bool, optional) — 把不在dictionary內的單字顯示出來。
from gensim.corpora import Dictionary
dct = Dictionary(["máma mele maso".split(), "ema má máma".split()])
dct.doc2bow(["this", "is", "máma"])
dct.doc2bow(["this", "is", "máma"], return_missing=True)
Output
說明:
(1) 建立的dictionary裡面含有5個元素
(2) 利用剛剛建立的dictionary轉換成bag_of_word得到,dictionary中index為2,其個數為1(也就是出現1次)
(3) 若後面參數添加return_missing=True
則會把不在dictionary內的單字顯示出來,後面也會標示出他出現的次數。
print_topics(num_topics=20, num_words=10)
- num_topics — 選擇要印出多少個Topic (ordered by significance).
- num_words — 準備要印出幾個字(依照重要程度排列)
for topic in topic_list:
print(topic)
回傳值:
list of (int, list of (str, float))
第一個參數,代表第幾個Topic, 之後的為str型態,包含str跟float的組合。
show_topic(topicid, topn)
- topicid (int) — The ID of the topic to be returned(第__個topic)
- topn (int, optional) —選擇「最重要」的前幾個數字
topic1 = lda.show_topic(0, 20)
回傳值:list of (str, float)的型態
以上,這類型的文章偏向,隨筆紀錄,方便未來的自己考古。