我正在嘗試訓練 Word2Vec 模型。當我嘗試直接從 Series 訓練模型時,一切都很好,但是當我將 DataFrame 保存到 csv 然后打開它時,我遇到了問題。
data = pd.read_csv('test.txt', sep='\r\n', names=['input'], engine="python")
data = data.dropna().drop_duplicates()
data = data['input'].iloc[:1000].apply(lemmatize)
print(data)
所以我得到了這個系列:
0 [two, households, alike, dignity]
1 [in, fair, verona, lay, scene]
2 [from, ancient, grudge, break, new, mutiny]
3 [where, civil, blood, makes, civil, hands, unc...
4 [from, forth, fatal, loins, two, foes]
...
1152 [and, therefore, thou, mayst, think, havior, l...
1153 [but, trust, gentleman, i, prove, true]
1154 [than, coying, strange]
1155 [i, strange, i, must, confess]
1156 [but, thou, overheard, st, ere, i, ware]
Name: input, Length: 911, dtype: object
當我嘗試直接從這個系列訓練 Word2Vec 時,一切都很好:
w2v_model = Word2Vec(
min_count=10,
window=2,
vector_size=300,
negative=10,
alpha=0.03,
min_alpha=0.0007,
sample=6e-5,
sg=1)
w2v_model.build_vocab(data)
w2v_model.train(data, total_examples=w2v_model.corpus_count, epochs=30, report_delay=1)
print(w2v_model.wv.key_to_index)
{'i': 0, 'thou': 1, 'and': 2, 'love': 3, 'romeo': 4, 'shall': 5, 'what': 6, 'fair': 7, 'thee': 8, 'but': 9, 'to': 10, 'thy': 11, 'tis': 12, 'the': 13, 'come': 14, 'o': 15, 'night': 16, 'a': 17, 'sampson': 18, 'that': 19, 'capulet': 20, 'montague': 21, 'servingman': 22, 'good': 23, 'gregory': 24, 'one': 25, 'lady': 26, 'my': 27, 'go': 28, 'he': 29, 'nurse': 30, 'she': 31, 'you': 32, 'let': 33, 'would': 34, 'well': 35, 'say': 36, 'sir': 37, 'this': 38, 'for': 39, 'enter': 40, 'old': 41, 'take': 42, 'ay': 43, 'hath': 44, 'benvolio': 45, 'of': 46, 'tell': 47, 'art': 48, 'mercutio': 49, 'know': 50, 'by': 51, 'light': 52, 'see': 53, 'eyes': 54, 'juliet': 55, 'er': 56, 'must': 57, 'word': 58, 'name': 59, 'man': 60, 'men': 61, 'wilt': 62, 'nay': 63, 'peace': 64, 'much': 65, 'it': 66, 'yet': 67, 'house': 68, 'upon': 69, 'which': 70, 'as': 71, 'doth': 72, 'think': 73, 'in': 74}
但是當我嘗試將 DataFrame 保存到 csv 然后打開它并訓練 Word2Vec 時,我得到了這個:
data = pd.read_csv('test.txt', sep='\r\n', names=['input'], engine="python")
data = data.dropna().drop_duplicates()
data = data['input'].iloc[:1000].apply(lemmatize)
data = data.dropna()
data.to_csv('test.csv', index=False)
data = pd.read_csv('test.csv')['input']
w2v_model = Word2Vec(
min_count=10,
window=2,
vector_size=300,
negative=10,
alpha=0.03,
min_alpha=0.0007,
sample=6e-5,
sg=1)
w2v_model.build_vocab(data)
w2v_model.train(data, total_examples=w2v_model.corpus_count, epochs=30, report_delay=1)
print(w2v_model.wv.key_to_index)
{"'": 0, ',': 1, ' ': 2, 'e': 3, 'a': 4, 't': 5, 'o': 6, 's': 7, 'r': 8, 'i': 9, 'n': 10, 'h': 11, 'l': 12, ']': 13, '[': 14, 'd': 15, 'u': 16, 'm': 17, 'g': 18, 'c': 19, 'w': 20, 'y': 21, 'p': 22, 'f': 23, 'b': 24, 'v': 25, 'k': 26, 'j': 27, 'q': 28, 'x': 29, 'z': 30}
開封后系列:
0 ['two', 'households', 'alike', 'dignity']
1 ['in', 'fair', 'verona', 'lay', 'scene']
2 ['from', 'ancient', 'grudge', 'break', 'new', ...
3 ['where', 'civil', 'blood', 'makes', 'civil', ...
4 ['from', 'forth', 'fatal', 'loins', 'two', 'fo...
...
906 ['and', 'therefore', 'thou', 'mayst', 'think',...
907 ['but', 'trust', 'gentleman', 'i', 'prove', 't...
908 ['than', 'coying', 'strange']
909 ['i', 'strange', 'i', 'must', 'confess']
910 ['but', 'thou', 'overheard', 'st', 'ere', 'i',...
Name: input, Length: 911, dtype: object
可能是什么問題呢?
uj5u.com熱心網友回復:
首先,為了便于參考/比較,命名來自不同于原始資料的不同位置的變數會有所幫助。
例如,而不是將保存的資料加載為...
data = pd.read_csv('test.csv')['input']
...給它一個獨特的名字:
data_from_csv = pd.read_csv('test.csv')['input']
然后,檢查您的原始Series data和以后是否data_from_csv實際上看起來與可迭代語料庫的每個專案中完全相同型別的物件相同,以Word2Vec.
例如,要查看每個可迭代物件中的第一項,請查看:
print(next(iter(data)))
……也為了比較……
print(next(iter(data_from_csv)))
如果這些不相同,那么您的第二個data_from_csv案例沒有顯示Word2Vec相同型別的語料庫。特別是,Word2Vec訓練語料庫中的每個單獨的文本項都應該是單獨的字串標記的 Python串列。
如果您只傳遞字串,它會看到該字串中的每個單獨專案(單個字符),就好像它們是字串標記一樣,導致您描述的問題:所有模型的已知單詞都是單字符。
(您確定在第二次運行時沒有在日志/控制臺輸出中看到警告嗎?該.build_vocab()步驟檢查語料庫中的第一項是否是純字串,而不是正確的串列,并且列印警告。)
確保執行以下一項或多項:
(1) 將 CSV 寫入以空格分隔的文本 - 而不是 Pythonlist文字 - 然后在 CSV 讀取原始字串后重新.split()寫入串列;或者
(2) 將 CSV 撰寫為 Python 串列文字——例如,使用括號和字串參考——但是,在將這些文字加載為原始字串之后,將它們解釋為 Python 物件(就像使用 a 一樣eval())以將它們轉換回串列-代幣
然后,您要輸入的語料庫Word2Vec將采用正確的格式來獲取預期的單個單詞。(上面的選項(1)通常是首選方法:空格分隔的字串是一種更簡單/更安全/更快的格式,以便以后重新決議/拆分,沒有風險并且eval()可能運行意外代碼。)
(作為一個完全獨立的問題:使用奇怪的非默認值alpha=0.03, min_alpha=0.0007通常表明您正在遵循一個糟糕的教程,這是無緣無故地更改了這些。這樣的更改不太可能對您的結果造成太大的傷害或幫助 - 這只是一個奇怪的和不必要的選擇暗示隨機猜測和不假思索的復制而不是真正的理解。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531543.html
上一篇:OpenGL ES EGL eglDestroySurface
下一篇:Java組合異步編程(2)
