2

我是 Python 和 Gensim 的新手。我目前正在阅读有关gensimhttp://radimrehurek.com/gensim/tut1.html)的教程之一。我对这行代码有两个问题:

# collect statistics about all tokens
>>> dictionary = corpora.Dictionary(line.lower().split() for line in open('mycorpus.txt'))

1)mycorpus.txt在 Dictionary 开始构建之前文件是否已完全加载到内存中?该教程明确表示不:

Similarly, to construct the dictionary without loading all texts into memory

但是当我在我的活动监视器中监视 RAM 使用情况时,Python 进程为 3 gig 文件命中 1 gig(我中途终止了进程)。这很奇怪,因为我假设我的 3 gig 文本文件的字典会小得多。有人可以为我澄清这一点吗?

2)我怎样才能重新编码这一行,以便我可以在每一行读取之间做一些事情?我想打印到屏幕上查看进度。这是我的尝试:

i = 1

for line in f:
    if i % 1000 == 0:
        print i
    dictionary = corpora.Dictionary([line.lower().split()])
    i += 1

这不起作用,因为字典正在为每一行重新初始化。

我意识到这些都是非常n00b的问题 - 感谢您的帮助和耐心。

4

1 回答 1

3

1)不,他们正在传递一个生成器对象,该对象一次只产生一行给字典构造函数。除了由 python 内部完成的一些缓存之外,它基本上一次只读取 1 行。

建立字典后,它可能会占用与原始文件几乎相同的内存量——毕竟,它可能存储了所有这些信息。

2)就重新编码而言,您可以制作一个新的生成器,它会执行您的操作并像以前一样生成行:

def generator(f)
    for i, line in enumerate(f):
        if i % 1000 == 0:
            print i
        yield line

with open('mycorpus.txt') as f:
    dictionary = corpora.Dictionary(line.lower().split() for line in generator(f))
于 2013-10-20T05:55:13.027 回答