Esnek DIFF Uygulaması için Sezgisel Yaklaşım


12

İş yerinde belge revizyonlarını karşılaştırmak için bir DIFF uygulaması oluşturdum. Bir O (ND) Fark Algoritması ve Varyasyonlarına dayanır .

Önemli hale gelen bir şey, değişikliklerin listesini alıp okunabilir metne yorumlamaktır. Mevcut algoritma çok verimli olsa da, o kadar çok ki, genişletilmesi zor.

Kısa Soru

A * ve "dönüşler" için ceza ekleyen bir buluşsal yöntem kullanmaya çalışmayı düşünüyordum. Fikir, bir insanın okuyabileceği bir şeye ayrıştırılmasını kolaylaştırmak için gereksiz "ekleme, silme, ekleme, silme, ekleme, silme" yi düzeltmektir . Temel olarak, en kısa yol sorunumu en basit yol sorununa dönüştürün.

Elbette her zaman çıkış yaratmak değil Ve "Sil herşeyi , ekleme herşeyi "

Kulağa makul geliyor mu?

Bir DIFF uygulamasında buluşsal yöntem kullanmanın bir önceliği var mı? Buluşsal yöntem nedir?

Sorun:

Uzun bir cümle silinir ve başka bir uzun cümle kaldırılır, ancak en az bir kelime paylaşırlarsa, "ile" deyin. Ortak sözcüğü tek başına bırakmak (hem eklemeden hem de silmeden) en kısa yolu yaratacaktır. Bununla birlikte, bu sadece değişikliklerin bir baskısını okumaya çalışan bir insandaki değişimin bağlamını gizler.

Geçerli DIFF örneği:

  • Eski metin: Temiz: Powerwash ve dükkan havasıyla fönleyin.
  • Yeni metin: Temiz: Aseton ve tüy bırakmayan bir bezle silin.
  • Not Listesini Değiştir:
    • "Powerwash ve fön makinesini kurut" işlevini "Asetonla sil" olarak değiştirin
    • "Mağaza havası" nı "aseton ve tüy bırakmayan bir bez" olarak değiştirin

Not: " Mağaza havasını sil" yerine "Değiştir" kullanılır, "aseton" ekleyin "

Gördüğünüz gibi, ikinci not TÜM bağlamı kaybeder ve hala eski ve yeni metin metin kümelerine bakmadan ne anlama geldiğini anlayamazsınız.

Noktalama işaretleri hakkında not:

Noktalama işaretlerini ayrı "kelimeler" olarak sınırladım, böylece

  • Ekle "("

onun yerine

  • "Onar" ı "(Onar") olarak değiştirin

çünkü bu iğrençti. Bununla birlikte, bu, her iki metinde de virgül varsa (önceki örnekte "ile" kelimesinin aksine) aynı şeyin gerçekleştiği anlamına gelir.

Olası çözüm:

Bunun yerine bana bir kişi için daha anlamlı olabilecek farklı değişiklik "yolları" kilo eklemek için esneklik verebilir farklı bir yol bulma algoritması kullanabilirsiniz düşünüyorum. Belki, noktalama işaretleri içeren düğümlere seyahat etmenin bile çok az ağırlığı var (bunun diğer şeyleri nasıl etkileyeceğinden emin değilim).

Sonra aşağıdakileri listelemek için önceki örneği alabilirim:

  • Not Listesini Değiştir:
    • "Powerwash'ı ve mağaza havasıyla fönleyin" seçeneğini "Aseton ve tüy bırakmayan bir bezle silin" olarak değiştirin

Görmek! Çok daha net!

Performansta bir isabet alacağımı biliyorum ve programımın oldukça büyük bir revizyonunu yapmak zorunda kalabilirim, ancak istediğim sonuca ulaşmak daha önemli.

Sonuç olarak:

Yine, bir DIFF uygulamasında buluşsal yöntem kullanmanın bir önceliği var mıdır ve nedir?

Diğer düşünceler? Makul bir zaman yatırımı mı? Diğer fikirler? Diğer algoritmalar?

Şimdiden teşekkürler!

DÜZENLE:

Sorumu açıklığa kavuşturmaya / sağlamlaştırmaya çalıştım ve sorumu A * kullanmak yerine algoritmamı sezgisel olarak eklemeye genelleştirdim. Temelde bu durumda aynı şey, ama şimdi daha doğru düşünüyorum. Bu gönderi anlayışlıydı.

Yanıtlar:


1

Vimdiff benzeri bir sürümde yapabilirsiniz:

Adım 1: Eklenen, silinen ve değiştirilen cümleleri belirleme.

Adım 2: her değiştirilen cümle için, ilk ve son değiştirilen kelimeleri bulun ve bu iki kelime arasında olmayan herhangi bir şeyi kesin.

Tutarlı daha fazla dilbilgisi yapısını korumanız gerekiyorsa, http://www.languagetool.org/ veya bu yayında gösterilen başka bir iç kısma bakın .

Sunum hakkında: cümlenin her iki versiyonunu da birbiri ardına sunabilirsiniz. Her değişiklik için bağlamı göstermek isteyebilirsiniz. İlham için, eklenen metni mavi olarak yazdırabilen lateksdiff'e metnin son sürümünde son yer ve dipnotlarda silinen metin (hatta uyumlu \usepackage[para]{footmisc}) bakın.


Bu sadece sezgisel eşleşmenin ana sorununu değil, görüntüleme meselelerini ele alır.
Adam Zuckerman

İkinci paragrafımı okudun mu?
user2987828

Yaptım. Açıklamaya çalıştığınız şeyi genişletebilir misiniz? Bunu ilk (ve ikinci) okumam, bilgiyi hala nasıl görüntüleyeceğinizi değil, nasıl görüntüleyeceğinizi açıkladığınızı düşündürdü.
Adam Zuckerman

Şu anda ekler ve kaldırır biçimlendirmek için html kullanabilirsiniz, stackexchange düzenleme görüntüleyici bana ilham kaynağı olan şeydir. Bu benim sorunum değil.
ptpaterson

1
Farklılıkları bulmak için nasıl farklı bir grafik arama yöntemi kullanabilirsiniz daha iyi anlamak gerekir. Orijinal olan, tüm kenarların eşit ağırlıklarına sahip bir grafiği etkili bir şekilde oluşturur ve sonuna kadar ekleme / kaldırma / tutma hareketlerinin tümünü bulmak için önce derinlik araması yapar. Kenarlara farklı ağırlıklar eklemeyi ve buluşsal yöntem eklemeyi düşünüyorum.
ptpaterson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.