Newsgroup: it.comp.lang.visual-basic
Titolo: Ricerca parole...NEAR...ci riprovo...

Allora riposto un vecchio post...inascoltato...
Partenza: Prog in VB5 e rimane quello (sigh) + DAO (pure quello)
Archivi fatti a cane senza chiavi ma questo è un problema mio ...
chiedo lumi per altro....
Implementazione di un qualcosa di simile a NEAR dei motori di ricerca
"Internettiani"
Devo fare una motore di ricerca su sto archivio (definitivo)
Ha una tabella (semplificata all'osso diciamo che è):
a)Autore
b)....marea di info...
c) Incipit del testo (che sarà il candidato a essere la chiave univoca...
appena mi daranno l'ok di una release futura)
c) Campo memo con il testo di un documento
a parte ricercare le varie info (per quello non ci sono problemi)...
mi chiedono
"Permettimi di trovare oltre a tutti i testi di un determinato autore in un
certo periodo etc etc ANCHE tutti i testi in cui la parola "Gatto" è seguita
A DESTRA ...ENTRO 2 PAROLE ...dalla parola "sacco"...."
oppure
"Permettimi di trovare oltre a tutti i testi di un determinato autore in un
certo periodo etc etc ANCHE tutti i testi in cui la parola "Gatto" è
PRECEDUTA A SINISTRA ...ENTRO 4 PAROLE ...dalla parola "Bello"...."
Capite bene che l'attacco tramite un INSTR è possibile su un testo...ma su
una biblioteca di 100 documenti (o +)....diventa arduo!
Pensavo a amenità di tipo....cataloga tutte le parole di tutti i testi in un
MDB dove un record potrebbe essere
IDDocumento
PAROLABASE
POSIZIONEnelDOC
PAROLADX1
PAROLADX2
PAROLADX3
PAROLADX4
PAROLADX5
PAROLASX1
PAROLASX2
PAROLASX3
PAROLASX4
PAROLASX5
e cercare su sto DB
come le normali ricerche
...il lavoro anche lento di catalogazione vien fatto naturalmente
sull'archivio definitivo...e limito la profondità del NEAR a 5 parole...ma
una volta per tutte
A me soluzioni migliori non son venute in mente!
Ragioniamo un po insieme???
Thanks!

Wodka4U <marc_AnTiSpaM_o@ma_1Togliere451_rtek.it> wrote in message
%IzS8.11170$vm5.4...@news2.tin.it...CUT
Naturalmente la ricerca la spezzerei in 2 fasi....
prima cerca tutte le info dei testi..
Autore,Datazione,CollocazioneGeografica, Info linguistiche etc etc....
POI
su quello che si è trovato....si attiva l'MDB delle parole e si trovano in
quel range, tutti i testi che contengono anche quelle determinate
combinazioni di parole....

così alla veloce mi verrebbe da dire: una tabella con
    IDDocumento: collegata alla tabella delle info
    Parola: parola
se nella frase c'è scritto: " non dire gatto se non ce l'hai nel sacco"
nella tabella delle parole memorizzerei
record 1:  sbn454646 (IDDocumento)
                non
record 2:  sbn454646 (IDDocumento)
                dire
record 3:  sbn454646 (IDDocumento)
                gatto
record 4:  sbn454646 (IDDocumento)
                se
record 5:  sbn454646 (IDDocumento)
                non
record 1:  sbn454646 (IDDocumento)
                ce
record 1:  sbn454646 (IDDocumento)
                l'hai
record 1:  sbn454646 (IDDocumento)
                nel
record 1:  sbn454646 (IDDocumento)
                sacco
che ne pensi?


 una biblioteca di 100 documenti (o +)....diventa arduo!
cento o centokappa ? su cento anche con instr/mid, se riesci ad astrarre il
codice, ci mette poco, a meno che i memo non siano davvero lunghi.
provato ora
49k righe, mdb di 130 mb
where text like '*microsoft*express*' order by date, time, firm
83 secondi, 5807 righe restituite, i memo contengono cose tipo
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
su 100 ce la puoi fare decentemente.
--
ciao, j.
www.sundaysw.com


 > PAROLASX5
CUT
in questa ipotesi sopra
IDdoc:123456
Ppos=1
Pbase: non
pdx1: dire pdx2: gatto pdx3: se pdx4: non pdx5: ce
psx1:  psx2: psx3: psx4: psx5:
....etc
.......di gatto sarebbe...
IDdoc:123456
Ppos=3
Pbase: gatto
pdx1: se pdx2: non pdx3: ce pdx4: l'hai pdx5: nel
psx1: dire psx2:non psx3: psx4: psx5:
etc etc
POI  con un veloce SQL trovo tutte le occorrenze
SELECT * FROM TABparole WHERE Pbase='gatto'
e controllo in base alla scelta della profondità e alla direzione i campi
pdxN o psxN
e segnalo la posizione nei vari doc in una griglia o in un listbox....oppure
(mi viene in mente ora)in un listview con tutte le info accessorie? (fico! )
mmm...forse l'ho pensata giusta?
Perche col tuo sistema come ritroveresti le parole entro un certo range
dalla parola base???
p.s.
(tutta sta fatica ...serve a ricercare parole latine e sequenze di parole in
antichissimi manoscritti....non serve per cercare quante volte dico "ciao
mamma" eh!!..è roba per ricercatori!)
:-)
p.p.s.
mmm...aiutatemi a pensare....
se voglio trovare "gatto" e a distanza max 2 avanti/indietro anche "dire"
funzionerebbe anche con
SELECT * FROM TABparole WHERE (  (Pbase='gatto') AND (pdx1='dire' OR
pdx2='dire' OR psx1='dire' OR psx2='dire')  )
vero?

 > Partenza: Prog in VB5 e rimane quello (sigh) + DAO (pure quello)
