本文关于在gensim中如何使用word2vec
准备输入(Preparing the Input)
从一开始,gensim的word2vec把语句序列作为它的输入(即文本);每一个语句就是一个单词序列;
# import modules & set up logging
import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = [['first', 'sentence'], ['second', 'sentence']]
# train word2vec on the two sentences
model = gensim.models.Word2Vec(sentences, min_count=1)
把输入当作一个Python内置列表很方便,但当输入量很大的时候,大会占用大量内存时。
Gensim需要输入提供顺序的语句,当迭代结束,没有必要把一切东西都保存在内存中:我么能够提供一个语句,处理它,忘记它,加载另一个语句;
例如,如果我们的输入分散在磁盘中的几个文件夹下,每一个语句占据一行。我们就不用加载所有的数据到内存;我们就可以一个文件接着一个文件、一行接着一行进行处理;
class MySentences(object):
def __init__(self, dirname):
self.dirname = dirname
def __iter__(self):
for fname in os.listdir(self.dirname):
for line in open(os.path.join(self.dirname, fname)):
yield line.split()
sentences = MySentences('/some/directory') # a memory-friendly iterator
model = gensim.models.Word2Vec(sentences)
假如我们想要进一步预处理文件中的单词,例如转换到Unicode,变换成小写,移除数字,提取命名实体… 所有的这些都可以在MySentences 迭代器内进行,不需要让word2vec获知。所要知道的仅仅是输入产生一个语句接着一个语句;
高级用户注意:
调用Word2Vec(sentences,iter = 1)
将使语句迭代器运行两遍(一般情况,是iter+1遍;默认iter= 5 )。第一次迭代收集单词和统计单词的频率来构建一个内部的词典树结构;第二次迭代以及之后的迭代用来训练神经模型。这两次迭代能够被人工的的初始化,以防输入流是不可重复的,你只能使用其他的方式进行初始化词典;
model = gensim.models.Word2Vec(iter=1) # an