构建词典而不加载所有文本

时间:2013-10-20 05:46:32

标签: python dictionary gensim

我是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)在Dictionary开始构建之前,文件mycorpus.txt是否已完全加载到内存中?该教程明确地说不:

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

但是当我在我的Activity Monitor中监视RAM使用情况时,Python进程会为1 gig文件点击1 gig(我在中途杀死了该进程)。这很奇怪,因为我认为我的3演出文本文件的字典会小得多。有人可以为我澄清这一点吗?

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

i = 1

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

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

我意识到这些是非常难以理解的问题 - 感谢您的帮助和耐心。

1 个答案:

答案 0 :(得分:3)

1)不,它们传递的是一个生成器对象,它一次只能生成一行到字典构造函数。除了python内部完成的一些缓存之外,它一次只读取一行。

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

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))