2016-03-01 65 views
7

我需要在使用gensim的推文上訓練word2vec表示。與我在gensim上看到的大多數教程和代碼不同,我的數據不是原始數據,而是已經過預處理。我在包含65k字(包括「未知」標記和EOL標記)的文本文檔中包含字典,並且將推文保存爲具有索引的numpy矩陣到本字典中。的數據格式的一個簡單的例子可以看出以下:Gensim word2vec在預定義詞典和詞索引數據

dict.txt

you 
love 
this 
code 

鳴叫(5是未知的,圖6是EOL)

[[0, 1, 2, 3, 6], 
[3, 5, 5, 1, 6], 
[0, 1, 3, 6, 6]] 

我不確定我應該如何處理指數表示。一個簡單的方法就是將索引列表轉換爲一個字符串列表(即[0,1,2,3,6] - > ['0','1','2','3','6 ']),因爲我將它讀入word2vec模型。然而,這必然是低效的,因爲gensim會嘗試查找用於例如'2'。

如何使用gensim以有效的方式加載這些數據並創建word2vec表示?

回答

7

正常方式gensim初始化Word2Vec模型[1]

model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) 

的問題是,什麼是sentencessentences應該是一個字/令牌迭代器的迭代器。它就像你擁有的numpy矩陣,但每一行可以有不同的長度。

如果你看看gensim.models.word2vec.LineSentence的文檔,它給你一種直接加載文本文件的方法。作爲提示,根據文件,它需要

一句=一行;單詞已經過預處理並由空格分隔。

當它表示words already preprocessed時,它指的是下部框,詞幹,停用詞過濾和所有其他文本清理過程。在你的情況下,你不希望56在你的句子列表中,所以你需要過濾它們。

考慮到你已經有numpy矩陣,假設每一行都是句子,最好將它轉換成二維數組並過濾掉所有的56。得到的二維數組可以直接用作sentences參數來初始化模型。唯一的問題是,當您想在訓練後查詢模型時,您需要輸入索引而不是令牌。

現在你有一個問題是,如果模型直接採用整數。在Python版本中,它不檢查類型,只是傳遞獨特的令牌。在這種情況下,你的獨特指數可以正常工作。但大多數情況下,您會希望使用C-Extended例程來訓練您的模型,這是一件大事,因爲它可以提供70倍的性能。 [2]我想在這種情況下,C代碼可能會檢查字符串類型,這意味着存在一個字符串到索引映射。

這是低效的嗎?我認爲不是,因爲你有的字符串是數字,通常比他們代表的真實記號短得多(假設它們是來自0的緊湊索引)。因此,模型的尺寸會更小,這樣可以節省模型的序列化和反序列化。您實質上已經將輸入令牌編碼爲較短的字符串格式,並將其與word2vec訓練分開,並且word2vec模型不需要也不需要知道在訓練之前發生了這種編碼。

我的理念是try the simplest way first。我只是將一個整數的示例測試輸入提交給模型,看看會出現什麼問題。希望能幫助到你。

[1] https://radimrehurek.com/gensim/models/word2vec.html

[2] http://rare-technologies.com/word2vec-in-python-part-two-optimizing/

+0

我可以確認我不能簡單地將整數輸入到模型中。正如原文中所述(可能不夠清楚),它只需將整數映射到字符串即可工作。 – pir

+0

出於好奇,你會如何濾除2D numpy數組中的'5'和'6'?每行應始終具有相同的大小。當遍歷矩陣將其提供給word2vec時,它可以完成,但這似乎效率很低。 – pir

1

我有同樣的問題。

>>> model = Word2Vec(arr_str) 
ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all() 

我的解決辦法是寫整數作爲文本的數組,然後使用word2vec與LineSentence:運行Word2Vec時甚至通過

>>> arr_str = np.char.mod('%d', arr) 

轉換爲字符串數組出現異常。

import numpy as np 
from gensim.models import Word2Vec 
from gensim.models.word2vec import LineSentence 

np.savetxt('train_data.txt', arr, delimiter=" ", fmt="%s") 
sentences = LineSentence('train_data.txt') 
model = Word2Vec(sentences)