
Recherche de texte flou, léger et personnalisable et personnalisable dans Python.
Neofuzz est une bibliothèque de recherche floue basée sur la vectorisation et les techniques de recherche des voisins les plus proches.
Vous pouvez maintenant réorganiser vos résultats de recherche à l'aide de la distance de Levenshtein! Parfois, les processus N-grammes ou les processus vectorisés ne commandent pas tout à fait les résultats correctement. Dans ces cas, vous pouvez récupérer un nombre plus élevé d'exemples du corpus indexé, puis affiner ces résultats avec la distance 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 plupart des bibliothèques de recherche floue s'appuient sur l'optimisation de l'enfer du même couple d'algorithmes de recherche floue (distance Hamming, distance de Levenshtein). Parfois, malheureusement, en raison de la complexité de ces algorithmes, aucune optimisation ne vous permettra de vous permettre de la vitesse que vous voulez.
Neofuzz fait la réalisation, que vous ne pouvez pas aller au-dessus d'une certaine limite de vitesse en s'appuyant sur des algorithmes traditionnels, et utilise la vectorisation de texte et approximativement la recherche de voisin le plus proche dans l'espace vectoriel pour accélérer ce processus.
En ce qui concerne le dilemme de vitesse par rapport à la précision, Neofuzz va à pleine vitesse.
Vous pouvez installer Neofuzz depuis PYPI:
pip install neofuzz Si vous voulez une expérience de plug-and play, vous pouvez créer un processus généralement bon et sale avec le processus 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 )]Vous pouvez personnaliser le comportement de Neofuzz en créant un processus personnalisé. Sous le capot, chaque processus Neofuzz repose sur les deux mêmes composants:
Si vous êtes plus intéressé par les mots / contenu sémantique du texte, vous pouvez également les utiliser comme fonctionnalités. Cela peut être très utile en particulier avec des textes plus longs, tels que des œuvres littéraires.
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" )Vous pourriez constater que la vitesse de votre processus de recherche floue n'est pas suffisante. Dans ce cas, il pourrait être souhaitable de réduire la dimensionnalité des vecteurs produits avec une méthode de décomposition matricielle ou un modèle de sujet.
Ici, par exemple, j'utilise NMF (excellent modèle de sujet et incroyablement rapide aussi) accélérez également mon pipeline de recherche floue.
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" )Avec Neofuzz, vous pouvez facilement utiliser des incorporations sémantiques à votre avantage, et vous pouvez utiliser à la fois des modèles de langage basés sur l'attention (BERT), un simple mot ou un document neural simple (Word2Vec, Doc2Vec, FastText, etc.) ou même LLMS d'OpenAI.
Nous vous recommandons d'essayer Embetter, qui possède beaucoup de vecteurs compatibles Sklearn intégrés.
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 )