Faiss

Материал из NLPub
Перейти к: навигация, поиск

Facebook AI Research Similarity Search (сокр. Faiss) — библиотека алгоритмов поиска ближайших соседей в линейном пространстве, разработанная в Facebook AI Research.[1] Утилита включает в себя как точные методы поиска ближайших соседей, так и приближённые методы.

Доступность

Библиотека Faiss распространяется на условиях лицензии Creative Commons Attribution-NonCommercial, что достаточно необычно для программного обеспечения.

Установка

Faiss написан на языке C++ и содержит официальную привязку к языку программирования Python при помощи SWIG. Сборка под Linux осуществляется следующим образом:

$ git clone https://github.com/facebookresearch/faiss.git && cd faiss
$ cp -f example_makefiles/makefile.inc.Linux makefile.inc
$ make -j$(nproc)
$ make py

При использовании некоторых версий GCC наблюдается проблема при сборке, связанная с определением значения nullptr. Проблему можно исправить, добавив опцию -include stddef.h перед -Dnullptr=NULL в файле makefile.inc. Поддерживается как Python 2 (по умолчанию), так и Python 3. Это также можно выбрать в makefile.inc.

Использование

Требуется индексирование элементов линейного пространства:

Python

Индексирование нормированных векторов слов word2vec на основе косинусной меры близости из русского дистрибутивного тезауруса.

from gensim.models.word2vec import Word2Vec
import faiss
import numpy as np

NEIGHBORS = 10

w2v = Word2Vec.load_word2vec_format('all.norm-sz100-w10-cb0-it1-min100.w2v', binary=True, unicode_errors='ignore')
w2v.init_sims(replace=True)

index = faiss.IndexFlatIP(w2v.layer1_size)
index.add(w2v.wv.syn0norm)

X = np.array([w2v['кот'], w2v['кошка']])

D, I = index.search(X, NEIGHBORS + 1)

for _D, _I in zip(D, I):
    for n, (d, i) in enumerate(zip(_D.ravel(), _I.ravel())):
        if n > 0:
            print(w2v.wv.index2word[i], d)

Ссылки

См. также

Примечания

  1. J. Johnson, M. Douze, H. Jégou (2017), Billion-scale similarity search with GPUs