我有26,000,000条推文,正在用它们创建一个Gensim词典。第一种方法:
from gensim.corpora import Dictionary
corpus = []
with open(input_file, "r") as file:
for row in file:
comment = json.loads(row)
corpus.append(comment['text'].split())
gdict = Dictionary(corpus)
仅最后一行就需要大约一个小时。我还尝试了以下方法:
from gensim.corpora import Dictionary
gdict = Dictionary()
with open(input_file, "r") as file:
for row in file:
comment = json.loads(row)
gdict.add_documents([comment['text'].split()])
这需要2分钟来处理前11,400,000条推文,然后突然慢下来,并预测超过3000小时才能完成。
我已经随机化了推文的顺序,在大约相同数量的推文之后也会发生同样的事情,所以这不是一个特定的推文。
在使用add_documents
之前,我还将tweet分组为不同的批量大小,并且在同一阶段,所有tweet都发生了相同的问题。
使用第一种方法,gdict的最终大小是1.4mb,所以这不是大小问题。
有什么想法吗
1条答案
按热度按时间vltsax251#
虽然我在评论中提出的问题都与诊断这类过程中的一般放缓有关,但查看
gensim.corpora.Dictionary
源代码,我看到了另一个可能的问题:一旦Dictionary
有2 M个条目,这是一个相当低效且经常重复的“修剪”。如果您有足够的RAM,则向构造器或(当您还传入
corpus
时)或.add_documents()
调用理想情况下,您会选择一个比Dictionary
更大的prune_at
值,因此不会发生修剪-尽管这有耗尽内存的风险,如果语料库中的唯一词多于RAM中可以跟踪的唯一词。(Side注意:如果你的
comment['text']
字段没有以任何方式进行预处理,那么一个简单的.split()
标记化可能会给你留下很多额外的标记,比如连接到周围标点符号的单词或不同的大写字母-这会使标记计数膨胀很多,并且可能对许多下游任务不太有用。