Wpis z mikrobloga

#programowanie
W mojej aplikacji pisanej w #cpp używam zewnętrznego parsera do stron internetowych, który m.in. zwraca mi ilość słów w zwracanym dokumencie (widocznych słów, bez znaczników itp.) Problem w tym, że zauważyłem przekłamania w tym parametrze. Zwracanie 1 zamiast prawidłowej wartości bym przeżył, bo łatwo to sprawdzić i obsłużyć, ale zdarza mu się również np. policzyć tylko słowa w pierwszym akapicie zamiast na całej stronie, a to już dużo trudniej zweryfikować.
Mógłbym usunąć feature'y związane z liczbą słów, ale są one dla mnie dość ważne, dlatego muszę ogarnąć jakiś lepszy, mniej zawodny sposób. Dokument zwrócony z parsera mam w stringu, a później przechodzi jeszcze przez libtidy i pugixml.
Jak można by to zrobić najlepiej? Znalazłem w internecie jakiś wpis wyliczający parsery do użycia w podobnej sytuacji i był tam libtidy, ale ja takich opcji w nim nie znalazłem, więc podejrzewam, że to błąd autora wpisu ¯\_(ツ)_/¯
Rozważałem użycie pugixml, skoro i tak w pewnym momencie ładuję tam cały dokument. Trawersowałbym drzewo i liczył spacje, ale po napisaniu tego wyniki są niezadowalające: liczba słów jest niesamowicie niedoszacowana, przypuszczam, że to przez to, że tekst zawiera pełno znaków specjalnych z HTML jak   czy  . Wydaje mi się, że liczenie ich wszystkich byłoby nie dość, że niezbyt wydajne, to jeszcze dość uciążliwe.
Zaznaczę tylko, że obecne strony potrafią być ogromne, więc wydajność jest tutaj dość ważna (aczkolwiek bez popadania w przesadę).

Podsumowując, co zrobić, żeby się nie narobić bez sensu, a żeby wszystko działało w miarę ok? ( ͡° ͜ʖ ͡°)
  • 15
@cevilo: proszę bardzo, naucz mnie, jak napisać wyrażenie regularne, które policzy ilość słów w HTML pomijając wszystkie znaczniki, i nie pogubi się przy użyciu w tekście znaków ">" i "<", a także dziesiątek   i pochodnych.

@Wina_Segmentacji: podejrzewam, że niezbyt, szczególnie jak uwzględnisz, jak ociężałe są obecne przeglądarki ( ͡° ͜ʖ ͡°)
W sumie może sprecyzuję: używany przeze mnie zewnętrzny parser wybiera z całej strony jej określone sekcje i zwraca je w całości, włącznie ze znacznikami HTML, osadzonymi obrazkami itp. I tak ma być, bo tego właśnie potrzebuję. Niestety teraz wyskoczył problem z liczeniem przez niego słów.
konto usunięte via Wykop Mobilny (Android)
  • 0
@Golem_Piotr: tylko że musiałbym policzyć spacje i wszystkie inne znaki spacjopodobne - powroty karetki, spacje niełamliwe itp. Do tego dochodzi problem przy liczeniu np. list, gdzie każdy punkt ma jedno słowo. Wtedy cała lista nie zawiera ani jednej spacji, a w rzeczywistości może być cholernie długa (trochę przejaskrawiam, ale wiesz, o co mi chodzi - trochę zawodny sposób)
@frogi16: napisałem taki kod w javie, wydaje mi się, że dobrze to liczy, choć gdy tego html który załączyłeś otworzę w przeglądarce, skopiuję do libreOffice, to pokazuję troszkę inną liczbę, ale to może kwestia interpretacji niektórych rzeczy na stronie i wkipiowywanie tego do LibreOffice:

public static void main( String args[] ) {
String line = "tutaj jakiś html";
line = line.replace("//(^/s*)|(/*$)/gi","");
line = line.replace("/[ ]{2,}/gi"," ");
line = line.replace("/\n /","\n");
System.out.println(line.split("
@frogi16: > spacje i wszystkie inne znaki spacjopodobne
Tak, musisz podzielić znaki na odstępy i litery.

każdy punkt ma jedno słowo.

To trim i +1 do każdego tagu, bo n słów rozdziela n-1 odstępów.

gorzej, że pugixml nie czyta tego html, bo ma niedomknięte ![]()

@cevilo: Liczysz znaczniki jako słowa, czy wykop zmienił kod? Uwzględniłeś znaki większości wewnątrz atrybutów?
@cevilo: @Golem_Piotr: @Wina_Segmentacji:
Dzięki za pomoc,
rozwiązanie, na które się zdecydowałem to trawers po drzewie XML utworzonym przez pugi i liczenie znaków "spacjowych" w tekście. Działa dobrze i wydajnie:

https://pastebin.com/tiGggaEM

EDIT:
przed załadowaniem do pugi przepuszczam całe źródło przez tidy, który domyka niezamknięte znaczniki i ogólnie porządkuje tekst tak, żeby był prawidłowym XML i nie wyrzucał żadnych błędów