As frases:
A rápida raposa marrom pula sobre o cachorro preguiçoso [A]
e
A raposa marrom uick pula sobre o cachorro preguiçoso [B]
pode ser comparado usando o algoritmo Levenshtein Distance para determinar a similaridade, calculando o número mínimo de adições, exclusões ou substituições de um único caracter necessário para transformar A em B.
Estou interessado em saber se existe uma representação intermediária ou possivelmente um esquema de codificação para a distância de Levenshtein. Não para uso entre duas frases, mas apenas uma codificação aplicada a uma única frase, de modo que o índice de caracteres não afete as comparações.
Em B, o 'q' está faltando em comparação com A. Uma comparação de string normal corresponderia 'The '
e falharia 'uick brown fox...'
apenas devido a um deslocamento de caractere único. A Distância Levenshtein poderia ser usada para compará-la com a frase original A para uma comparação mais perdoadora, mas no meu caso, não terei duas frases, apenas uma.
Então, estou procurando alguma maneira de codificar inequivocamente uma frase em pacotes de informações, pequenos átomos de verdade (estou pensando em um pacote por caractere?) Que mantêm uma ordem local e assim por diante, mas se alguns dos pacotes está errado, não afeta os caracteres posteriores.
Cada frase única deve mapear para uma e apenas uma única codificação / representação intermediária, Sets A'
e B'
. Calcular a distância de A e B de Levenshtein seria o mesmo que calcular a interseção de conjuntos A' = B'
.
Como alternativa - se esse problema não tiver uma solução (e isso com certeza for mapeado para uma área de pesquisa bastante comentada, eu não ficaria surpreso), algum argumento / prova convincente de sua insolabilidade.
fonte
Respostas:
De fato, há algumas pesquisas nesse sentido para a distância de edição com alguns resultados positivos e outros negativos. (Talvez eu não esteja entendendo a pergunta com precisão, tentarei responder a perguntas que sei responder.)
Certamente há mais literatura nesse sentido, mas deixe-me saber primeiro se isso está próximo do que você quis dizer.
fonte
Se a única coisa que pode acontecer é que os caracteres desapareçam, acho que você só precisa resolver o maior problema de subsequência comum . (Uma subsequência é uma generalização de uma substring: pode haver vários locais na subsequência em que o material foi removido da sequência maior, não apenas no início e / ou no final.)
Além disso, você já viu esta lista de métricas ?
Talvez eu esteja entendendo mal a sua declaração do problema, mas parece-me que se você definir com precisão como os erros podem ocorrer (exclusão, transposição etc.) e criar uma árvore de sufixos, será possível ter um algoritmo bem rápido depois de pagar o custo de memória e pré-processamento da construção da árvore de sufixos.
fonte
Isso é apenas um pensamento, não uma solução, mas muito tempo para um comentário.
Seu conjunto / representação poderia ser um edifício alfabético da string?
Exemplo (para A):
e assim por diante...
Sua representação seriam as etapas que você executou para criar a sequência (em ordem alfabética):
O elemento {a, {1, ^}, {1, $}} representa a etapa 2, enquanto {d, {1, b}, {1, a}} representa a quinta etapa.
Desde que você faça isso alfabeticamente em cada caso, você pode ter algo que possa usar.
Um pensamento complementar: comece com cópias suficientes de cada letra "abcdd" (para os 4 primeiros) e depois acompanhe suas transposições para construir a string. Agora estamos passando vagamente para a teoria da permutação.
[BTW, é "pula", não "pula", caso contrário não há 's' - sim, eu sei que você nunca disse que era um pangram]
fonte
Parece-me que sua coisa simples deve funcionar. Cada pacote contém a posição e o personagem, por exemplo
The = <1, T>, <2, h>, <3, e>
Então você compara o primeiro par de A com o primeiro par de B etc. Isso deve lhe dar Levenshtein.
fonte