Wszystkie artykuły

Text Diff: jak algorytmy znajdują różnicę między dwoma tekstami

Społeczność tłumaczy KDE i GNOME na język polski od lat porównuje kolejne wersje plików .po linia po linii, żeby sprawdzić, które komunikaty faktycznie się zmieniły — a polska odmiana przez przypadki sprawia, że pozornie różne linie ("otwórz plik", "otwarcie pliku", "otwierając plik") bywają tym samym komunikatem w innej formie gramatycznej, którego diff nie potrafi rozpoznać jako powiązanego.

Najdłuższy wspólny podciąg

Klasyczne podejście do diff opiera się na znalezieniu najdłuższego wspólnego podciągu (LCS) wierszy między dwiema wersjami tekstu. Wiersze będące częścią tego podciągu uznaje się za niezmienione; wszystko inne oznacza się jako usunięte ze starej wersji lub dodane do nowej. Wynikiem jest minimalny zestaw zmian, a nie dowolna możliwa sekwencja usunięć i dodań.

Jak czytać wynik

Usunięte wiersze zwykle oznacza się - w kolorze czerwonym, a dodane + w kolorze zielonym. Wiersz „zmieniony" w potocznym sensie jest technicznie pokazywany jako usunięcie starego wiersza plus dodanie nowego — diff nie ma własnego pojęcia edycji wiersza w miejscu.

Dlaczego porównanie wiersz po wierszu nie zawsze jest intuicyjne

Wstawienie jednego nowego wiersza w środku tekstu może sprawić, że porównanie wiersz po wierszu pokaże wszystkie kolejne wiersze jako „zmienione", bo algorytm nie zawsze odróżnia wstawienie od masowej zamiany. Przy plikach tłumaczeń dochodzi dodatkowy problem: dwa wiersze mogą się różnić tylko końcówką fleksyjną, a diff i tak pokaże je jako całkowicie odrębne linie, bez żadnej wskazówki, że to ta sama fraza w innym przypadku.

Do czego się przydaje

  • Sprawdzenie, co dokładnie zmieniło się między dwiema wersjami pliku konfiguracyjnego lub dokumentu.
  • Przeglądanie code review z rozumieniem logiki algorytmu wyszukującego różnice.
  • Porównanie wyniku skryptu przed i po refaktoryzacji, aby potwierdzić brak regresji.

Diff na poziomie wierszy a na poziomie znaków

Porównanie wiersz po wierszu sprawdza się w przypadku kodu i plików konfiguracyjnych, ale dla prozy czy długiego zdania, w którym zmieniło się jedno słowo, oznaczy cały wiersz jako usunięty i dodany od nowa. Diff na poziomie słów lub znaków wewnątrz wiersza dokładniej pokazuje właśnie tę zmienioną końcówkę czy literę, kosztem wyższej złożoności obliczeniowej przy dużych tekstach.

Wypróbuj narzędzie