Algorytm porównywania tekstu

Mamy wymóg w projekcie, że musimy porównać dwa teksty (update1, update2) i wymyślić algorytm do określenia, ile słów i ile zdań się zmieniło.

Czy są jakieś algorytmy, których mogę użyć? Nawet nie szukam kodu. Jeśli znam algorytm, mogę go zakodować w Javie. Dziękuję.

Author: java_mouse, 2012-01-30

6 answers

Zazwyczaj osiąga się to poprzez znalezienie najdłuższego wspólnego ciągu (potocznie zwanego problemem LCS). Tak działają narzędzia takie jak diff. Oczywiście, {[0] } jest narzędziem zorientowanym liniowo i wygląda na to, że Twoje potrzeby są nieco inne. Zakładam jednak, że już skonstruowałeś jakiś sposób porównywania słów i zdań.

 15
Author: FatalError,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-30 14:40:52

Algorytm porównywania sekwencji O(NP) jest używany przez silnik diff subversion.

Dla twojej informacji, na poniższej stronie github znajdują się implementacje z różnymi językami programowania.

Https://github.com/cubicdaiya/onp

 11
Author: cubicdaiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 11:05:14

Jakiś wariant diff może być pomocny, np wdiff

Jeśli zdecydujesz się opracować własny algorytm, będziesz musiał zająć się sytuacją, w której zdanie zostało wstawione. Na przykład dla następujących dwóch dokumentów:

The men are bad. I hate the men

I

The men are bad. John likes the men. I hate the men

Twoje narzędzie powinno być w stanie spojrzeć w przyszłość, aby rozpoznać, że w drugim {[2] } nie zostało zastąpione przez John likes the men, ale zamiast tego jest nietknięte, a przed nim wstawiono nowe zdanie. tj. it powinien zgłaszać wstawianie zdania, a nie zmianę czterech słów, po których następuje nowe zdanie.

 8
Author: Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-30 14:44:20

Specyficznym algorytmem używanym przez diff i większość innych narzędzi porównawczych jest algorytm różnicy o(ND) Eugene ' a Myera i jego wariacje . Jest to implementacja Javy dostępna w pakiecie java-diff-utils.

 5
Author: Zoë Peterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-30 15:37:19

Oto dwie prace opisujące inne algorytmy porównywania tekstu, które powinny generować "lepsze" (np. mniejsze, bardziej znaczące) różnice:

Pierwsza gazeta cytuje drugi i wspomina o tym o swoim algorytmie:

Heckel [3] zwrócił uwagę na podobne problemy z technikami LCS i zaproponował algorytm liniowo-liniowy do wykrywania ruchów bloków. Algorytm wykonuje odpowiednio jeśli w łańcuchach jest kilka zduplikowanych symboli. Jednak algorytm daje w przeciwnym razie słabe wyniki. Na przykład, biorąc pod uwagę dwa ciągi aabb i bbaa , Algorytm heckela nie wykrywa żadnego wspólnego fragmentu.

The pierwszy artykuł został wymieniony w tej odpowiedzi , a drugi w tej odpowiedzi , oba na podobne pytanie SO:

 4
Author: Kenny Evitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:10

Trudność polega na wydajnym porównywaniu dużych plików z dobrą wydajnością. Dlatego zaimplementowałem odmianę algorytmu Myers O(ND) diff - który działa dość dobrze i dokładnie (i wspiera filtrowanie oparte na wyrażeniach regularnych):

Algorytm można przetestować tutaj: becke.ch compare tool web application

I trochę więcej informacji na stronie głównej: becke.ch compare tool

 1
Author: becke.ch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 21:23:18