作業中のドキュメントリビジョンを比較するために、DIFF実装を作成しました。O(ND)差分アルゴリズムとそのバリエーションに基づいています。
重要になった1つのことは、変更のリストを取得し、それらを人間が読めるテキストに変換することです。現在のアルゴリズムは非常に効率的ですが、拡張するのが難しいほど非常に効率的です。
短い質問
私はA *と「ターン」にペナルティを追加するヒューリスティックを使用しようと考えていました。アイデアはしている滑らか人間が読むことができる何かに解析することが容易であるように「削除、追加、追加、削除、追加、削除」不要に。基本的に、私の最短経路問題を最も単純な経路問題に変えてください。
そしてもちろん、常に出力作成「削除しないすべてのものを、追加のすべてを」
これは理にかなっていますか?
DIFF実装でヒューリスティックを使用するための優先順位はありますか?ヒューリスティックとは何ですか?
問題:
長い文が削除され、別の長い文が削除されたが、少なくとも1つの単語を共有している場合、「with」と言います。一般的な単語を単独で(追加と削除の両方ではなく)残すと、最短パスが作成されます。ただし、これは実際に、変更から印刷物を読み取ろうとする人間に対する変更のコンテキストを難読化するだけです。
現在のDIFFの例:
- 古いテキスト: クリーン:ショップエアでパワーウォッシュとブロードライ。
- 新しいテキスト: クリーニング:アセトンと糸くずの出ない布で拭きます。
- メモリストの変更:
- 「Powerwash and blow dry」を「アセトンで拭く」に変更します
- 「ショップエア」を「アセトンと糸くずの出ない布」に変更します
注:「「ショップエア」の削除、「アセトン」の追加」の代わりに「変更」が使用されます。
ご覧のとおり、2番目のノートはすべてのコンテキストを失い、テキストの完全な古いテキストセットと新しいテキストセットを見ることなく、その意味を理解できません。
句読点に関する注意:
句読点を別の「単語」として区切り、次のようにします
- 追加 "("
の代わりに
- 「修復」を「(修復)」に変更します
これは不快だったからです。ただし、これは、両方のテキストにコンマさえある場合(前の例の "with"という単語とは対照的に)、同じことが起こることを意味します。
可能な解決策:
代わりに、異なるパス検索アルゴリズムを使用して、人にとってより意味のある異なる変更「パス」に重みを追加する柔軟性を与えることができると思います。たぶん、句読点を含むノードへの移動にほとんど重みを付けないようにすることもできます(これが他のものにどのように影響するかはわかりません)。
次に、前の例を取得して以下をリストできます。
- メモリストの変更:
- 「パワーウォッシュとショップエアでブロードライ」を「アセトンと糸くずの出ない布で拭いてください」に変更します。
見る!より明確に!
パフォーマンスに打撃を与えることはわかっているので、プログラムの大幅なオーバーホールを行う必要があるかもしれませんが、最終結果を得ることがより重要です。
ボトムライン:
繰り返しますが、DIFF実装でヒューリスティックを使用するための優先順位はありますか?
他の考え?合理的な時間投資ですか?他のアイデア?他のアルゴリズム?
前もって感謝します!
編集:
A *を使用するのではなく、質問を明確化/固化し、質問をアルゴリズムにヒューリスティックを追加するように一般化しようとしました。この例では基本的に同じことですが、今でもより正確だと思います。 この投稿は洞察に富んでいました。