python Gensim Dictionary在制作时会大幅减慢速度

n53p2ov0  于 2023-03-28  发布在  Python
关注(0)|答案(1)|浏览(96)

我有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,所以这不是大小问题。
有什么想法吗

vltsax25

vltsax251#

虽然我在评论中提出的问题都与诊断这类过程中的一般放缓有关,但查看gensim.corpora.Dictionary源代码,我看到了另一个可能的问题:一旦Dictionary有2 M个条目,这是一个相当低效且经常重复的“修剪”。
如果您有足够的RAM,则向构造器或(当您还传入corpus时)或.add_documents()调用理想情况下,您会选择一个比Dictionary更大的prune_at值,因此不会发生修剪-尽管这有耗尽内存的风险,如果语料库中的唯一词多于RAM中可以跟踪的唯一词。
(Side注意:如果你的comment['text']字段没有以任何方式进行预处理,那么一个简单的.split()标记化可能会给你留下很多额外的标记,比如连接到周围标点符号的单词或不同的大写字母-这会使标记计数膨胀很多,并且可能对许多下游任务不太有用。

相关问题