簡體   English   中英

訓練自定義 word2vec 模型

[英]training custom word2vec model

我有自己的數據集,我想在其中使用 gensim word2vec 進行訓練,但我不知道該怎么做。

from google.colab import files
import io
uploaded = files.upload()
data_path = 'chatbot_dataset.txt'
with open(data_path, 'r') as f:
    lines = f.read().split('\n')

for line in lines:
    input_text = line.split('\t')[0]
    if len(input_text.split()) > MAX_SENTENCE_LENGTH:
      break
    target_text = '<START> ' + line.split('\t')[1] + " <END>"
    input_texts.append(input_text)
    target_texts.append(target_text)

model = Word2Vec(lines, min_count=1,workers=3,size=100,window=3,sg=1)
model.wv.get_vector('hello')

但是我在執行此操作時遇到此錯誤,即使“你好”這個詞已經在我的數據集中:

KeyError                                  Traceback (most recent call last)
<ipython-input-15-b41c8cb17d3b> in <module>()
    140 model.wv.vector_size
    141 #check out how 'PEM' is represented in an array of 100 numbers
--> 142 model.wv.get_vector('hello')
    143 #find words with similar meaning to 'PEN'
    144 model.wv.most_similar('to')

1 frames
/usr/local/lib/python3.7/dist-packages/gensim/models/keyedvectors.py in word_vec(self, word, use_norm)
    450             return result
    451         else:
--> 452             raise KeyError("word '%s' not in vocabulary" % word)
    453 
    454     def get_vector(self, word):

KeyError: "word 'hello' not in vocabulary"

您正在向Word2Vec提供lines ,它似乎是一個純字符串列表。

Word2Vec期望的是一個可重復迭代的項目序列,其中每個項目都是一個預先標記化的字符串列表。 通過向它傳遞一個純字符串序列,當Word2Vec將一個字符串解釋為一個列表時,它會將其視為一個單字符列表——因此它學習的整個“單詞”集將只是單字符。 (您的日志中可能有關於此的警告,或者如果您至少使用 INFO 日志記錄運行,進度報告顯示發現的唯一單詞的數量非常少。)

您可以通過檢查model.wv.index_to_key來查看模型的詞匯model.wv.index_to_key - 例如,查看print(model.wv.index_to_key[:10]找到的 10 個最常見的單詞。如果沒有對,請確保您正確預處理/標記您將提交給Word2Vec的語料庫。

另外: min_count=1對於Word2Vec從來都不是一個好主意。 只有具有多個不同用法示例的詞才能獲得有用的詞向量,並且通常會丟棄最稀有的詞,如默認min_count=5 ,確保所有幸存詞的最佳質量向量。 (如果有少於 5 個用法示例的單詞需要向量,最好的方法是獲取更多不同用法的訓練數據。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM