Ik had een leuk ideetje, en ik wil even kijken of het haalbaar is.
case
Ik wil identieke teksten gaan zoeken op google, gebaseerd op een klein aantal (10 is de limiet voor google) kernwoorden. Google geeft me een aantal results terug, en ieder van die results open ik. De http-kant handel ik uiteraard netjes af, maar waar het me nu eigenlijk om gaat: Hoe vergelijk ik die teksten?
Voorbeeldje: Ik zoek naar de 1e meditatie van descartes (cogito ergo sum). Ik weet de eerste regel: "SEVERAL years have now elapsed"
[google=descartes SEVERAL years have now elapsed]
In dit geval zijn de eerste 5 hits goede hits, dus daar hoef ik nu nog even niet op te filteren.
Als je echter naar de HTML-code gaat kijken, dan blijkt dat de teksten niet identiek zijn: sommigen hebben <br>-tags, anderen knoeien met de interpunctie. Er is zelfs een site die de individuele alinea's in <TD's> heeft gestopt.
Wat er uit mijn programmerseltje moet komen is een tekst: geen urls. Daar hebben we google al voor...
mogelijke oplossing
Mijn eerste oplossing is als volgt:
[0] Ik neem aan dat al mijn resultaten HTML zijn. (dat hoeft op zich niet zo te zijn natuurlijk, veel teksten staan op het web als .txt)
[1] Ik vervang alle meervoudige whitespace door een spatie.
[2-] Ik verwijder alles wat gegarandeerd mijn teksten niet bevat:
s/<(A|HEAD|SCRIPT|SELECT|STYLE).*?>.*?</\1>/ /i
[3] Ik vervang alle </TR>'s, <br>'s, </DIV>'s, <P>'s en </P>'s door een newline. s/<(/TR|BR|/DIV|/P|P).*?>/\n/i
[4] Ik verwijder alle HTML-tags. s/<.*?>/ /
Nu heb ik de teksten zoals ze op de webpagina's staan, maar inclusief extra rotzooi. Dat doe ik voor (bijvoorbeeld) de eerste 5 hits van google.
Vervolgens ga ik ditalles woord voor woord vergelijken:
[1] ik neem het eerste woord van Hit 1.
[2] Ik bepaal waneer het betreffende woord voor het eerst voorkomt in hit 2 tot 5.
[3] ik neem het tweede woord van Hit 1.
[4] Ik bepaal waneer het betreffende woord voorkomt in de overige hits, tellend vanaf de positie die ik bij [2] heb gevonden. Is is dit niet [2]+1, dan neem ik het tweede woord en begin vanaf [1]. Is dit wel [2]+1, dan ga ik naar [3] maar dan met het derde woord.
[5] komen een aantal woorden overeen tot aan het eind van een regel, dan gaat die regel met de interpunctie zoals in hit 1 naar de 'return buffer'.
vraag
Ik vind het bovenstaande nogal omslachtig, is er niet een eenvoudiger methode. (let op: ik wil niet weten of er overeenkomde teksten gevonden zijn, ik wil weten wat de gevonden tekst exact is).
case
Ik wil identieke teksten gaan zoeken op google, gebaseerd op een klein aantal (10 is de limiet voor google) kernwoorden. Google geeft me een aantal results terug, en ieder van die results open ik. De http-kant handel ik uiteraard netjes af, maar waar het me nu eigenlijk om gaat: Hoe vergelijk ik die teksten?
Voorbeeldje: Ik zoek naar de 1e meditatie van descartes (cogito ergo sum). Ik weet de eerste regel: "SEVERAL years have now elapsed"
[google=descartes SEVERAL years have now elapsed]
In dit geval zijn de eerste 5 hits goede hits, dus daar hoef ik nu nog even niet op te filteren.
Als je echter naar de HTML-code gaat kijken, dan blijkt dat de teksten niet identiek zijn: sommigen hebben <br>-tags, anderen knoeien met de interpunctie. Er is zelfs een site die de individuele alinea's in <TD's> heeft gestopt.
Wat er uit mijn programmerseltje moet komen is een tekst: geen urls. Daar hebben we google al voor...
mogelijke oplossing
Mijn eerste oplossing is als volgt:
[0] Ik neem aan dat al mijn resultaten HTML zijn. (dat hoeft op zich niet zo te zijn natuurlijk, veel teksten staan op het web als .txt)
[1] Ik vervang alle meervoudige whitespace door een spatie.
[2-] Ik verwijder alles wat gegarandeerd mijn teksten niet bevat:
s/<(A|HEAD|SCRIPT|SELECT|STYLE).*?>.*?</\1>/ /i
[3] Ik vervang alle </TR>'s, <br>'s, </DIV>'s, <P>'s en </P>'s door een newline. s/<(/TR|BR|/DIV|/P|P).*?>/\n/i
[4] Ik verwijder alle HTML-tags. s/<.*?>/ /
Nu heb ik de teksten zoals ze op de webpagina's staan, maar inclusief extra rotzooi. Dat doe ik voor (bijvoorbeeld) de eerste 5 hits van google.
Vervolgens ga ik ditalles woord voor woord vergelijken:
[1] ik neem het eerste woord van Hit 1.
[2] Ik bepaal waneer het betreffende woord voor het eerst voorkomt in hit 2 tot 5.
[3] ik neem het tweede woord van Hit 1.
[4] Ik bepaal waneer het betreffende woord voorkomt in de overige hits, tellend vanaf de positie die ik bij [2] heb gevonden. Is is dit niet [2]+1, dan neem ik het tweede woord en begin vanaf [1]. Is dit wel [2]+1, dan ga ik naar [3] maar dan met het derde woord.
[5] komen een aantal woorden overeen tot aan het eind van een regel, dan gaat die regel met de interpunctie zoals in hit 1 naar de 'return buffer'.
vraag
Ik vind het bovenstaande nogal omslachtig, is er niet een eenvoudiger methode. (let op: ik wil niet weten of er overeenkomde teksten gevonden zijn, ik wil weten wat de gevonden tekst exact is).
Localhost, sweet localhost