Kodowanie gramatykowe

Z Wikipedii, wolnej encyklopedii

Kodowanie gramatykowe (ang. grammar-based coding) – nazwa grupy algorytmów kodowania stosowanych w bezstratnej kompresji danych, w których dane wejściowe opisuje się gramatyką bezkontekstową, dąży się przy tym do minimalizacji ilości reguł. Następnie gramatyka jest kompresowana innymi metodami. Kodowanie sprawdza się m.in. w kompresji DNA oraz tekstów naturalnych, w których powtarzają się ciągi liter, ale często też całe słowa, frazy czy zdania.

Idea kodowania gramatykowego wykorzystuje powtórzenia ciągów liter, które są zastępowane specjalnymi symbolami (nieterminalnymi). Np. w tekście „aaabaaacaaadaaae” powtarza się ciąg „aaa”, stąd gramatyka, która go opisuje może składać się z dwóch reguł:

  1. – reguła pomocnicza, zapamiętująca powtórzenie;
  2. – reguła główna, opisująca cały tekst (gdzie to symbol startowy).

Istnieją dwa podejścia do budowania gramatyki:

  1. Kodowanie rozpoczyna się od pustego ciągu, do którego dopisywane są kolejne litery z tekstu i gdy zajdzie potrzeba, tworzone są nowe reguły pomocnicze. Metody działające według tego schematu:
  2. Kodowanie rozpoczyna się od wejściowego tekstu i w wyniku jego całościowej analizy podejmowane są decyzje o dodaniu nowych reguł. Metody działające według tego schematu:
    • Multilevel Pattern Matching (MPM),
    • Byte Pair Encoding (BPE),
    • Greedy.

LZ78, LZW[edytuj | edytuj kod]

 Osobne artykuły: LZ78LZW.

Chociaż metoda LZ78 (i pochodne) jest klasyfikowana jako kodowanie słownikowe, obecnie rozważa się ją także w kategoriach kodowania gramatykowego. Podstawowym krokiem kodowania jest dodawanie do słownika konkatenacji najdłuższego słowa ze słownika pasującego do początku niezakodowanych jeszcze danych oraz kolejnego symbolu; np. jeśli do zakodowania jest słowo „wiki”, a w słowniku istnieje „wik”, to do słownika trafia „wik” + „i”.

Z punktu widzenia kodowania gramatykowego słownik jest tożsamy z listą reguł, zaś jego rozszerzenie z dodaniem nowej; np. jeśli istnieje reguła i ma zostać zakodowane „wiki”, wówczas dodawana jest nowa reguła

Sequitur[edytuj | edytuj kod]

 Osobny artykuł: Sequitur.

Multilevel Pattern Matching (MPM)[edytuj | edytuj kod]

Uniwersalna metoda MPM została opracowana przez Johna Kieffere, En-hui Yanga, Gregora Nelsona oraz Pamelę Cosman ([MPM2000]). Jednakże jej specjalny przypadek był znany już w latach 70. XX wieku i stosowany w zapisie oraz działaniach na funkcjach boolowskich (binary decision diagrams – BDD); metoda ta była już wówczas traktowana jako pewna forma kompresji danych.

W MPM kodowany tekst jest rekurencyjnie dzielony na podsłowa, następnie wszystkie słowa na tym samym poziomie podziału są zamieniane na reguły mające po prawej stronie słowa z głębszego poziomu. MPM zakłada dowolny podział, na 2, 3, 4 i więcej części.

Na przykład kodowanie tekstu aabbaaabababaaab dla podziałów na 2 części przebiega następująco:

  • poziom 0 = produkcje:
  • poziom 1 = produkcje:
  • poziom 2 = produkcje:
  • poziom 3 = produkcje:

Jak widać już przy drugim podziale ujawniają się powtórzenia – zamiast ciągów, są 3 różne podobnie na kolejnym – zamiast ciągów, są zaledwie 3 różne

Byte Pair Encoding (BPE)[edytuj | edytuj kod]

Metoda została opisana w pracy [BPE1999]. Nie daje ona wyraźnie lepszej kompresji danych – współczynniki kompresji, a także czas kompresji są gorsze niż popularnych metod opartych na LZ77 czy LZ78 (np. gzip). Jednak wyszukiwanie wzorców w skompresowanych tekstach jest szybsze i łatwiejsze – nie jest wymagana dekompresja.

Tworzenie gramatyki (kompresowanie) polega na iteracyjnym dodawaniu nowych reguł dla najczęściej powtarzających się par symboli w produkcji startowej.

Np.

Greedy[edytuj | edytuj kod]

Pomysłodawcami metody opisanej w [GRE2000] są Aleberto Apostolico oraz Stefano Lonardi. Metoda greedy (zachłanna) rozpoczyna od całego tekstu, następnie wyszukiwany jest ciąg, którego zastąpienie przez wprowadzenie nowej produkcji spowoduje maksymalne skrócenie gramatyki. Zasada działania jest więc dość podobna do opisanej metody BPE, z tą różnicą, że kryteria wyboru ciągu są bardziej złożone.

Eksperymenty autorów wykazały, że metoda daje lepsze współczynniki kompresji niż popularne kompresory gzip, bzip2 i compress[1].

Zobacz też[edytuj | edytuj kod]

Przypisy[edytuj | edytuj kod]

Bibliografia[edytuj | edytuj kod]

  • Eric Lehman: Approximation Algorithms for Grammar-Based Data Compression. luty 2002, s. 37–76. (ang.).
  • [BPE1999] Yusuke Shibata, Takuya Kida, Shuichi Fukamachi, Masayuki Takeda, Ayumi Shinohara, Takeshi Shinohara, Setsuo Arikawa: Byte pair encoding: a text compression scheme that accelerates pattern matching. 1999. (ang.).
  • [MPM2000] John Kieffer, En-hui Yang, Gregory Nelson, Pamela Cosman: Universal lossless compression via multilevel pattern matching. 2000. (ang.).
  • [GRE2000] Aleberto Apostolico, Stefano Lonardi: Off-Line Data Compression by Textual Substitution. 2000. (ang.).