首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >要传递给Gensim语言模型的语句迭代器

要传递给Gensim语言模型的语句迭代器
EN

Stack Overflow用户
提问于 2019-06-06 06:29:50
回答 1查看 1.4K关注 0票数 2

我是NLP的新手,我正在尝试创建我自己的单词嵌入,并在我的个人文档语料库中进行训练。

我正在尝试实现以下代码来创建我自己的wordembedings:

代码语言:javascript
运行
复制
model = gensim.models.Word2Vec(sentences)

句子是句子的列表。因为我不能传递成千上万的句子,所以我需要一个迭代器

代码语言:javascript
运行
复制
# with mini batch_dir a directory with the text files
# MySentences is a class iterating over sentences.
sentences = MySentences(minibatch_dir) # a memory-friendly iterator

我通过gensim的创建者找到了这个解决方案:

代码语言:javascript
运行
复制
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()

它对我不起作用。如果我知道如何从每个文档中获取句子列表,我如何创建迭代器?

第二个非常相关的问题:如果我的目标是比较特定语料库中的文档相似性,从头开始创建与该特定语料库的所有文档的单词嵌入总是比使用GloVec或word2vec更好?文档数量约为40000个。

干杯

更多pre

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 14:59:15

图示中的类MySentences假设每行有一句话。对于您的数据,情况可能并非如此。

需要注意的一件事是-调用Word2Vec(语句,iter=1)将在语句迭代器上运行两次遍历(或者,通常是iter+1遍历;默认为iter=5)。第一遍收集单词及其频率,以构建内部字典树结构。第二个和随后的过程训练神经模型。这两个(或iter+1)遍也可以手动初始化,以防您的输入流是不可重复的(您只能负担一遍),并且您可以通过其他方式初始化词汇表:

代码语言:javascript
运行
复制
model = gensim.models.Word2Vec(iter=1)  # an empty model, no training yet
model.build_vocab(some_sentences)  # can be a non-repeatable, 1-pass generator
model.train(other_sentences)  # can be a non-repeatable, 1-pass generator

例如,如果您正在尝试读取存储在数据库中的数据集,则直接从数据库流式传输文本的生成器函数将抛出TypeError:

代码语言:javascript
运行
复制
TypeError: You can't pass a generator as the sentences argument. Try an iterator.

一个生成器只能使用一次,然后就会被遗忘。因此,您可以编写一个包装器,它有一个迭代器接口,但在引擎盖下使用生成器。

代码语言:javascript
运行
复制
class SentencesIterator():
    def __init__(self, generator_function):
        self.generator_function = generator_function
        self.generator = self.generator_function()

    def __iter__(self):
        # reset the generator
        self.generator = self.generator_function()
        return self

    def __next__(self):
        result = next(self.generator)
        if result is None:
            raise StopIteration
        else:
            return result

生成器函数也被存储,因此它可以重置并在Gensim中使用,如下所示:

代码语言:javascript
运行
复制
from gensim.models import FastText

sentences = SentencesIterator(tokens_generator)
model = FastText(sentences) 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56468865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档