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)