2

我正在研究文本摘要并建立我的词汇表,我已经训练了一个数据集。现在我需要来自 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)
4

1 回答 1

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. 通过二进制搜索使用 log(n) 查找保持排序列表(哈希击败)
  2. 如果没有足够的内存将集合保存在内存中,则使用单词集合的内容初始化布谷鸟过滤器、布隆过滤器或其他“近似成员查询”结构。首先测试过滤器中的成员资格 - 如果你得到一个命中,这意味着你可能有一个真正的命中,然后你可以去一个较慢的查询方法。您可以获得足够低的误报,这是一个不错的选择。
  3. 如果太大而无法保存在内存中,请将数据以易于查询的方式保存在磁盘或其他地方。python 内置的一些示例是dbmshelvesqlite3. 如果使用例如sqlite3确保索引数据。您甚至可以运行像 Redis 这样的本地网络键值存储,并且仍然可以获得比重新迭代列表更好的性能。
于 2017-08-13T10:44:00.760 回答