
Bolsa de texto de texto difuso y semántico rápido, liviano y personalizable en Python.
Neofuzz es una biblioteca de búsqueda difusa basada en la vectorización y las técnicas de búsqueda de vecinos más cercanos al vecino.
¡Ahora puede reordenar sus resultados de búsqueda utilizando la distancia de Levenshtein! A veces, los procesos N-Gram o los procesos vectorizados no ordenan los resultados correctamente. En estos casos, puede recuperar un mayor número de ejemplos del corpus indexado, luego refinar esos resultados con la distancia de Levenshtein.
from neofuzz import char_ngram_process
process = char_ngram_process ()
process . index ( corpus )
process . extract ( "your query" , limit = 30 , refine_levenshtein = True )La mayoría de las bibliotecas de búsqueda confusas dependen de optimizar los mismos algoritmos de búsqueda difusos (distancia de hamming, distancia de levenshtein). A veces desafortunadamente debido a la complejidad de estos algoritmos, ninguna cantidad de optimización le dará la velocidad que desea.
Neofuzz se da cuenta de que no puede superar un cierto límite de velocidad al depender de los algoritmos tradicionales, y utiliza la vectorización de texto y la búsqueda de vecinos más cercanos en el espacio vectorial para acelerar este proceso.
Cuando se trata del dilema de la velocidad versus la precisión, Neofuzz va a la velocidad completa.
Puede instalar neofuzz desde pypi:
pip install neofuzz Si desea una experiencia de plug-and Play, puede crear un proceso generalmente bueno y sucio con el proceso 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 )]Puede personalizar el comportamiento de Neofuzz haciendo un proceso personalizado. Debajo del capó, cada proceso de neofuzz se basa en los mismos dos componentes:
Si está más interesado en las palabras/contenido semántico del texto, también puede usarlas como características. Esto puede ser muy útil, especialmente con textos más largos, como obras literarias.
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" )Puede encontrar que la velocidad de su proceso de búsqueda difusa no es suficiente. En este caso, puede ser deseable reducir la dimentalidad de los vectores producidos con algún método de descomposición de matriz o modelo de tema.
Aquí, por ejemplo, uso NMF (excelente modelo de tema y increíblemente rápido también) también acelero mi fuzzy Search Tipeline.
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" )Con NEOFuzz, puede usar fácilmente incrustaciones semánticas para su ventaja, y puede usar tanto modelos de idiomas basados en la atención (BERT), solo una palabra neuronal simple o incrustaciones de documentos (Word2Vec, Doc2Vec, FastText, etc.) o incluso LLM de OpenAI.
Le recomendamos que pruebe Embetter, que tiene muchos vectorizadores compatibles con Sklearn incorporados.
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 )