CUT
select where testo like '*bello*gatto*'
select where testo like '*gatto*sacco*'
sarebbe bello...ma non mi da il controllo della profondità di posizione!
(ad es.
entro 2 parole da bello ci deve essere gatto..da 3 o più deve essere
scartato!)
Che ne pensi della soluzione che ho ripostato mi sembra l'unica possibile
senza stare a fare scanning di memo anche molto lunghi!
P.s.
I gatti non sono belli è vero ...sono bellissimi...
Anche taluni cani!Come si può vedere dalle foto dell'ultimo meeting...ma
solo taluni!...(c'è il ciuahuahua... come cavolo si scrive... della vicina
che qualche volta lo infilo in lavatrice!)

 pdx2='dire' OR psx1='dire' OR psx2='dire')  )
Questo mi par di capire che hai un bel DB con una bella Tabella delle
occorrenze presenti nei documenti, il che significherebbe che tu
antecedentemente hai analizzato i documenti e per ogni parola trovata (anche
se si ripete nel testo) un record che contiene la parola da indicizzare + le
4 parole dietro + le 2 parolo avanti..!!!!
Quanti Tera di HD hai a disposizione? Usi ovviamente un Database di quelli
superveloci e massicci e robusti vero?  !!!
Ironia a parte, il metoto che hai proposto funziona, ed è anche performante
nella ricerca.
Per evere più flessibilità nella ricerca, penso dovresti comunque censire in
un DB tutte (anche le ripetizioni) le parole presenti nel testo,
associandole alla loro posizione, esempio il seguente testo "parola1 parola2
parola3 parola4 parola5" verrebbe censito così:
    "parola1",1
    "parola2",2
    "parola3",3
    "parola4",4
    "parola5",5
Quindi ti fai una quantità di query a piacere in funzione del numero e della
complessità della tua ricerca.
esempio:
    - Cerchi tutte le "parole3"
    - Per ogno occorrenza trovata vedi se c'e' la "parola5" in una posizione
compresa tra quella di "parola3" (3) e quella di "parola3"+3 (6)
 3<posizione>=6 )
    - ecc...
Ciao
Ettore Maronese, il Mes

 senza stare a fare scanning di memo anche molto lunghi!
imho, ci lasci le penne, o il pelo che sia.
con una stringa tipo
'* * *gatto* * *sacco*'
ma non vorrei che il troppo caldo...
tiragli fuori i 50 caratteri prima e 50 dopo, cosi' si vedono le stringhe.
un po' di rumore nelle query, con i wildcards, e' inevitabile...
ciao, a.

 un po' di rumore nelle query, con i wildcards, e' inevitabile...
Soluzione Interessante! :))
Ciao
Ettore, il Mes

"Wodka4U(xp)" <mar_TOGLI_co@ma_194ANCHE_195463QUI_rtek.it> ha scritto nel
messaggio news:YgBS8.11812
[cut]
ecco una buona occasione per "traslocare" i dati a SqlServer:
vedi:
- full-text queries
- CONTAINS (con tutte le tue amate NEAR)...
ciao
ugo

 ha scritto nel messaggio
news:affbs1$e021k$1...@ID-96367.news.dfncis.de...
CUT lamentoso...
sigh non ti ci mettere anche tu!
...il tempo di sti tizi č esaurito....(e son venuti da me)...
non rabbrividire (io oramai ho il cappotto da una settimana!)
VB5 DAO Access97
in futuro sto programmino portarlo su un cd per rendere il tutto
consultabile da enti o biblioteche.
cmq ogni cd saranno al massimo 50 /100 documenti...non dovrebbe venire
mastodontico l'MDB...stasero provo a vedre con un doc quanto prende di
spazio!...pregate per me...Wodka pro nobis!
:->)

...pregate per me...Wodka pro nobis!
alla salute... ;-P
ciao
ugo

 :->)
:)
quando hai fatto il cd, cerca cmq di copiargli il db su hd.
seno' il cd se lo perdono e poi ti chiamano perche' gli da' errore...
ciao, a.

 certo che se ogni memo contiene l'ulysses o la comedie humaine...
ecco: quello era il mio dubbio...   :-(
ciao
ugo