To dwa zazębiające się tematy. To co chcesz zrobić można by zamknąć w kanonie Web miningu
Jeśli natomiast tak bardzo chcesz algorytm, który znajdzie powtarzające się wzorce na stronie WWW, to możesz spróbować tego, co ostatnio nie pozwalało mi zasnąć:
Zapisujesz, w dynamicznej tablicy lub na jednokierunkowej liście powiązanej, kolejno przetwarzane tagi, czyli:
HTML => HEAD => /HEAD => BODY ...
Następnie tworzysz słownik (tablicę asocjacyjną), którego indeksem jest zbiór wszystkich tagów dostępnych na stronie lub ogólnie wszystkich tagów HTML. Każda pozycja słownika wskazuje na inny słownik, który posiada na początku pozycję "nodes" => lista węzłów.
Podczas parsowania dokumentu (x)HTML zapisujesz do dynamicznej tablicy / listy powiązanej kolejno przetwarzane tagi, tak jak to pokazałem powyżej. Następnie pozycję (z listy/tablicy) każdego przetwarzanego tagu dodajesz do "nazwa tagu"=>"nodes", tak że w konsekwencji pod "nazwa tagu" => "nodes" masz tablicę wystąpień danego tagu na liście wszystkich przetworzonych już elementów.
W momencie gdy przetwarzasz każdy tag i wrzucasz jego pozycję na listę powiązaną, sprawdzasz też czy gdzieś już ten tag nie wystąpił. Używasz do tego słownika. Jeśli tag wystąpił, to pobierasz wszystkie jego pozycje na liście powiązanej i sprawdzasz czy kolejny przetwarzany tag znajduje się na pozycji n+1, gdzie n to każda z pozycji wystąpienia tagu, który analizowałeś w poprzednim kroku. Jeśli okaże się, że n + 1 został już znaleziony, to dodajesz do słownika "nazwa poprzedniego tagu" => "nazwa aktualnego tagu" => "nodes" => wystąpienia kombinacji: tag poprzedni, tag następny.
W konsekwencji algorytm powinien zbudować, na bazie powiązanych słowników, drzewa tagów wraz z pozycją znaku znajdującego się zaraz za końcem drzewa. Jedyną wadą tego rozwiązania jest, że algorytm nie wie co Ciebie interesuje, więc:
4 wystąpienia H2, P następujące po sobie mogą równie dobrze zostać odebrane jako 2 wystąpienia H2, P, H2, P
Podobnie może być w sytuacji, w której H2, to tytuł notki bloga, P, to treść notki, a A zostaje niekiedy umieszczony zaraz po P jeśli do notki dodano jakieś komentarze. W konsekwencji na stronie może istnieć kilka różnych kombinacji:
H2, P, A oraz H2, P
Co prawda w tym wypadku można by przyjąć "H2, P" jako właściwy element ale przy bardzie skomplikowanych konstrukcjach niewielka część jednej grupy tagów może się powtarzać w zupełnie innym miejscu.