Categorie
Come fare

Il “rUMorE”, l’esempio dei titoli delle pagine web

Vediamo oggi cos’è il rumore nei testi e come identificarlo.

Cos’è il “rumore” nei testi?

Il concetto di rumore in informatica è strettamente derivato dal concetto di rumore in elettronica:

In elettronica il rumore è l’insieme di segnali (in tensione o corrente elettrica) imprevisti e indesiderati che si sovrappongono al segnale utile, trasmesso o da elaborare, tipicamente presente sul canale di comunicazione tra due o più utenti (o apparati elettronici) e sui dispositivi di ricezione/elaborazione. Il rumore provoca una perdita d’informazione o un’alterazione del messaggio trasmesso.

https://it.wikipedia.org/wiki/Rumore_(elettronica)

In pratica in un testo, o un insieme di testi, il rumore è l’insieme di quelle frasi o di quelle parole che possono modificare il senso del contenuto o, nel caso dei motori di ricerca, di non avere risultati coerenti con la ricerca per colpa di queste frasi.

L’esempio più calzante sono i titoli delle pagine web, in cui di solito viene aggiunto alla fine il nome del sito.
Questa cosa a noi provetti creatori di motori di ricerca fa veramente schifo, perché ci inquinerebbe i risultati.

Eliminare il rumore

Dato che il rumore, se c’è, è sempre presente negli stessi posti basta dividere i nostri testi in elementi e confrontare un insieme di essi in modo da rendere possibile l’identificazione e l’eliminazione.

Ci possono essere tanti tipi di rumore nelle pagine web, nei singoli elementi come il <title> della pagina che contiene spesso il nome del sito, o anche nella struttura DOM della pagina che sta intorno al contenuto, che di solito è costante.

Basta confrontare un insieme di questi elementi per capire cosa togliere e cosa lasciare.

Esempio pratico: come togliere il rumore dai titoli

Prima di tutto recuperiamo un po’ di titoli dal web in modo rapido.
Scegliamo una cavia e recuperiamo velocemente dei titoli senza dover scrivere uno scraper della madonna, che non è l’argomento del post, e paritiamo da uno dei suoi feed RSS, lo greppiamo, lo seddiamo lo curliamo e il gioco è fatto!

Per greppare, seddare e curlare usiamo la buona vecchia shell di Linux:

#prendiamo il file rss e salviamolo sotto /tmp
if [ ! -f /tmp/rss.xml ]; then
wget "http://www.repubblica.it/rss/tecnologia/rss2.0.xml" -O /tmp/rss.xml
fi

#apriamo il file rss e estraiamo le url delle pagine
for i in `cat /tmp/rss.xml | sed "s%</link>%\n%g" | sed "s%<link>%\nlink:%g" | grep "link:" | sed "s%link:%%" | sed "s%<\!\[CDATA\[%%" | sed "s%\]\]>%%"`;
do
  # per ogni url scarichiamo la pagina e estraiamo il titolo
  curl -s $i | grep -i "<title>" | sed "s%.*<title>%%" | sed "s%<\/title>.*%%" >> /tmp/titoli.txt
done

Copiate il codice e salvatelo in un file .sh se volete giocarci.

A questo punto abbiamo un file pieno di titoli:

