
Blazing Fast, leve e personalizável Pesquisa de texto difusa e semântica no Python.
O Neofuzz é uma biblioteca de pesquisas difusas com base na vetorização e nas técnicas de busca vizinha mais próximas.
Agora você pode reordenar seus resultados de pesquisa usando a Distância Levenshtein! Às vezes, os processos de n-gramas ou processos vetorizados não solicitam os resultados corretamente. Nesses casos, você pode recuperar um número maior de exemplos do corpus indexado e depois refinar esses resultados com a distância de Levenshtein.
from neofuzz import char_ngram_process
process = char_ngram_process ()
process . index ( corpus )
process . extract ( "your query" , limit = 30 , refine_levenshtein = True )A maioria das bibliotecas de pesquisa difusa depende de otimizar o inferno dos mesmos algoritmos de busca difusa (distância de hamming, distância de Levenshtein). Às vezes, infelizmente, devido à complexidade desses algoritmos, nenhuma quantidade de otimização obterá a velocidade que você deseja.
O Neofuzz faz a realização, de que você não pode ir acima de um certo limite de velocidade, confiando nos algoritmos tradicionais e usa a vetorização de texto e aproximar a busca mais próxima do vizinho no espaço vetorial para acelerar esse processo.
Quando se trata do dilema da velocidade versus a precisão, o Neofuzz é a velocidade total.
Você pode instalar Neofuzz a partir de Pypi:
pip install neofuzz Se você deseja uma experiência plug-and-play, pode criar um processo geralmente bom e sujo com o processo 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 )]Você pode personalizar o comportamento da Neofuzz fazendo um processo personalizado. Sob o capô, todo processo neofuzz depende dos mesmos dois componentes:
Se você estiver mais interessado nas palavras/conteúdo semântico do texto, também pode usá -las como recursos. Isso pode ser muito útil, especialmente com textos mais longos, como obras literárias.
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" )Você pode achar que a velocidade do seu processo de pesquisa difusa não é suficiente. Nesse caso, pode ser desejável reduzir a dimensionalidade dos vetores produzidos com algum método de decomposição da matriz ou modelo de tópico.
Aqui, por exemplo, eu uso o NMF (excelente modelo de tópico e um incrivelmente rápido também) acelerar muito meu pipeline de pesquisa difusa.
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" )Com o Neofuzz, você pode usar facilmente incorporação semântica em sua vantagem e pode usar os dois modelos de idiomas baseados em atenção (BERT), apenas palavras neurais simples ou incorporação de documentos (Word2Vec, Doc2vec, FastText, etc.) ou até LLMs da OpenAI.
Recomendamos que você experimente o EMETTER, que possui muitos vetores compatíveis com 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 )