Eu criei uma implementação DIFF para comparar revisões de documentos no trabalho. É baseado no algoritmo de diferença O (ND) e suas variações .
Uma coisa que se tornou importante é pegar a lista de alterações e interpretá-las em texto legível por humanos. Embora o algoritmo atual seja muito eficiente, é tanto que é difícil expandir.
Pergunta curta
Eu estava pensando em tentar usar A * e uma heurística que adiciona penalidades por "turnos". A idéia é suavizar desnecessariamente "adicionar, excluir, adicionar, excluir, adicionar, excluir", para que seja mais fácil analisar algo que um ser humano possa ler. Basicamente, transforme meu problema de caminho mais curto em um problema de caminho mais simples .
E, é claro, não crie resultados que sejam sempre "Excluir tudo , adicionar tudo "
Isso soa razoável?
Existe alguma precedência para o uso de uma heurística em uma implementação DIFF? Qual é a heurística?
O problema:
Se uma frase longa for excluída e outra longa, removida, mas eles compartilharem pelo menos uma palavra, diga "com". Deixar a palavra comum sozinha (não adicionando nem excluindo ela) criará o caminho mais curto. No entanto, isso realmente ofusca o contexto da mudança para um ser humano tentando ler uma impressão das mudanças.
Exemplo com DIFF atual:
- Texto antigo: Limpo : Lave com força e seque com ar comprimido.
- Novo texto: Limpo: Limpe com acetona e um pano sem fiapos.
- Alterar lista de notas:
- Altere "Powerwash e seque" para "Limpe com acetona"
- Mude "ar da loja" para "acetona e um pano sem fiapos"
Nota: "Alterar" é usado em vez de "excluir 'shop air', adicionar 'acetona'"
Como você pode ver, a segunda nota perde TODO o contexto e sem ainda olhar para o conjunto de textos antigos e novos completos, você não consegue entender o que isso significa.
Nota sobre pontuação:
Eu delimitei a pontuação como "palavras" separadas para obter
- Adicionar "("
ao invés de
- Altere "Reparar" para "(Reparar"
porque isso era desagradável. No entanto, isso significa que, se houver até uma vírgula nos dois textos (em oposição à palavra "com" no exemplo anterior), a mesma coisa acontece.
Solução possível:
Eu acho que poderia usar um algoritmo diferente de localização de caminhos que me desse a flexibilidade de adicionar peso a diferentes "caminhos" de mudança que podem fazer mais sentido para uma pessoa. Talvez eu pudesse até fazer viagens para nós contendo pontuação com pouco peso (sem ter certeza de como isso afetaria outras coisas).
Então pude obter o exemplo anterior para listar o seguinte:
- Alterar lista de notas:
- Altere "Powerwash e seque com ar de loja" para "Limpe com acetona e um pano sem fiapos"
Vejo! Muito mais claro!
Sei que sofreria um impacto no desempenho e talvez eu precise fazer uma revisão bastante importante do meu programa, mas é mais importante ter o resultado final que desejo.
Bottom Line:
Novamente, existe alguma precedência para o uso de uma heurística em uma implementação DIFF, e o que é?
Outros pensamentos? Um investimento de tempo razoável? Outras ideias? Outros algoritmos?
Desde já, obrigado!
EDITAR:
Tentei esclarecer / solidificar minha pergunta e generalizá-la para adicionar uma heurística ao meu algoritmo, em vez de usar A *. Basicamente, a mesma coisa neste caso, mas ainda acho mais preciso agora. Este post foi interessante.