Estou procurando uma biblioteca JavaScript de pesquisa difusa para filtrar uma matriz. Tentei usar o fuzzyset.js e o fuse.js , mas os resultados são terríveis (há demonstrações que você pode experimentar nas páginas vinculadas).
Depois de fazer algumas leituras sobre a distância de Levenshtein, me parece uma aproximação pobre do que os usuários procuram quando digitam. Para quem não sabe, o sistema calcula quantas inserções , exclusões e substituições são necessárias para fazer a correspondência de duas strings.
Uma falha óbvia, corrigida no modelo Levenshtein-Demerau, é que tanto o blub quanto o boob são considerados igualmente semelhantes ao bulbo (cada um exigindo duas substituições). É claro, no entanto, que bulb é mais semelhante a blub do que boob , e o modelo que acabei de mencionar reconhece isso ao permitir transposições .
Quero usar isso no contexto de preenchimento de texto, portanto, se eu tiver uma matriz ['international', 'splint', 'tinder']
e minha consulta for int , acho que internacional deve ter uma classificação mais alta do que splint , embora o primeiro tenha uma pontuação (maior = pior) de 10 versus o último 3.
Portanto, o que procuro (e criarei se não existir) é uma biblioteca que faça o seguinte:
- Pesa as diferentes manipulações de texto
- Pesa cada manipulação de forma diferente, dependendo de onde elas aparecem em uma palavra (as manipulações iniciais são mais caras do que as manipulações posteriores)
- Retorna uma lista de resultados classificados por relevância
Alguém encontrou algo assim? Sei que StackOverflow não é o lugar para pedir recomendações de software, mas implícito (não mais!) No acima está: estou pensando sobre isso da maneira certa?
Editar
Encontrei um bom artigo (pdf) sobre o assunto. Algumas notas e trechos:
Funções afins de edição de distância atribuem um custo relativamente mais baixo a uma sequência de inserções ou exclusões
a função de distância Monger-Elkan (Monge & Elkan 1996), que é uma variante afim da função de distância Smith-Waterman (Durban et al. 1998) com parâmetros de custo específicos
Para a distância Smith-Waterman (wikipedia) , "Em vez de olhar para a sequência total, o algoritmo Smith-Waterman compara segmentos de todos os comprimentos possíveis e otimiza a medida de similaridade." É a abordagem de n-gram.
Uma métrica amplamente semelhante, que não é baseada em um modelo de edição de distância, é a métrica Jaro (Jaro 1995; 1989; Winkler 1999). Na literatura record-linkage, bons resultados têm sido obtidos usando variantes desse método, que se baseia no número e na ordem dos caracteres comuns entre duas strings.
Uma variante disso devido a Winkler (1999) também usa o comprimento P do prefixo comum mais longo
(parece ser destinado principalmente para strings curtas)
Para fins de preenchimento de texto, as abordagens Monger-Elkan e Jaro-Winkler parecem fazer mais sentido. O acréscimo de Winkler à métrica Jaro pondera efetivamente o início das palavras com mais intensidade. E o aspecto afim de Monger-Elkan significa que a necessidade de completar uma palavra (que é simplesmente uma sequência de acréscimos) não vai desfavorecê-la muito.
Conclusão:
a classificação TFIDF teve o melhor desempenho entre várias métricas de distância baseadas em tokens, e uma métrica de distância de edição de gap afinado proposta por Monge e Elkan teve o melhor desempenho entre várias métricas de distância de edição de string. Uma métrica de distância surpreendentemente boa é um esquema heurístico rápido, proposto por Jaro e posteriormente estendido por Winkler. Isso funciona quase tão bem quanto o esquema Monge-Elkan, mas é uma ordem de magnitude mais rápido. Uma maneira simples de combinar o método TFIDF e o Jaro-Winkler é substituir as correspondências de token exatas usadas no TFIDF por correspondências de token aproximadas baseadas no esquema de Jaro-Winkler. Esta combinação tem um desempenho ligeiramente melhor do que Jaro-Winkler ou TFIDF em média, e ocasionalmente tem um desempenho muito melhor. Também se aproxima em desempenho de uma combinação aprendida de várias das melhores métricas consideradas neste artigo.
krole
não retorna Final Fantasy V: Krile
, embora eu gostaria. Exige que todos os caracteres na consulta estejam presentes na mesma ordem no resultado, o que é bastante míope. Parece que a única maneira de ter uma boa pesquisa difusa é ter um banco de dados de erros de digitação comuns.