【问题标题】:python error:" 'numpy.ndarray' object has no attribute 'words' " when training doc2vecpython错误:“'numpy.ndarray'对象没有属性'words'”训练doc2vec时
【发布时间】:2017-10-16 05:54:05
【问题描述】:

当我训练我的 doc2vec 模型时,我多次遍历数据集,并且每次都打乱训练评论以提高准确性。然后python给了我AttributeError: 'numpy.ndarray' object has no attribute 'words'。下面是我的python代码:

def labelizeReviews(reviews, label_type):
  labelized = []
  for index, review in enumerate(reviews):
      label = ' %s_%s ' % (label_type, index)
      labelized.append(LabeledSentence(review, [label]))
  return labelized

x_train = labelizeReviews(x_train, 'TRAIN')  # input x_train is a list of word lists, each word list is a list of tokens of all words in one document
x_train=np.array(x_train)
model_dm = gensim.models.Doc2Vec(alpha=0.025, min_alpha=0.0001, iter=10, min_count=5, window=10, size=size, sample=1e-3,
                                 negative=5, workers=3)
for epoch in range(10):
    perm = np.random.permutation(x_train.shape[0])
    model_dm.train(x_train[perm], total_examples=model_dbow.corpus_count, epochs=model_dbow.iter)

然后以下是我的错误信息:

Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\Users\123\Anaconda2\lib\threading.py", line 801, in __bootstrap_inner
    self.run()
  File "C:\Users\123\Anaconda2\lib\threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Users\123\Anaconda2\lib\site-packages\gensim-2.1.0-py2.7-win-amd64.egg\gensim\models\word2vec.py", line 857, in job_producer
    sentence_length = self._raw_word_count([sentence])
  File "C:\Users\123\Anaconda2\lib\site-packages\gensim-2.1.0-py2.7-win-amd64.egg\gensim\models\doc2vec.py", line 729, in _raw_word_count
    return sum(len(sentence.words) for sentence in job)
  File "C:\Users\123\Anaconda2\lib\site-packages\gensim-2.1.0-py2.7-win-amd64.egg\gensim\models\doc2vec.py", line 729, in <genexpr>
    return sum(len(sentence.words) for sentence in job)
AttributeError: 'numpy.ndarray' object has no attribute 'words'

有谁知道如何解决这个问题? 非常感谢!!!

【问题讨论】:

  • 您没有将正确的对象传递给您的函数。你读过文档吗?
  • 我是doc2vec的新手,你能告诉我我应该如何更改训练函数的输入参数吗?

标签: python numpy doc2vec


【解决方案1】:

选择一个好的演示/教程作为您的指南 - 首先运行它以查看正确的操作,然后调整它以使用您的数据或参数。

例如,有一个 Doc2Vec 介绍 Jupyter notebook 包含在 gensim 中,doc2vec-lee.ipynb。您可以在已安装的 gensim 目录中的 docs/notebooks 子目录中找到它,或在线查看:

https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-lee.ipynb

现在,该演示是在非常小的玩具数据集上进行的——只有 300 个短短的几百字的文档。 Doc2Vec 通常不会在如此小的数据集上给出好的结果。但是这个演示使用了一个非常小的size(50 维)和非常大的iter(55)来勉强一些有用。

(对于更典型的数万到数百万文档的训练集,您可以使用更多典型的 100 或更多维度的 size,更典型的只有 10-20 的 iter。)。

但是,如果您建立在这样一个好的、有效的示例上,您就不会犯某些错误。例如:

  • 您将使用当前推荐的示例类 TaggedDocument,而不是其较旧的变体 LabeledSentence

  • 你不会将你的语料库变成一个 numpy ndarray - 这是一个完全不必要的步骤,这也是你看到的错误的直接原因。

  • 您不会在自己的循环中多次调用train(),这很容易出错,而且几乎总是错误的做法,除非您是专家级用户,并仔细注意所有参数管理。 (您正在执行 10 个循环,并且在每个循环中执行 10 次数据传递,并且对于每个循环,该类将管理从 0.025 到 0.0001 的学习率alpha——这意味着它会在训练期间上下跳跃,这几乎肯定不是你想要的。)

  • 你不会让每个文档都有相同的,单个标签'TRAIN`` – which meansDoc2Vec` 不可能做任何有用的事情。该算法需要具有不同标签的各种文档来学习不同文档/标签的对比向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多