Tecnologia - La Repubblica
Tecnologia - La Repubblica
Smartphone, Realme presenta il nuovo X3 SuperZoom - la Repubblica
WhatsApp, per aggiungere i contatti arrivano i codici QR - la Repubblica
Arrivano i nuovi Chromebook. Per lavorare, studiare e giocare - la Repubblica
Paesi Bassi, avanti sul 5G. Tribunale dell'Aja: "Non vi sono rischi per la salute" - la Repubblica
In Italia crescono TikTok e Twitch - la Repubblica
Attenti a dr. Google, sbaglia diagnosi due volte su tre - la Repubblica
App Immuni per monitorare il coronavirus: disponibile tra 10-15 giorni - la Repubblica
Google Maps segnala i locali accessibili in sedie a rotelle - la Repubblica
Twitter Fleet, in Italia arrivano le Storie che scompaiono in 24 ore - la Repubblica
Paesi Bassi, nonna condannata a rimuovere le foto dei nipoti dai social network - la Repubblica
Quei pochi pixel che hanno fatto la storia 40 anni fa. Buon compleanno Pac-Man - la Repubblica
Conservazione dei documenti digitali, Il Garante della privacy chiede tutele - la Repubblica
Coronavirus, YouTube ci ricorda quando è ora di andare a dormire - la Repubblica
Twitter cambia pelle: adesso puoi scegliere chi risponde ai tuoi tweet - la Repubblica
Anonymous: "Abbiamo bucato il San Raffaele". L'ospedale: "App dismessa da anni, password obsolete" - la Repubblica
Coronavirus, Apple-Google rilasciano il sistema di tracciamento. Tutto pronto per Immuni - la Repubblica
Coronavirus, negli uffici di Facebook il 25% delle presenze - la Repubblica
Israele vs Iran: il nuovo fronte di guerra è il cyberspazio - la Repubblica
Privacy e innovazione? Mandate la vostra tesi - la Repubblica
Nasce Facebook Shops, spazio online anti Amazon per i negozi di ogni dimensione - la Repubblica
Attacco informatico a EasyJet, compromessi i dati di nove milioni di clienti - la Repubblica
Privacy e sicurezza, i controlli di Chrome diventano più intuitivi - la Repubblica
Coronavirus e fake news: i 5 profili Twitter italiani ''super diffusori'' di bufale - la Repubblica
Coronavirus, il cybercrime colpisce sempre di più il cloud - la Repubblica
Avi Schiffmann, il 17enne che ha rifiutato 8 milioni di dollari per il suo sito su Covid-19 - la Repubblica

Eccolo la il nostro rumore!
Col nostro cervello frutto di migliaia di millenni di evoluzione e selezione naturale possiamo facilmente notare che c’è sempre ” – la Repubblica” alla fine del titolo.

Alla fine.

Perché sempre alla fine? Se era all’inizio era tutto più semplice no?
E poi una volta scrivi “- La Repubblica” e un’altra volta scrivi “- la Repubblica”?
Dico a te: project manager, content manager, webmaster, creatore di siti o filgio del cugino del portiere del palazzo di zia Maria:
Devi essere coerente nel rumore
…che qui non ci va di lavorare a buffo!
Pensa che comodo sarebbe se i titoli fossero scritti così:

acilbbuper al - aigoloncet
acilbbuper al - aigoloncet
acilbbuper al - moozrepus 3x ovoun li atneserp emlaer ,enohptrams
acilbbuper al - rq icidoc i onavirra ittatnoc i eregnuigga rep ,ppastahw
acilbbuper al - eracoig e eraiduts ,eraroval rep .koobemorhc ivoun i onavirra
acilbbuper al - ;touq&etulas al rep ihcsir onos iv non;touq& ;a3x#&aja;72x#&lled elanubirt .g5 lus itnava ,issab iseap
acilbbuper al - hctiwt e kotkit onocserc ailati ni
acilbbuper al - ert us etlov eud isongaid ailgabs ,elgoog .rd a itnetta
acilbbuper al - inroig 51-01 art elibinopsid :surivanoroc li erarotinom rep inummi ppa
acilbbuper al - elletor a eides ni ilibissecca ilacol i alanges spam elgoog
acilbbuper al - ero 42 ni onoiapmocs ehc eirots el onavirra ailati ni ,teelf rettiwt
acilbbuper al - krowten laicos iad itopin ied otof el erevoumir a atannadnoc annon ,issab iseap
acilbbuper al - nam-cap onnaelpmoc noub .af inna 04 airots al ottaf onnah ehc lexip ihcop ieuq
acilbbuper al - eletut edeihc ycavirp alled etnarag li ,ilatigid itnemucod ied enoizavresnoc
acilbbuper al - erimrod a eradna id aro ;evarge& odnauq adrocir ic ebutuoy ,surivanoroc
acilbbuper al - teewt iout ia ednopsir ihc ereilgecs ioup osseda :ellep aibmac rettiwt
acilbbuper al - ;touq&etelosbo drowssap ,inna ad assemsid ppa;touq& ;a3x#&eladepso;72x#&l .;touq&eleaffar nas li otacub omaibba;touq& ;a3x#&suomynona
acilbbuper al - inummi rep otnorp ottut .otnemaiccart id ametsis li onaicsalir elgoog-elppa ,surivanoroc
acilbbuper al - ezneserp elled %52 li koobecaf id iciffu ilgen ,surivanoroc
acilbbuper al - oizapsrebyc li ;evarge& arreug id etnorf ovoun li ;a3x#&nari sv elearsi
acilbbuper al - iset artsov al etadnam ?enoizavonni e ycavirp
acilbbuper al - enoisnemid ingo id izogen i rep nozama itna enilno oizaps ,spohs koobecaf ecsan
acilbbuper al - itneilc id inoilim evon id itad i issemorpmoc ,tejysae a ocitamrofni occatta
acilbbuper al - ivitiutni ;evargu&ip onatnevid emorhc id illortnoc i ,azzerucis e ycavirp
acilbbuper al - elafub id ''irosuffid repus'' inailati rettiwt iliforp 5 i :swen ekaf e surivanoroc
acilbbuper al - duolc li ;evargu&ip id erpmes ecsiploc emircrebyc li ,surivanoroc
acilbbuper al - 91-divoc us otis ous li rep irallod id inoilim 8 otatuifir ah ehc enne71 li ,nnamffihcs iva

