首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python和Doc2Vec的Doc2Vec

使用Python和Doc2Vec的Doc2Vec
EN

Stack Overflow用户
提问于 2018-08-27 12:14:02
回答 1查看 198关注 0票数 0

我正在尝试为海量数据训练一个Doc2vec。我有一个20k文件,总共有72GB,并编写了以下代码:

代码语言:javascript
复制
def train():
    onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
    data = []
    random.shuffle(onlyfiles)
    tagged_data = []
    t = 0
    try:
        for file_name in onlyfiles:
            with open(mypath+"/"+file_name, 'r', encoding="utf-8") as file:
                txt = file.read()
                tagged_data.append([word_tokenize(txt.lower()), [str(t)]])
                t+=1
    except Exception as e:
        print(t)
        return 
    print("Files Loaded")
    max_epochs = 1000
    vec_size = 500
    alpha = 0.025

    model = Doc2Vec(vector_size=vec_size,
                    alpha=alpha, workers=1,
                    min_alpha=0.00025,
                    min_count=1,
                    dm=1)

    print("Model Works")
    print("Building vocabulary")

    model.build_vocab(tagged_data)
    print("Trainning")
    for epoch in range(max_epochs):
        print("Iteration {0}".format(epoch))
        model.train(tagged_data,
                    total_examples=model.corpus_count,
                    epochs=model.iter)
        model.alpha -= 0.0002
        model.min_alpha = model.alpha

    model.save(model_name)
    print("Model Saved")

但是,当我运行此方法时,会出现以下错误: Traceback (最近一次调用):

代码语言:javascript
复制
File "doc2vec.py", line 20, in train
    tagged_data.append([word_tokenize(txt.lower()), [str(t)]])
MemoryError

并且只处理3k文件。但是,当查看内存时,python进程显示只使用了来自内存的1.7%的。有什么参数我可以通知python来解决吗?我怎么才能修好它?

EN

回答 1

Stack Overflow用户

发布于 2018-08-29 00:02:23

甚至在尝试Doc2Vec之前很久就会遇到错误,所以这并不是一个真正的Doc2Vec问题--这是Python数据处理中的一个问题。您是否有足够的RAM将72 Do的磁盘数据(在Python字符串对象中表示时可能会扩展)加载到RAM中?

而且,你通常不需要把一个完整的语料库,通过附加到一个巨大的列表,来完成任何这些任务。一次只读取一个东西,然后从一个可迭代/迭代器进行处理,可能会将临时结果(比如标记化的文本)写回IO源。这一条可能有助于:

https://rare-technologies.com/data-streaming-in-python-generators-iterators-iterables/

最后,如果您的代码确实继续到Doc2Vec部分,那么您还会遇到其他问题。无论你作为一个模型在网上咨询什么,都有很多不好的做法。例如:

  • 典型的交互计数是10-20;对于72‘t数据集,您肯定不会使用1000。
  • min_count=1导致了一个更大的模型;通常,放弃低频字是必要的,甚至可能提高矢量质量,而较大的数据集(和72 to非常大)倾向于用户更大而不是最小的min_count设置。
  • 大多数人不应该使用非默认的alpha/min_alpha值,也不应该尝试用自己的计算来管理它们,甚至不应该不止一次地调用train()train()有自己的epochs参数,如果使用该参数,将顺利地为您处理学习速率alpha。据我所知,在自己的循环中多次调用train()的人100%都做错了,我不知道他们是从哪里得到这些例子的。
  • workers=1中,培训要慢得多;特别是在大型数据集中,您需要尝试更大的workers值,在gensim版本(从3.5.0到3.5.0)中,培训吞吐量的最佳值通常在3-12之间(假设您至少有那么多CPU核心)。

因此,您当前的代码可能会产生一个比RAM更大的模型,缓慢地进行单线程训练,训练次数超过必要的1000倍,大部分的训练都是以无意义的负值α进行的,这会使模型在每一个周期都变得更糟。如果它在模型初始化过程中奇迹般地没有MemoryError,那么它将运行数月或数年,并最终得到毫无意义的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52039141

复制
相关文章

相似问题

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