我正在使用大量的Yelp评论数据集进行机器学习研究项目。 Gensim迄今为止运作良好,但是,当我用超过5,000,000个文档构建doc2vec.build_vocab()
的词汇表时...索引似乎全部被收集到一个64键的字典中(当然不应该是情况)。
下面是我为标记文档,构建词汇表和训练模型而制作的脚本。
import os
import time
import pandas as pd
import numpy as np
from collections import namedtuple
from gensim.models.doc2vec import Doc2Vec
from keras.preprocessing.text import text_to_word_sequence
# keras helper function
def text2_word_seq(review):
return text_to_word_sequence(review,
filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
lower=True, split=" ")
# instantiate the model
d2v = Doc2Vec(vector_size=300,
window=6, min_count=5, workers=os.cpu_count()-1)
chunksize = 5000
train_data = pd.read_json("dataset/review.json",
chunksize=chunksize,
lines=True)
Review = namedtuple('Review', 'words tags')
documents = list()
for i, data in enumerate(train_data):
print("Looked at %d chunks, %d documents" %
(i, i*chunksize), end='\r', flush=True)
users = data.user_id.values
for j, review in enumerate(data.text):
documents.append(Review(text2_word_seq(review), users[j]))
# build the vocabulary
d2v.build_vocab(documents.__iter__(), update=False,
progress_per=100000, keep_raw_vocab=False, trim_rule=None)
# train the model
d2v.train(documents, total_examples=len(documents), epochs=10)
d2v.save('d2v-model-v001')
保存模型并使用genim.models.Doc2Vec.load()
加载模型后,模型docvecs.doctags
的长度为64.我在构建词汇表时使用的每个标记都是用户ID。它不一定是唯一的,但有成千上万的用户(不是64个)。此外,标签显示为单个字符 - 这是不期望的......
>>> len(x.docvecs.doctags)
64
>>> x.docvecs.doctags
{'Y': Doctag(offset=27, word_count=195151634, doc_count=1727798),
'j': Doctag(offset=47, word_count=198241878, doc_count=1739169),
'4': Doctag(offset=17, word_count=195902251, doc_count=1728095),
'J': Doctag(offset=50, word_count=197884244, doc_count=1741666),
'W': Doctag(offset=41, word_count=198804200, doc_count=1741269),
'O': Doctag(offset=23, word_count=196212468, doc_count=1728735),
'o': Doctag(offset=9, word_count=194177928, doc_count=1709768),
'n': Doctag(offset=3, word_count=193799059, doc_count=1714620),
'3': Doctag(offset=34, word_count=197320036, doc_count=1725467),
'F': Doctag(offset=10, word_count=195614702, doc_count=1729058) ...
我在这里做错了什么?
答案 0 :(得分:1)
文本示例的tags
属性应该是标记列表。 (它可以是仅包含单个标记的列表,但必须是列表。)
如果你提供一个字符串,那对于期望lis的代码看起来就像是一个字符串的字符串。因此,您只会训练少量单字符标记,每个唯一字符一个,出现在您提供的任何tags
字符串中。