Henrik Stidsen wrote:
> Jeg skal have defineret en database til at indeholde søgeord for en
> masse dokumenter.
>
> Det skal være muligt at søge på enkeltord og på sætninger -
> hvordan får jeg bygget denne database op mest hensigtsmæssigt ?
>
> Enkeltord er ikke noget problem - men sætninger... jeg har umidelbart
> tænkt at kunne være noget med at gemme ordet, hvilket ord der er
> foran og hvilket der er bagved for på den måde at kunne opbygge
> sætningerne igen. [klip]
>
> Det er ikke til at finde noget om det emne på google så nu prøver
> jeg her - nogen ideer til hvordan det gøres mest effektivt ?
Der er ingen tvivl om at det mest effektive er, at finde et færdigt
værktøj, som kan det, du har brug for. Hvis du alligevel beslutter dig
for at lave det selv, kan du lave en tabel med ord, der er udstyret med
id'er og en anden tabel, der indeholder par af den slags id'er og en
reference til et dokument, hvor hver række indikerer at de to ord
forekommer efter hinanden i det pågældende dokument. Du har helt ret i
at det bliver enormt. Jeg har lavet noget lignende og det fungerer, men
man skal vænne sig til tanken om tabeller med hundredetusinder eller
millioner af rækker. Desuden er anvendelsen så specialiseret at
relationelle databaser ikke performer så godt som mere specialiserede
indeksfiler (f. eks Sleepycat DB).
Ellers kan man også overveje at putte ordpar i en tabel. Det lyder måske
lidt underligt, men jeg tror at det kunne performe godt, fordi at det
ikke kræver mere end én forespørgsel på et stor, men iøvrigt også pænt
indekseret tabel.
Eksempel:
I databasen er teksten
"Termodynamikken f.ex. Men du vil ikke kunne se fejlene i den før du
forstår polaritetsprincippet fuldtud. Men så bliver de til gengæld
indlysende."
(Et par helt tilfældige sætninger sakset et sted fra usenet af. Ingen
nævnt, ingen glemt.)
Som giver ordtabellen
0 Termodynamikken
1 f.ex.
2 Men
3 du
4 vil
5 ikke
6 kunne
7 se
8 fejlene
9 i
10 den
11 før
12 du
13 forstår
14 polaritetsprincippet
15 fuldtud.
16 Men
17 så
18 bliver
19 de
20 til
21 gengæld
22 indlysende.
(der skal tages højde for upper/lower case og specialtegn skal fjernes
eller behandles) og forbindelsestabellen
Ord1 Ord2 Dokument
0 1 1
1 2 1
....
21 22 1
(Trivielt da der kun er et dokument.)
Det var første forslag (man skal nok have en tredie tabel med
forbindelser imellem enkeltord og dokumenter også). Problemet er, at man
skal joine disse tabeller for overhovedet at få søgeresultater.
Andet forslag ovenfor er blot tabellen
Ord1 Ord2 Dokument
termodynamikken f.ex. 1
f.ex. men 1
men du 1
du vil 1
vil ikke 1
....
gengæld indlysende 1
indlysende NULL 1
Her kan man søge på ét ord med
SELECT DISTINCT Dokument FROM ordpar WHERE Ord1=<ord>
og man kan søge på dokumenter med en sætning med
SELECT COUNT(*) AS Forekomster, Dokument FROM ordpar
WHERE (Ord1=<ord1> AND Ord2=<ord2>)
OR (Ord1=<ord2> AND Ord2=<ord3>)
....
OR (Ord1=<ord n-1> AND Ord2=<ord n>)
GROUP BY Dokument
HAVING Forekomster=n-1
Hvor der er ialt n ord i den sætning, man søger efter. Bemærk at det
ikke kræver et mangedobbelt join. Man kan nøjes med at lade databasen
tælle op for at se om alle ordene er med. Man kan endda bruge det til at
rankere efter:
SELECT COUNT(*) AS Forekomster, Dokument FROM ordpar
WHERE (Ord1=<ord1> AND Ord2=<ord2>)
OR (Ord1=<ord2> AND Ord2=<ord3>)
....
OR (Ord1=<ord n-1> AND Ord2=<ord n>)
GROUP BY Dokument
ORDER BY COUNT(*) DESC
Der skal ikke være nogen tvivl om at færdige produkter vil kunne løse
opgaven med langt mindre indsats (og sikkert bedre), men det er nu meget
sjovt at lave den slags selv
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at
http://michael.zedeler.dk/
Get my vcard at
http://michael.zedeler.dk/vcard.vcf