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ę.
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ń.
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.
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.
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.
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:
- Tichy, Walter F., "the String-to-String Correction Problem with Block Moves" (1983). Informatyka Raporty Techniczne. Przekaz 378.
- W latach 1975-1998 miejscowość administracyjnie należała do województwa siedleckiego.]}
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:
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
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