【问题标题】:Gensim Lemmatization Remove Postag b'Gensim Lemmatization Remove Postag b'
【发布时间】:2019-11-10 14:13:54
【问题描述】:

我正在尝试使用以下代码对文档进行词形还原。词形还原有效。它产生字节串。因此,代码的下一部分会产生“cant concan byte to str”错误。然后我将标记更改为 str(),如下面的代码所示。代码输出如下;(我使用的是Python 3.7(64位))

AttributeError                            Traceback (most recent call last)
<ipython-input-223-cb505389f802> in <module>
      1 #Build a Vocabulary
----> 2 model.build_vocab(train_demo_corpus)

~\Anaconda3\lib\site-packages\gensim\models\doc2vec.py in build_vocab(self, documents, update, progress_per, keep_raw_vocab, trim_rule, **kwargs)
    727         """
    728         total_words, corpus_count = self.vocabulary.scan_vocab(
--> 729             documents, self.docvecs, progress_per=progress_per, trim_rule=trim_rule)
    730         self.corpus_count = corpus_count
    731         report_values = self.vocabulary.prepare_vocab(

~\Anaconda3\lib\site-packages\gensim\models\doc2vec.py in scan_vocab(self, documents, docvecs, progress_per, trim_rule)
    807         for document_no, document in enumerate(documents):
    808             if not checked_string_types:
--> 809                 if isinstance(document.words, string_types):
    810                     logger.warning(
    811                         "Each 'words' should be a list of words (usually unicode strings). "

AttributeError: 'str' object has no attribute 'words'

这是我的代码;

train_demo_corpus = list(lemmat(lee_train_demo_file))

def lemmat(fname, tokens_only=False):
    with smart_open.smart_open(fname, encoding="iso-8859-1") as f:
        for i, line in enumerate(f):
            tokens = gensim.utils.lemmatize(line)
            if tokens_only:
                yield str(tokens)
            else:
                # For training data, add tags
                yield str(gensim.models.doc2vec.TaggedDocument(tokens, [i]))

model = gensim.models.doc2vec.Doc2Vec(vector_size=50, min_count=2, epochs=40)
model.build_vocab(train_demo_corpus)

最好的问候,

【问题讨论】:

  • 'b' 表示一个字节串。查看stackoverflow.com/questions/6269765/… 了解更多信息。您可以在 Google 上获取有关如何使用此功能的大量信息。
  • 是的,正如@bivouac0 所指出的,您看到的b' 不是字符串的一部分,而是对您(程序员)其类型的指示符。如果您正在打印一个原始 Python 对象(如 TaggedDocument),那么它的出现是合适的。另一方面,如果您尝试直接打印像第一个文档的第一个单词这样的字符串——print (train_demo_corpus[0].words[0])——它不应该出现。因此,如果还有其他问题,请添加更多详细信息,说明问题的原因。
  • 嗨@gojomo,让我指定问题:在下一步中,当以下代码运行时,我得到“TypeError: can't concat str to bytes”:model = gensim.models.doc2vec.Doc2Vec (vector_size=50, min_count=2, epochs=40) model.build_vocab(train_demo_corpus) ...我的问题是为什么我的问题中给出的代码会产生二进制输出?如何将它们解码为 str?
  • 我需要查看整个错误堆栈(包含代码行和行号)以了解您收到的下一个错误。您可以编辑您的问题以添加它,因此您拥有比这些 cmets 更多的空间和格式选项。 (此外,由于 Python 2.x 和 Python 3.x 之间的编码/字符串类型问题有所不同,请说明您使用的是哪个。)
  • 我刚刚根据您的反馈编辑了我的问题...

标签: gensim lemmatization


【解决方案1】:

gensim.utils 中的lemmatize 函数通过lemma.encode('utf8') 将 lamma 编码为字节串。您可以在 gensim 的本地文件中删除 .encode('utf8'),创建自己的 lemmatize 副本并删除编码或将以下内容添加到您的代码中:

tokens = gensim.utils.lemmatize(line)
b' '.join(tokens).decode('utf-8').split(' ')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2021-08-03
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多