İş 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ı.