Pendekatan Heuristik untuk Implementasi DIFF yang Fleksibel

12

Saya telah membuat implementasi DIFF untuk membandingkan revisi dokumen di tempat kerja. Ini didasarkan pada Al Perbedaan (O) ND Algoritma dan Variasi-nya .

Satu hal yang menjadi penting adalah mengambil daftar perubahan dan menafsirkannya menjadi teks yang dapat dibaca manusia. Meskipun algoritma saat ini sangat efisien, sangat banyak sehingga sulit untuk diperluas.

Pertanyaan pendek

Saya sedang berpikir tentang mencoba menggunakan A * dan heuristik yang menambah hukuman untuk "berubah". Gagasannya adalah untuk melicinkan yang tidak perlu, "tambah, hapus, tambah, hapus, tambah, hapus" sehingga lebih mudah untuk menguraikan sesuatu yang bisa dibaca manusia. Pada dasarnya, ubah masalah jalur terpendek saya menjadi masalah jalur paling sederhana .

Dan tentu saja tidak membuat output yang selalu "Hapus semuanya , Tambah semuanya "

Apakah ini masuk akal?

Apakah ada prioritas untuk menggunakan heuristik dalam implementasi DIFF? Apa heuristiknya?

Masalah:

Jika kalimat panjang dihapus dan kalimat panjang lain dihapus, tetapi mereka berbagi setidaknya satu kata, ucapkan "dengan". Meninggalkan kata umum saja (dengan tidak menambahkan dan menghapusnya) akan membuat jalur terpendek. Namun, ini benar-benar hanya mengaburkan konteks perubahan ke manusia yang mencoba membaca cetakan dari perubahan.

Contoh dengan DIFF saat ini:

  • Teks lama: Bersihkan: Cuci bersih dan keringkan dengan udara toko.
  • Teks baru: Bersihkan: Bersihkan dengan aseton dan kain bebas serat.
  • Ubah Daftar Catatan:
    • Ubah "Powerwash dan blow dry" menjadi "Wipe with acetone"
    • Ubah "air shop" menjadi "aseton dan kain bebas serat"

Catatan: "Ubah" digunakan sebagai ganti "hapus 'udara toko', tambahkan 'aseton'"

Seperti yang Anda lihat, not kedua kehilangan SEMUA konteks dan tanpa masih melihat set teks penuh lama dan baru Anda tidak bisa mengerti apa artinya.

Catatan tentang Tanda Baca:

Saya telah membatasi tanda baca sebagai "kata-kata" yang terpisah sehingga saya akan mendapatkannya

  • Menambahkan "("

dari pada

  • Ubah "Perbaikan" menjadi "(Perbaikan"

karena ini menjengkelkan. Namun, itu berarti bahwa jika bahkan ada koma di kedua teks (sebagai lawan dari kata "dengan" pada contoh sebelumnya) hal yang sama terjadi.

Kemungkinan Solusi:

Saya pikir saya bisa menggunakan algoritma pencarian jalur yang berbeda sebagai gantinya yang dapat memberi saya fleksibilitas untuk menambah bobot pada "jalur" perubahan yang berbeda yang mungkin lebih masuk akal bagi seseorang. Mungkin, saya bahkan bisa melakukan perjalanan ke node yang memiliki tanda baca sedikit berat (tidak yakin bagaimana ini akan mempengaruhi hal-hal lain).

Maka saya bisa mendapatkan contoh sebelumnya ke daftar berikut ini:

  • Ubah Daftar Catatan:
    • Ubah "Powerwash dan keringkan dengan udara toko" menjadi "Bersihkan dengan aseton dan kain bebas serat"

Lihat! Jauh lebih jelas!

Saya tahu saya akan mendapat pukulan kinerja, dan saya mungkin harus melakukan perombakan besar-besaran terhadap program saya, tetapi yang lebih penting adalah mendapatkan hasil akhir yang saya inginkan.

Intinya:

Sekali lagi, apakah ada prioritas untuk menggunakan heuristik dalam implementasi DIFF, dan apa itu?

Pikiran lain? Investasi waktu yang masuk akal? Ide lain? Algoritma lainnya?

Terima kasih sebelumnya!

EDIT:

Saya mencoba untuk memperjelas / memantapkan pertanyaan saya dan menggeneralisasi pertanyaan saya untuk menambahkan heuristik ke algoritma saya, daripada menggunakan A *. Pada dasarnya hal yang sama dalam hal ini, tetapi saya masih berpikir lebih akurat sekarang. Posting ini berwawasan luas.

ptpaterson
sumber

Jawaban:

1

Anda mungkin melakukannya dalam versi yang mirip vimdiff:

Langkah 1: mengidentifikasi kalimat yang ditambahkan, dihapus dan dimodifikasi.

Langkah 2: untuk setiap kalimat yang dimodifikasi, cari kata-kata pertama dan terakhir yang diubah, dan potong apa saja di antara kedua kata ini.

Jika Anda perlu menjaga struktur tata bahasa yang lebih koheren, lihat internal http://www.languagetool.org/ atau yang lain yang ditunjukkan pada posting ini .

Tentang presentasi: Anda dapat menyajikan kedua versi kalimat itu satu di bawah yang lain. Anda mungkin ingin menunjukkan konteks untuk setiap perubahan. Untuk inspirasi, lihat latexdiff yang dapat mencetak teks yang ditambahkan dengan warna biru di adalah tempat terakhir dalam versi final teks, dan teks yang dihapus dalam catatan kaki (bahkan kompatibel dengan \usepackage[para]{footmisc}).

pengguna2987828
sumber
Ini hanya membahas masalah tampilan, bukan pertanyaan utama pencocokan heuristik.
Adam Zuckerman
Apakah Anda membaca paragraf kedua saya?
user2987828
Aku melakukannya. Bisakah Anda mengembangkan apa yang ingin Anda jelaskan? Pembacaan pertama (dan kedua) saya membuat saya berpikir bahwa Anda masih menggambarkan cara menampilkan informasi, bukan memprosesnya.
Adam Zuckerman
Saat ini saya dapat menggunakan html untuk memformat menambahkan dan menghapus, penampil edit stackexchange adalah apa yang mengilhami saya. Ini bukan masalah saya.
ptpaterson
1
Saya perlu lebih memahami bagaimana saya dapat menggunakan metode pencarian grafik yang berbeda untuk menemukan perbedaan. Yang asli yang saya miliki secara efektif membuat grafik dengan bobot yang sama dari semua sisi dan melakukan pencarian pertama yang mendalam untuk menemukan semua langkah tambah / hapus / pertahankan hingga akhir. Saya sedang mempertimbangkan menambahkan bobot yang berbeda ke tepi dan menambahkan heuristik.
ptpaterson