Porównanie tekstów (diff) - różnice krok po kroku

Wklej obie wersje tekstu, a porównywarka podświetli różnice i policzy procent podobieństwa w trybie słów, wierszy albo znaków.

Wszystko liczy się w Twojej przeglądarce - porównywany tekst nie opuszcza tego urządzenia.

Tekst oryginalny
Tekst zmieniony
Jednostka porównania

Widok wyniku

Wynik porównania
-Podobieństwo
0Dodane
0Usunięte
0Niezmienione

Wersja oryginalna - na czerwono fragmenty usunięte.

Wklej oba teksty i kliknij „Porównaj”.

Wersja zmieniona - na zielono fragmenty dodane.

Wynik pojawi się tutaj.
Szczegóły
Elementy w tekście A0
Elementy w tekście B0

„Element” to jednostka porównania: wiersz, słowo albo pojedynczy znak - zależnie od wybranego trybu.

Wczytaj pliki

Możesz też przeciągnąć pliki wprost na pola tekstowe. Obsługujemy pliki tekstowe zapisane w UTF-8; dokumenty Word i PDF trzeba najpierw otworzyć i skopiować z nich treść.

Jak używać

  1. Wklej pierwszą wersję tekstu w lewe pole, a drugą w prawe. Możesz też przeciągnąć na nie dwa pliki TXT albo wskazać je w kolumnie po prawej.
  2. Wybierz jednostkę porównania. Domyślne „Słowa” sprawdzają się przy tekstach ciągłych, „Wiersze” przy kodzie i plikach konfiguracyjnych, „Znaki” przy krótkich napisach, w których liczy się każda litera.
  3. Kliknij „Porównaj”, a fragmenty usunięte zobaczysz na czerwonym tle z przekreśleniem, dodane zaś na zielonym.
  4. Przełącz widok na „Scalony”, jeśli wolisz jeden strumień tekstu z zaznaczonymi zmianami, albo na „Tylko podobieństwo”, gdy interesuje Cię sam wynik procentowy.
  5. Włącz „Ignoruj białe znaki”, gdy teksty różnią się wyłącznie formatowaniem, i „Ignoruj wielkość liter”, gdy nie ma znaczenia, czy wyraz zaczyna się wielką literą.
  6. Skopiuj podsumowanie liczbowe przyciskiem pod wynikiem albo cały widok scalony, jeśli chcesz wkleić go do wiadomości.

Wskazówki

  • Podobieństwo liczymy jako podwojoną liczbę wspólnych elementów podzieloną przez sumę długości obu tekstów. Dwa identyczne teksty dają 100%, a teksty bez jednego wspólnego słowa - 0%.
  • Algorytm najdłuższego wspólnego podciągu ma złożoność iloczynową, więc koszt rośnie z iloczynem długości obu tekstów. Wspólny początek i koniec odcinamy przed właściwym porównaniem, więc drobna poprawka w środku długiego dokumentu liczy się natychmiast.
  • Przy bardzo długich tekstach w trybie znaków narzędzie odmówi porównania i zaproponuje tryb wierszy. To świadome ograniczenie, bo pełna tablica dla dwóch tekstów po 100 tysięcy znaków zajęłaby dziesiątki gigabajtów pamięci.
  • Narzędzie nie wykrywa przeniesienia fragmentu w inne miejsce - akapit przesunięty na koniec dokumentu zobaczysz jako usunięty w jednym miejscu i dodany w drugim.

Porównujesz listy pozycji zamiast tekstu ciągłego? Wygodniejsze będzie porównanie dwóch list. Słownictwo dwóch tekstów zestawi natomiast licznik słów w trybie porównania.

Co robi porównywarka tekstu

Narzędzie odpowiada na pytanie, co dokładnie zmieniło się między dwiema wersjami tego samego dokumentu, i wskazuje położenie wszystkich różnic w tekście. Zamiast czytać obie wersje równolegle i wyłapywać zmiany wzrokiem, dostajesz je podświetlone - usunięte fragmenty na czerwono, dodane fragmenty na zielono. To ten sam mechanizm, z którego programiści korzystają od kilkudziesięciu lat pod nazwą diff, przystosowany do tekstu pisanego. Anglojęzyczne nazwy tej klasy narzędzi brzmią diff checker albo text compare. Wersje można wklejać ze schowka, a przy dłuższych materiałach wygodniej pracować z plikami TXT upuszczonymi na pola tekstowe.

Kancelaria chce sprawdzić różnice, które druga strona wprowadziła w projekcie umowy, redaktor zestawia wersję sprzed korekty z wersją po niej, a tłumacz szuka poprawek, które klient wprowadził w tłumaczeniach. Zdarzają się użycia prostsze, na przykład sprawdzenie, czy skopiowany fragment regulaminu jest identyczny z oryginałem. Śledzenie zmian w dokumentach z edytora tekstu pokazuje mniej więcej to samo, ale wymaga włączenia przed edycją przez obie strony, a porównywarka radzi sobie po fakcie, mając do dyspozycji dwa gotowe pliki.

