Abordagem heurística para implementação flexível de DIFF


12

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.

Respostas:


1

Você pode fazer em uma versão semelhante a vimdiff:

Etapa 1: identificando frases adicionadas, excluídas e modificadas.

Etapa 2: para cada frase modificada, localize a primeira e a última palavra alterada e corte qualquer coisa que não esteja entre essas duas palavras.

Se você precisar manter uma estrutura gramatical mais coerente, consulte os internos de http://www.languagetool.org/ ou outro mostrado nesta publicação .

Sobre a apresentação: você pode apresentar as duas versões dessa frase uma sob a outra. Você pode mostrar o contexto de cada alteração. Para se inspirar, observe latexdiff, que pode imprimir o texto adicionado em azul em, é o local final na versão final do texto e o texto excluído nas notas de rodapé (mesmo compatíveis com \usepackage[para]{footmisc}).


Isso aborda apenas questões de exibição, não a principal questão da correspondência heurística.
Adam Zuckerman

Você leu meu segundo parágrafo?
user2987828

Eu fiz. Você poderia expandir o que está tentando explicar? Minha primeira (e segunda) leitura me levou a pensar que você ainda estava descrevendo como exibir as informações, não processá-las.
Adam Zuckerman

Atualmente, sou capaz de usar o html para formatar as adições e remoções. O visualizador de edição stackexchange foi o que me inspirou. Este não é o meu problema.
precisa saber é o seguinte

1
Preciso entender melhor como posso usar um método de pesquisa de gráfico diferente para encontrar as diferenças. O original que eu efetivamente cria um gráfico com pesos iguais de todas as arestas e realiza uma pesquisa em profundidade para encontrar todos os movimentos de adicionar / remover / manter até o fim. Estou pensando em adicionar pesos diferentes às arestas e adicionar uma heurística.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.