在包含大约300万个单词的文件中搜索大约150,000个单词

时间:2017-08-13 10:24:18

标签: python performance file-search coding-efficiency

我正在进行文本摘要并建立我的词汇表,我已经训练了一个数据集。现在我需要来自Google的Word2Vec的那些词汇单词的向量。 我编写了简单的代码,每个单词都会在包含大约300万字的google-vectors文件中搜索它。 但问题是,这种线性搜索实际上需要数周的时间来计算。我正在使用python这个东西。 如何以更有效的方式搜索这些单词?

found_counter = 0
file1 = open('vocab_training.txt', 'r').read()
for i, line in enumerate(file1):
    if i >= 50:
        break
    file2 = open('google-vectors.txt', 'r' )
    for j, line2 in enumerate(file2):
        if line.lower() == line2.split():
            found_counter += 1
    file2.close()
print(found_counter)

1 个答案:

答案 0 :(得分:0)

选项:在哈希表中将300万个单词加载到内存中并检查成员身份 - 在Python中,您将保留set

with open('google-vectors.txt', 'r') as f:
  words = set(l.lower() for l in f)

...
  if line.lower in words:
    ...

其他选择:

  1. 使用二进制搜索(哈希节点)
  2. 保留一个带有log(n)查找的排序列表
  3. 如果没有足够的内存来保存内存,请初始化布谷鸟过滤器,布隆过滤器或其他近似成员资格查询"结构与单词集的内容。首先测试过滤器中的成员资格 - 如果你得到一个命中,这意味着可能有一个真正的命中,然后你可以去一个较慢的查询方法。你可以获得足够低的假阳性,这是一个不错的选择。
  4. 如果太大而无法保留在内存中,请以易于查询的方式将数据保存在磁盘或其他位置。内置于python中的一些示例包括dbmshelvesqlite3。如果使用例如sqlite3,请确保索引数据。您甚至可以运行像Redis这样的本地网络键值存储,并且仍然可以获得比重新遍历列表更好的性能。