Algorytm najdłuższego wspólnego podciągu

Porównanie sprowadza się do problemu najdłuższego wspólnego podciągu (LCS). Dla dwóch ciągów elementów szukamy najdłuższej sekwencji obecnej w obu, niekoniecznie ciągłej, ale z zachowaniem kolejności. Wszystko poza tą sekwencją jest różnicą, w której elementy pierwszego tekstu zostają zapisane jako usunięcia, a elementy drugiego jako dodania.

Liczymy to metodą programowania dynamicznego. Budujemy tablicę o wymiarach odpowiadających długościom obu tekstów i wypełniamy ją, przechodząc element po elemencie. Gdy dwa elementy są równe, długość wspólnego podciągu rośnie o jeden, w przeciwnym razie bierzemy lepszy z dwóch wcześniejszych wyników. Potem cofamy się po tablicy od końca i odczytujemy, które elementy zostały dopasowane.

Implementacja jest własna, napisana w JavaScripcie od zera na potrzeby tego serwisu. Wiele porównywarek opiera się na gotowej bibliotece diff-match-patch, tutaj kod wczytuje się razem ze stroną i porównanie odbywa się w przeglądarce, bez sięgania po cudze pliki z zewnętrznych serwerów.

Dlaczego długie teksty mają limit

Koszt algorytmu jest iloczynem długości obu tekstów. Dwa teksty po tysiąc słów dają milion komórek tablicy i liczą się w ułamku sekundy, a dwa teksty po sto tysięcy znaków dają dziesięć miliardów komórek, czyli dziesiątki gigabajtów pamięci. Limit wynosi cztery miliony porównań i po jego przekroczeniu narzędzie pokazuje komunikat zamiast zawieszać kartę przeglądarki.

Zanim jednak dojdzie do liczenia tablicy, odcinamy wspólny początek i wspólny koniec obu tekstów. W praktyce działa to bardzo skutecznie, bo poprawka jednego zdania w środku długiego dokumentu zostawia do porównania okolice tej poprawki zamiast całego materiału. Gdy mimo to trafisz na limit, przełącz jednostkę na wiersze - wierszy jest zawsze o rząd wielkości mniej niż znaków. Porównanie całych książek wymaga podziału na rozdziały, bo dwa teksty po pięć tysięcy wierszy to już dwadzieścia pięć milionów porównań.

Trzy jednostki porównania

Tryb słowny jest ustawieniem domyślnym, bo porównanie tekstu ciągłego najlepiej wychodzi wyraz po wyrazie, a zmiana jednego słowa zostaje wtedy pokazana jako zmiana tego słowa zamiast całego akapitu. Tryb wierszy idzie linia po linii i pasuje do materiałów o stałej strukturze, od kodu i plików konfiguracyjnych po listy i pliki log. Tryb znaków porównuje znak po znaku i przydaje się przy krótkich napisach, numerach kont albo kodach rabatowych, gdzie różnica bywa jednocyfrowa.

Wybór trybu wpływa też na wynik procentowy, bo zmienia jednostkę, w której mierzymy podobieństwo. Ten sam materiał może dać 85% w trybie słów i 94% w trybie znaków, bo zmieniony wyraz to jeden element z kilkuset słów, ale tylko kilka znaków z kilku tysięcy. Obie liczby są poprawne, mierzą po prostu co innego.

Białe znaki, wielkość liter i końce wierszy

Dwa pola wyboru pod tekstami zmieniają to, co algorytm uznaje za element identyczny. Zaznaczenie „Ignoruj białe znaki” usuwa z porównania wszystkie odstępy, od pojedynczej spacji po tabulator, więc tekst przeklejony z PDF-u ze złamanymi wierszami przestaje różnić się od tej samej treści w jednym akapicie. Zaznaczenie „Ignoruj wielkość liter” sprowadza obie wersje do małych liter według polskich reguł, więc różnica wielkości liter przestaje być zmianą, a wynik podświetla wyłącznie te miejsca, w których faktycznie zmieniono słowa.

Osobny kłopot sprawiają końce wierszy. Windows kończy wiersz parą znaków CR i LF, systemy z rodziny Unix i macOS samym LF, więc plik przeniesiony z jednego systemu na drugi potrafi pokazać każdy wiersz jako zmieniony, choć treść pozostaje identyczna co do litery. W trybie wierszy nie ma to znaczenia, bo tekst dzielimy na wiersze niezależnie od użytego separatora. W trybie słów i znaków wystarczy włączyć „Ignoruj białe znaki”, żeby różnica zniknęła.

Prywatność przy dokumentach poufnych

Do porównywarki trafiają materiały, których lepiej nikomu nie wysyłać - projekty umów, oferty przetargowe, dokumentacja wewnętrzna, akta z danymi osobowymi. Większość dostępnych w sieci porównywarek wysyła oba teksty na swój serwer i tam wykonuje obliczenia, bo tak jest prościej napisać.

