Gensim的基本使用

Sharon Peng
6 min readJan 14, 2025

--

以下為之前在撰寫相關程式的隨筆紀錄。

模型的保存(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)的型態

以上,這類型的文章偏向,隨筆紀錄,方便未來的自己考古。

--

--

Sharon Peng
Sharon Peng

No responses yet