web-dev-qa-db-ja.com

柔軟なDIFF実装のためのヒューリスティックなアプローチ

作業中のドキュメントリビジョンを比較するために、DIFF実装を作成しました。 An O(ND) Difference Algorithm and its Variationsに基づいています。

重要になったことの1つは、変更のリストを取得して、人間が読めるテキストに解釈することです。現在のアルゴリズムは非常に効率的ですが、非常に効率が高いため、拡張するのが困難です。

短い質問

私はA *と「ターン」にペナルティを追加するヒューリスティックを使用しようと考えていました。 スムーズに不要な「追加、削除、追加、削除、追加、削除」を行うことで、人間が読み取れるものに解析しやすくなります。基本的に、私のshortest path問題をsimplest path問題に変換します。

そしてもちろん、常に "Delete everything、Add everything"である出力を作成しないでください

これは合理的に聞こえますか?

DIFF実装でヒューリスティックを使用するための優先順位はありますか?ヒューリスティックとは何ですか?

問題:

長文が削除され、別の長文が削除されたが、少なくとも1つのWordを共有している場合は、「with」と言います。一般的なWordをそのままにしておく(追加と削除の両方を行わない)と、最短パスが作成されます。ただし、これは実際に、変更内容の印刷物を読み込もうとする人間に対する変更内容のコンテキストを難読化するだけです。

現在のDIFFの例:

  • 古いテキスト:クリーニング:パワーウォッシュして、ショップの空気でブロードライします。
  • 新しいテキスト:クリーニング:アセトンと糸くずの出ない布で拭きます。
  • 変更ノートリスト:
    • 「パワーウォッシュアンドブロードライ」を「アセトンで拭く」に変更
    • 「ショップエア」を「アセトンと糸くずの出ない布」に変更します。

注:代わりに「変更」が使用されます "「ショップエア」を削除し、「アセトン」を追加します"

ご覧のとおり、2番目のノートはすべてのコンテキストを失い、テキストの完全な新旧のテキストセットをまだ見ないと、それが何を意味するのか理解できません。

句読点に関する注意:

句読点を別々の「単語」として区切っているので、

  • 追加 "("

の代わりに

  • 「修復」を「(修復)」に変更します

これは不愉快だったからです。ただし、これは、両方のテキストにカンマでさえある場合(前の例の「with」という単語とは対照的)、同じことが発生することを意味します。

可能な解決策:

代わりに別のパス検索アルゴリズムを使用して、人にとってより意味のあるさまざまな変更「パス」に重みを追加できる柔軟性を与えることができると思います。たぶん、句読点を含むノードへの移動にほとんど重みを付けないようにすることもできます(これが他のことにどのように影響するかはわかりません)。

次に、前の例を取得して以下を一覧表示できます。

  • 変更ノートリスト:
    • 「Powerwashとショップの空気で乾かす」を「アセトンと糸くずの出ない布で拭く」に変更します

- 見る!より明確に!

パフォーマンスに影響が出ることは知っています。プログラムをかなり大幅に見直しなければならないかもしれませんが、最終的な結果を得ることがより重要です。

結論:

繰り返しますが、DIFF実装でヒューリスティックを使用するための優先順位はありますか?それは何ですか?

他の考え?妥当な時間投資?他のアイデア?他のアルゴリズム?

前もって感謝します!

編集:

A *を使用するのではなく、質問を明確化/整理し、質問を一般化して、アルゴリズムにヒューリスティックを追加しようとしました。この場合も基本的には同じですが、今でも正確だと思います。 この投稿 は洞察に満ちていました。

12
ptpaterson

あなたはvimdiffのようなバージョンで行うかもしれません:

ステップ1:追加、削除、変更された文を識別する。

ステップ2:変更された各文について、最初と最後に変更された単語を見つけ、これら2つの単語の間にないものを切り取ります。

より一貫した文法構造を維持する必要がある場合は、 http://www.languagetool.org/ の内部または この投稿 に示されている別の内部を確認してください。

プレゼンテーションについて:その文の両方のバージョンを上下に表示できます。各変更のコンテキストを表示することができます。インスピレーションを得るために、追加されたテキストを青で印刷できるlatexdiffを見てください。最終バージョンのテキストの最後の場所であり、脚注の削除されたテキストです( \usepackage[para]{footmisc} )。

1
user2987828