
Пылающий быстрый, легкий и настраиваемый нечеткий и семантический текстовый поиск в Python.
NEOFUZZ - это нечеткая поисковая библиотека, основанная на векторизации и приблизительных методах поиска ближайших соседей.
Теперь вы можете переупорядочить результаты поиска, используя расстояние Levenshtein! Иногда процессы N-грамма или векторизованные процессы не совсем правильно заказывают результаты. В этих случаях вы можете получить большее количество примеров из индексированного корпуса, а затем усовершенствовать эти результаты с расстоянием Левенштейна.
from neofuzz import char_ngram_process
process = char_ngram_process ()
process . index ( corpus )
process . extract ( "your query" , limit = 30 , refine_levenshtein = True )Большинство нечетких поисковых библиотек полагаются на оптимизацию, черт возьми, из одной и той же пары нечетких алгоритмов поиска (расстояние Хаминга, расстояние Левенштейна). Иногда, к сожалению, из -за сложности этих алгоритмов ни одна оптимизация не даст вам скорости, которую вы хотите.
Neofuzz делает осознание того, что вы не можете превышать определенное ограничение скорости, полагаясь на традиционные алгоритмы, и использует текстовую векторизацию и приблизительный поиск ближайшего соседа в векторном пространстве, чтобы ускорить этот процесс.
Когда дело доходит до дилеммы скорости по сравнению с точностью, Neofuzz выходит на полную скорость.
Вы можете установить Neofuzz из PYPI:
pip install neofuzz Если вам нужен опыт подключения и воспроизведения, вы можете создать в целом хороший быстрый и грязный процесс с процессом char_ngram_process() .
from neofuzz import char_ngram_process
# We create a process that takes character 1 to 5-grams as features for
# vectorization and uses a tf-idf weighting scheme.
# We will use cosine distance for the nearest neighbour search.
process = char_ngram_process ( ngram_range = ( 1 , 5 ), metric = "cosine" , tf_idf = True )
# We index the options that we are going to search in
process . index ( options )
# Then we can extract the ten most similar items the same way as in
# thefuzz
process . extract ( "fuzz" , limit = 10 )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[( 'fuzzer' , 67 ),
( 'Januzzi' , 30 ),
( 'Figliuzzi' , 25 ),
( 'Fun' , 20 ),
( 'Erika_Petruzzi' , 20 ),
( 'zu' , 20 ),
( 'Zo' , 18 ),
( 'blog_BuzzMachine' , 18 ),
( 'LW_Todd_Bertuzzi' , 18 ),
( 'OFU' , 17 )]Вы можете настроить поведение Neofuzz, сделав пользовательский процесс. Под капюшоном каждый процесс неофуцца опирается на одни и те же два компонента:
Если вас больше интересует слова/семантическое содержание текста, вы также можете использовать их в качестве функций. Это может быть очень полезно, особенно с более длинными текстами, такими как литературные произведения.
from neofuzz import Process
from sklearn . feature_extraction . text import TfidfVectorizer
# Vectorization with words is the default in sklearn.
vectorizer = TfidfVectorizer ()
# We use cosine distance because it's waay better for high-dimentional spaces.
process = Process ( vectorizer , metric = "cosine" )Вы можете обнаружить, что скорость вашего нечеткого процесса поиска недостаточно. В этом случае может быть желательно уменьшить примерность производимых векторов с помощью некоторого метода матричной разложения или модели темы.
Здесь, например, я использую NMF (отличная тематическая модель и невероятно быстрая тоже) тоже ускоряет свой нечеткий поисковый конвейер.
from neofuzz import Process
from sklearn . feature_extraction . text import TfidfVectorizer
from sklearn . decomposition import NMF
from sklearn . pipeline import make_pipeline
# Vectorization with tokens again
vectorizer = TfidfVectorizer ()
# Dimensionality reduction method to 20 dimensions
nmf = NMF ( n_components = 20 )
# Create a pipeline of the two
pipeline = make_pipeline ( vectorizer , nmf )
process = Process ( pipeline , metric = "cosine" )С помощью Neofuzz вы можете легко использовать семантические встраивания в своих интересах и можете использовать оба языковые модели, основанные на внимании (BERT), просто простое нейронное слово или документы (Word2VEC, DOC2VEC, FastText и т. Д.) или даже LLM OpenAI.
Мы рекомендуем вам попробовать Embetter, который имеет много встроенных векторов, совместимых с Sklearn.
pip install embetter from embetter . text import SentenceEncoder
from neofuzz import Process
# Here we will use a pretrained Bert sentence encoder as vectorizer
vectorizer = SentenceEncoder ( "all-distilroberta-v1" )
# Then we make a process with the language model
process = Process ( vectorizer , metric = "cosine" )
# Remember that the options STILL have to be indexed even though you have a pretrained vectorizer
process . index ( options )