柔軟なDIFF実装のための発見的アプローチ


12

作業中のドキュメントリビジョンを比較するために、DIFF実装を作成しました。O(ND)差分アルゴリズムとそのバリエーションに基づいています。

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

短い質問

私はA *と「ターン」にペナルティを追加するヒューリスティックを使用しようと考えていました。アイデアはしている滑らか人間が読むことができる何かに解析することが容易であるように「削除、追加、追加、削除、追加、削除」不要に。基本的に、私の最短経路問題を最も単純な経路問題に変えてください。

そしてもちろん、常に出力作成「削除しないすべてのものを、追加のすべてを

これは理にかなっていますか?

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

問題:

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

現在のDIFFの例:

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

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

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

句読点に関する注意:

句読点を別の「単語」として区切り、次のようにします

  • 追加 "("

の代わりに

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

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

可能な解決策:

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

次に、前の例を取得して以下をリストできます。

  • メモリストの変更:
    • 「パワーウォッシュとショップエアでブロードライ」を「アセトンと糸くずの出ない布で拭いてください」に変更します。

見る!より明確に!

パフォーマンスに打撃を与えることはわかっているので、プログラムの大幅なオーバーホールを行う必要があるかもしれませんが、最終結果を得ることがより重要です。

ボトムライン:

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

他の考え?合理的な時間投資ですか?他のアイデア?他のアルゴリズム?

前もって感謝します!

編集:

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

回答:


1

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

ステップ1:追加、削除、および修正された文を識別する。

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

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

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


これは表示の問題にのみ対処し、ヒューリスティックマッチングの主な問題には対処しません。
アダムザッカーマン14年

2番目の段落を読みましたか?
user2987828

やった。説明しようとしていることを詳しく説明していただけますか?私の最初の(そして2番目の)読書は、情報を処理するのではなく、表示する方法をまだ説明していると思うようになりました。
アダムザッカーマン14年

現在、htmlを使用して追加と削除をフォーマットできます。stackexchangeeditビューアは私にインスピレーションを与えたものです。これは私の問題ではありません。
ptpaterson

1
別のグラフ検索方法を使用して違いを見つける方法をよりよく理解する必要があります。私が持っているオリジナルのものは、すべてのエッジの重みが等しいグラフを効果的に作成し、深さ優先検索を実行して、最後まで追加/削除/保持のすべての動きを見つけます。異なる重みをエッジに追加し、ヒューリスティックを追加することを検討しています。
ptpaterson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.