在python中合并词典

2024-05-29 06:33:09 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉这个标题很笼统,但我会尽量具体一些。在

我正在开发一个文本挖掘应用程序。我在多个python字典(tuple->;int)中存储了大量形式为((word,corpus)->;occurrence\u count)的键值对(everything都是整数)。这些值分布在磁盘上的多个文件中(我对它们进行了pickle处理)。为了理解这些数据,我需要把这些字典聚合在一起,我需要找出一种方法来找出所有字典中某个键的所有出现,然后把它们加起来得到一个总数。在

如果我一次加载多个字典,内存就会耗尽,这就是我必须首先拆分它们的原因。当我尝试的时候,我遇到了性能问题。我目前正试图将这些值存储在数据库(mysql)中,一次处理多个字典,因为mysql提供了行级锁,这是好的(因为它意味着我可以并行化这个操作)和坏的(因为它减慢了insert查询的速度)

我有什么选择?写一个部分基于磁盘的字典,这样我就可以一次处理一个dicts了吗?采用LRU更换策略?有什么事我完全忘记了吗?在

谢谢!在


Tags: 文本gt应用程序标题字典mysqlcorpus磁盘
3条回答

如果我能正确理解你的问题

from collections import defaultdict
import pickle

result = defaultdict(int)
for fn in filenames:
    data_dict = pickle.load(open(fn))
    for k,count in data_dict.items():
        word,corpus = k
        result[k]+=count
  1. 如果我正确地理解了您的问题,并且您有单词和语料库的整数id,那么您可以通过从dict切换到list,或者更好地,一个numpy数组来获得一些性能。这可能很烦人!在

    基本上,您需要用一个整数替换元组,我们可以称之为newid。你想让所有的newid对应一个词,语料库对,所以我会计算每个语料库中的单词,然后为每个语料库有一个起始的newid。(word,corpus)的newid将是word+start\u newid[corpus]。在

    如果我误解了您的意思,而您没有这样的id,那么我认为这个建议可能仍然有用,但是您必须对数据进行操作,使其成为ints格式的元组。

  2. 另一个可以尝试的方法是重新检查数据。在

    假设你只能记住1.1个怪物。然后,您可以加载一个,并创建一个更小的dict或数组,它只对应于前10%的(单词,语料库)对。您可以扫描加载的dict,并处理前10%中的任何一个。完成后,您可以将结果写回磁盘,并对第二个10%进行另一次传递。这将需要10次通过,但这可能对你没问题。在

    如果您根据内存大小选择先前的分块,那么您将不得不任意地将旧的dict分成两半,这样您就可以在内存中保存一个dict/array结果。

像这样的基于磁盘的字典存在请参见shelve模块。工具架中的键必须是字符串,但您可以简单地在元组上使用str来获得等效的字符串键;另外,我将您的Q理解为您只需要word作为键,这样就更容易了(或者str或者,对于词汇表<;4GB,a结构包很好)。在

一个好的关系引擎(尤其是PostgreSQL)会很好地为您服务,但是一次处理一个字典,将所有语料库中出现的每个单词聚合成一个shelf对象也应该是可以的(虽然速度不那么快,但代码更简单,因为shelfdict非常相似,除了key[[和可变值的一个警告,但是由于您的值是int的,所以您不必担心)。在

相关问题 更多 >

    热门问题