Tutaj porównanie odbywa się w przeglądarce. Przeglądarka porównuje tekst na Twoim urządzeniu i tam trzyma obie wersje aż do zamknięcia karty, więc na naszym serwerze nic nie zostaje. Możesz to zweryfikować bez zaufania nam na słowo. Otwórz narzędzia deweloperskie, przejdź do zakładki „Sieć”, wklej teksty i kliknij „Porównaj” - lista zapytań wychodzących pozostanie pusta. Po wczytaniu strony możesz też odłączyć się od internetu, a porównywarka będzie działać dalej.

Najczęstsze pytania

Czy moje teksty są gdziekolwiek wysyłane?

Nie wysyłamy ich nigdzie, bo porównanie odbywa się w przeglądarce i wykonuje je kod strony. Sprawdzisz to w zakładce „Sieć” w narzędziach deweloperskich, gdzie po kliknięciu „Porównaj” nie pojawia się żadne zapytanie. Po wczytaniu strony narzędzie działa nawet bez połączenia z internetem.

Jak liczycie procent podobieństwa dwóch tekstów?

Jako podwojoną liczbę wspólnych elementów podzieloną przez sumę długości obu tekstów, wyrażoną w procentach. Dwa identyczne teksty dają 100%, a teksty bez jednego wspólnego elementu 0%. Wynik zależy od wybranej jednostki porównania, więc zestawiaj tylko liczby uzyskane w tym samym trybie.

Czy ta porównywarka wykrywa plagiat w pracy dyplomowej?

Sprawdza podobieństwo dwóch konkretnych tekstów, które sam wskażesz, i na tym kończy się jej zakres. Internet ani baza prac dyplomowych nie są przeszukiwane. Wysokie podobieństwo dwóch dokumentów bywa przesłanką, ale wykrycie plagiatu wymaga porównania z całym zbiorem publikacji, a taka operacja działa wyłącznie po stronie serwera.

Dlaczego przeniesiony akapit pokazuje się jako usunięty i dodany?

Bo algorytm najdłuższego wspólnego podciągu zachowuje kolejność elementów. Fragmentu przesuniętego w inne miejsce nie da się dopasować bez łamania kolejności, więc trafia do wyniku dwa razy, jako usunięcie w starym położeniu i dodanie w nowym. Wykrywanie przeniesień to osobna klasa algorytmów, znacznie kosztowniejsza.

Co zrobić, gdy pojawia się komunikat o zbyt długich tekstach?

Przełącz jednostkę porównania na wiersze - wierszy jest o rząd wielkości mniej niż słów, a słów mniej niż znaków, więc zmieścisz się w limicie czterech milionów porównań. Gdy limit nadal blokuje wynik, podziel dokument na części i porównaj je osobno.

Jakie pliki mogę wczytać do porównania?

Pliki tekstowe, czyli TXT, MD, CSV i inne zapisane zwykłym tekstem w kodowaniu UTF-8, o rozmiarze do 5 MB. Dokumenty Word, PDF i arkusze kalkulacyjne trzymają tekst w formacie binarnym, więc otwórz je w odpowiednim programie, zaznacz treść i wklej ją do pola.

Czy mogę porównywać pliki zapisane w innym kodowaniu?

Pliki wczytujemy jako UTF-8, bo to dziś standard w plikach tekstowych. Starszy plik z kodowaniem Windows-1250 wyświetli się z przekłamanymi polskimi znakami i porównanie oznaczy każdy taki wyraz jako zmieniony. Otwórz go wtedy w edytorze, zapisz ponownie w UTF-8 i wczytaj jeszcze raz. Tekst wklejony ze schowka nie ma tego problemu, bo przeglądarka przekazuje go już zdekodowanego.

Czy narzędzie radzi sobie z końcami wierszy Windows i Unix?

W trybie wierszy tak. Separator wiersza rozpoznajemy w obu wariantach, więc parę CR i LF z Windowsa traktujemy równorzędnie z samym LF z systemów Unix. W trybie słów i znaków każdy dodatkowy znak CR liczy się jako różnica, więc zaznacz „Ignoruj białe znaki”, a porównanie przestanie brać pod uwagę różnice białych znaków.

Czy porównywarka tekstów działa na telefonie?

Działa, choć układ się zmienia. Narzędzie online otwiera się w przeglądarce telefonu tak samo jak na komputerze, a poniżej 720 pikseli szerokości ekranu dwie kolumny z tekstami układają się jedna pod drugą, więc wygodniejszy bywa wtedy widok scalony albo sam procent podobieństwa. Tryb znaków przy długich tekstach obciąża telefon mocniej niż komputer, dlatego zacznij od trybu słów.

Czy w ten sposób porównam kod źródłowy?

Tak, w trybie wierszy, który idzie linia po linii i pokazuje różnice tak, jak robi to diff w konsoli. Do porównywania plików konfiguracyjnych, fragmentów JavaScriptu albo wycinków pliku log tryb wierszy w zupełności wystarcza, a programista dostaje wynik bez zakładania repozytorium. Przy pracy nad całym repozytorium sensowniejsze zostaje jednak git diff, bo zna historię zmian i porównuje wiele plików naraz.