|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1379
|
Trovare la percentuale di differenze tra due stringhe senza averle.
Mi servirebbe di qualcosa molto simile ad un hash o un crc con l'unica differenza che applicando questo algoritmo a due stringhe simili dovrei ottenere un risultato simile.
Con il crc invece ottengo ovviamente due risultati completamente diversi. Questa cosa mi è utile perchè sto cercano di implementare un piccolo motore di ricerca, e ogni volta che lo spider passa da un sito dovrebbe accorgersi se vale la pena di aggiornare il database oppure le variazioni sono così piccole che non è necessario. Il caso di variazioni piccole sono ad esempio quelle pagine dove c'è scritta la data attuale. Se facessi il crc della pagina vedrei che è diversa, ma di fatto è diversa di una quantità insignificante. D'altro canto andare a scompattare la pagina memorizzata nel database per confrontarla con quella attuale è un operazione inutilmente lenta. Sapete se esiste un algoritmo di hashing (parola impropria lo so) che mi consenta di fare questo al volo ? Provvisoriamente sto pensando ad una semplice somma di tutti i valori ascii dei caratteri contenuti nella stringa, ma penso esista qualcosa di più evoluto. |
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
Non mi ricordo di chi ma è una citazione.
__________________
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Cmq credo che non vada bene a das, perchè: -richiede di conoscere la stringa, e lui non vuole pescarla dal database -richiede calcoli su di una matrice num_chars x n, e quindi è inapplicabile per prestazioni su di una pagina web... Mi sa che quelli che ci hanno pensato stavolta hanno si fatto meglio, ma se lo sono tenuto per sè ![]() Le tecnologie di ricerca di informazioni ultimamente sono le più ricercate e segrete di tutte... figurati se Google permette ai suoi dipendenti di anche solo accennare gli algoritmi di ricerca... |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1379
|
Quote:
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
A te servirebbe qualcosa di simile a questo: http://en.wikipedia.org/wiki/Soundex
Ma il problema è che "sintetizzare" un'intera pagina in pochi bit d'informazione è praticamente impossibile. Un'ideuzza ce l'avrei, ma è un po' complicata da implementare. Te la espongo velocemente. Utilizza un dizionario fisso di parole (es: quello della lingua italiana), e dalla tua pagina estrai tutte le parole che appartengono al dizionario conservandone anche la frequenza. Supponiamo che tutte le parole del dizionario abbiano una posizione fissa (es: ciao = 4327), per cui anche alle parole del dizionario assocerai il medesimo indice. Mettiamo che il dizionario sia di n parole, e tu ne abbia trovate m (<= n ovviamente). Costruisci un vettore di dimensione n in cui memorizzi la frequenza delle m parole nella posizione che gli spetta. Quindi se hai trovato ciao 3 volte, allora alla posizione 4327 metterai il valore 3. A questo punto hai ottenuto un vettore nello spazio (del dizionario). Questo vettore formerà un certo angolo rispetto a un asse di riferimento. Ne calcoli il coseno (o il seno: è indifferente) e lo memorizzi. D'ora in poi userai il coseno per confrontare la similitudine di una stringa con un'altra. Lo so: è particolarmente contorto (qualche giorno chiameranno la neuro, me lo sento
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2285
|
Quote:
praticamente ottieni un vettore n dimensionale in cui le parole sono le dimensioni e il valore per ogni dimensione è dato dalle singole occorrenze, ho capito bene?
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Esattamente.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Veramente interessante
Un solo dubbio: quante parole su internet sono italiane ed anche corrette, sul totale? E tutti i neologismi che si dicono una volta sul forum e poi non li vedi più? Il dizionario credo te lo dovresti costruire a mano, aggiungendo un index ad ogni "first occurrence" di una parola... ma temo che poi ti serva veramente troppa memoria Non per niente google ha una decina di Pb di hard disk eh |
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
Quote:
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
L'idea invece è di utilizzare un dizionario fisso, quindi al quale non aggiungere altre parole (altrimenti per ogni nuova parola bisognerebbe ricalcolare i valori di tutte le altre pagine).
E' chiaro che con questa scelta si perderanno delle informazioni, ma l'obiettivo è quello di sintetizzare buona parte di un'intera pagina, non di rincorrere a tutti i costi una precisione che, per il tipo di problema proposto, non potrà mai esserci. Ad esempio l'inclusione dell'intero vocabolario della lingua italiana, compresi francesismi ed eventualmente nomi e cognomi, porterebbe una notevole nonché solida base da cui partire. Anche la memoria non credo sarebbe un problema: quanto possono occupare 150-200mila voci? Non credo tanto. Ovviamente allo scopo terrei sempre attivo un server che ha precaricato in memoria un dizionario con tutte le voci, in modo da facilitare la costruzione del vettore, che avverrebbe grossolanamente così: Codice:
Dictionary = {... dizionario ...}
def Vectorize(Text):
Vector = [0] * len(Dictionary) # Inizializza il vettore delle frequenze
Text = Text.lower() # Mette l'intero testo in lowecase
for Word in Text.split(): # Suddivide il testo in parole usando spazi, tabulatori e caratteri speciali come separatori
Index = Dictionary[Word] # Calcola l'indice della parola
if Index >= 0: # Se la parola è stata trovata nel dizionario, prosegui
Vector[] += 1 # Aggiorna la frequenza di questa parola
return Vector # Ritorna il vettore calcolato
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
tra una dormitina e l'altra a lezione (.... Tra le altre cose (vado sul vago perchè non ne so di più) so che un metodo efficace per indicizzare e confrontare documenti testuali è quello di calcolarsi gli autovalori della matrice dei termini e non so che altro. Vabbè non divago oltre OT, dico solo che ci sono libri validi sull'argomento di un certo Ian Witten. Ciao!
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
ma limitando la soluzione di Cdimauro a relativamente poche parole chiavi relative ad un argomento?
|
|
|
|
|
#16 | ||||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Sì più o meno come dicevi tu.
L'ho sentito ad una lezione di Basi di Dati Multimediali, ieri sono andato a spulciare tra le dispense ma non ho trovato niente. Se vuoi dare un'occhiata tu ti do il riferimento alla pagina del corso. Ora che ci penso c'ho anche messo mani ad un corso di gestionale, ho corretto il programma di una mia amica che lo doveva calcolare. Se lo trovo lo posto. PS: ho trovato il nome del libro: Ian H. Witten, Alistair Moffat,Thimothy C.Bell Managing Gigabytes: Compressing and Indexing Documents and Images.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" Ultima modifica di Oceans11 : 26-11-2008 alle 10:15. |
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1379
|
Quote:
Pensavo comunque che esistesse qualcosa diciamo di 'standard' tipicamente utilizzato per risolvere questo tipo di problemi. Ultima modifica di das : 26-11-2008 alle 10:13. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1379
|
Quote:
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Io conosco ed ho usato un algoritmo abbastanza, simile a quello esposto da cdimauro. Viene attualmente usato da qualche engine di spiders.
Invece di considerare il dizionario completo di tutte le parole, secondo questo algoritmo e' sufficiente utilizzare il dizionario di tutte le possibili terzine di un testo, con lowercase eventualmente pulite da caratteri di controllo (virgole, punti, duepunti, etc.) conservando pero' lo spazio. Ottieni uno spazio le cui terzine possibili sono aaa aab aac aaz a a a b bac bcd cdz etc. ed e' finito e completo (Circa 30^3 entries) Passi il tuo testo originale attraverso il conto delle terzine ( O (N) ) e conti la distribuzione delle terzine ES: Codice:
Ho rotto un rotore: ho = 1 o r = 1 ro = 2 rot = 2 ott = 1 tto = 1 to = 1 o u = 1 un = 1 n r = 1 oto = 1 ore = 1 In teoria potrai tenere memorizzato anche solo la distribuzione, neppure la pagina vera e propria. (A meno che ti servano funzioni di caching) E anche ovviamente i dati che avrai rilevato e che ti serviranno per le ricerche. quando ripasserai, ricalcolerai la distribuzione delle nuove terzine, e calcolerai la distanza tra il vecchio dizionario e quello nuovo. Funzioni per calcolare la distanza ce ne possono essere parecchie, ma viene normalmente usato qualcosa di simile alla Levenshtein. La distanza tipica e': quante sono le terzine nuove che prima non c'erano (motliplicate per la loro occorrenza) + quante sono le terzine vecchie che non ci sono piu' (di nuovo moltiplicate) + la differenza di occorrenza delle terzine preservate. Prova, a me ha dato abbastanza soddisfazioni. PS: Ci facciamo un contest?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 26-11-2008 alle 12:17. |
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:25.




















