Я использую Annoy для создания решения для ближайшего соседа https://github.com/spotify/annoy
Ниже приведен пример кода из https://www.garysieling.com/blog/python-annoy-glove-example, который я использовал.
from annoy import AnnoyIndex
file = "/Users/gary/Downloads/glove.6B/glove.6B.50d.txt"
content = []
with open(file) as f:
content = f.readlines()
content = [x.split(" ") for x in content]
t = AnnoyIndex(50)
idx = 0
terms = [i[0] for i in content]
############## block #####################
for i in content:
vec = [float(a) for a in i[1:]]
print(len(vec))
t.add_item(idx, vec)
idx = idx + 1
##########################################
t.build(10) # 10 trees
t.save('test.ann')
Поиск:
u = AnnoyIndex(50)
u.load('test.ann')
near = u.get_nns_by_item(0, 10) # nearest 10 terms
nearWords = [terms[i] for i in near]
print(nearWords)
Я пытаюсь применить многопроцессорную обработку к выделенному выше коду, где я в основном перебираю массив содержимого и добавляю индексный вектор в индекс Annoy.
Приведенный выше код работает отлично, но когда я применяю многопроцессорную обработку к этим шагам создания индекса, кажется, что эти векторы не создаются. Ниже я попробовал
from annoy import AnnoyIndex
from multiprocessing import Pool
@memory
@timer
def load_glove_vectors():
"""
Memory before running load_glove_vectors() is 45.359 Mb
load_glove_vectors() ran in 4.838 sec
Memory after running load_glove_vectors() is 1432.250 Mb
"""
file = "/Users/shekhar/Downloads/glove.6B/glove.6B.50d.txt"
content = []
with open(file) as f:
content = f.readlines()
content = [x.split(" ") for x in content]
return content
if __name__ == "__main__":
def create_index(x):
index, vector = x
vec = [float(v) for v in vector[1:]]
t.add_item(index, vec)
content = load_glove_vectors()
t = AnnoyIndex(50, metric='angular')
terms = [i[0] for i in content]
with Pool(4) as p:
p.map(create_index, enumerate(content))
build_index()
t.build(10) # 10 trees
t.save('test.ann')
u = AnnoyIndex(50, metric='angular')
u.load('test1.ann')
near = u.get_nns_by_item(69, 10) # nearest 10 terms
nearWords = [terms[i] for i in near]
print(nearWords)
Это дает следующую ошибку, возможно, потому что индекс еще не создан.
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-9-2f577a14f4c7> in <module>
1 u = AnnoyIndex(50, metric='angular')
2 u.load('test1.ann')
----> 3 near = u.get_nns_by_item(69, 10) # nearest 10 terms
4 nearWords = [terms[i] for i in near]
5 print(nearWords)
IndexError: Item index larger than the largest item index