Figata pazzesca eh?

Ora scriviamo un pezzettino di codice in Python per lavorare il nostro file di titoli e identificare il rumore in queste stringhe.
Per prima cosa apriamo il file e creiamo una lista di titoli, nel modo che più ci piace:

fileName='/tmp/titoli.txt'
titles=[]
for line in open(fileName):
    titles.append(line.rstrip("\n").lower()[::-1]) # già! Li rivolto come pedalini :D

Ora basta confrontare carattere per carattere i titoli tra di loro per estrarre la nostra stringa che “fa rumore”, facciamoci una funzioncina:

# il parametro è la lista dei titoli
def check(lines):
   result='' # il nostro ipotetico risultato
   prima=lines[0] # il primo titolo
   isEqual=0 # serve dopo
   for i in range(0,len(prima)): # per ogni carattere
      for j in range(1,len(lines)): # dal secondo titolo in poi
         toTest=lines[i] # titolo da confrontare
         isEqual=prima[i]==toTest[i] # chissà se sono uguali?
      if isEqual: # sono uguali
         result=prima[i]+result # preparo il risultato (al dritto)
      else: # non sono uguali
         return result # allora ho già identificato tutto e lo restituisco

Il risultato di questo popò di lavoro sui titoli precedenti è:

- la repubblica

TADAHHHH!
Ora per ogni titolo basta fare una regexp per togliere la stringa incriminata dalla fine di ogni titolo e abbiamo finito.

import re
pattern = re.compile(rumore+'$', re.IGNORECASE)
for line in open(fileName):
   titolo=line.rstrip("\n")
   print pattern.sub('', titolo)

Spero che l’esempio vi sia piaciuto, il procedimento per togliere il rumore dall’HTML prodotto dalle pagine web è simile, solo un tantino più complicato perché dobbiamo confrontare il DOM dell’HTML e non i caratteri della pagina.

Se volete giocare con lo script in pyton ve lo lascio qui sotto al completo:


#!/usr/bin/python

def check(lines):
    result=''
    prima=lines[0]
    isEqual=0
    for i in range(0,len(lines[0])):
        for j in range(1,len(lines)):
            toTest=lines[i]
            isEqual=prima[i]==toTest[i]
        if isEqual:
            result=prima[i]+result
        else:
            print prima[i]+"\n"
            return result


fileName='/tmp/titoli.txt'
titles=[]
for line in open(fileName):
    titles.append(line.rstrip("\n").lower()[::-1])

for i in titles:
    print i


rumore=check(titles)
import re
pattern = re.compile(rumore+'$', re.IGNORECASE)
for line in open(fileName):
    titolo=line.rstrip("\n")
    print pattern.sub('', titolo)