WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   databas till rimordlista? (https://www.wn.se/forum/showthread.php?t=14656)

zilveer 2006-06-15 13:19

Hejsan,

jag håller på att bygga en rimordlista där användaren ska kunna bestämma hur många bokstäver i början av ett ord respektive hur många bokstäver i slutet av ett ord den vill rimma på.
t.ex:

*om man väljer sökordet: kärlek
och man vill ha med den 1:a bokstaven i början av ordet och de 2 sista bokstäverna i slutet av ordet ska t.ex. följande resultat dyka upp:

kortlek
klippotek
förkärlek
filmotek
fonotek
fennek

det kommer ju att finnas mer än 500'000 ord i databasen så man måste indexera detta på ett rätt sätt så inte databasen "kollapsar".

hur kan man lösa detta på ett smidigt sätt, hur bör databasen se ut med avseende på indexeringen?

nicclas 2006-06-15 13:54

Använder du MySQL så behöver du nog inte tänka på så mycket, det går nog bra ändå, om du har en hyggligt snabb dator.

Tycker du det går för långsamt utan att använda INDEX på databasen så bör du tänka på att SELECT-sater som börjar med ett wildcard, t.ex:

SELECT ord FROM list WHERE ord LIKE "%ek"

inte kan utnyttja INDEXet eftersom wildcard:et står först. Det kan du lösa, om du finner det nödvändigt, genom att stoppa in orden baklänges i databasen och söka med

SELECT ord FROM list WHERE ord LIKE "ke%"

och vända på orden innan du ger de tillbaka till användaren. Denna SELECT-sats kan utnyttja ett INDEX på "ord"-kolumnen, och bör vara en hel del kvickare, tror jag.

Robert 2006-06-15 13:56

Kan du inte lagra 2 kolumner, ex:

kortlek, kek
klippotek, kek
förkärlek, fek
filmotek, fek
fonotek, fek
tjofräs, täs

etc...
Indexet blir inte lika stort då på den andra kolumnen och borde göra sökningen snabbare.... eller har jag missupfattat din fråga? Du slipper iaf LIKE och sånt som gör queryn extra seg.

PeterM 2006-06-15 14:01

Jag skulle göra som nicclas skriver om ett fält med ordets bokstäver i baklänges ordning. Här har du ett snabbt exempel.

Kod:

CREATE TABLE `words` (       
`word` text NOT NULL,       
`word_reverse` text NOT NULL,   
FULLTEXT KEY `wr` (`word_reverse`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO words (word) VALUES ('kortlek'), ('klippotek'), ('förkärlek'), ('filmotek'), ('fonotek'), ('fennek');

UPDATE words SET word_reverse = REVERSE(word);

SELECT * FROM words WHERE MATCH(word_reverse) AGAINST('+kel*' IN BOOLEAN MODE);


zilveer 2006-06-15 15:23

robert:

saken är den att användaren själv ska kunna välja hur många bokstäver som den vill rimma på, så det fungerar nog inte bra i längden .

peter & nicclas:

tackar, ska göra ett försök.

men hur blir det då användaren både vill rimma på en del bokstäver i början av ordet, och en del i slutet av ordet?

ditt exempel visar ju inte hur det blir ifall man vill rimma på t.ex. de 2 första bokstäverna i början av ordet? eller har jag missat något?

/mvh zilveer

eg0master 2006-06-15 15:52

Ja du har missat något. :P

Givet peterM tabell och att du vill rimma på "k*ek":
Kod:

SELECT word
FROM words
WHERE word LIKE 'k%'
AND word_reversed LIKE 'ke%'

jag hoppas du tänkt på att inte enbart bokstäver påverkar om ett ord rimmar eller inte... Rytmen (eller antalet stavelser) i orden/raden avgör också hurvida orden rimmar snyggt med varandra eller inte. Att bara kontrollera bokstäver är snarare "nödrim" än "rim"... :rolleyes:

jonny 2006-06-15 16:08

Bokstäver rimmar inte. Ljuden rimmar.
Dela istället upp orden i delar och gruppera delarna.
Kär-lek
Eu-ro-vi-sion-schla-ger-fest-i-val...

Lundmark 2006-06-15 16:33

Jag har en tjänst på www.dipbox.com/korsord/ som fungerar med *

.... där man även kan köra med ? för om man ska jämför ett vist antal bokstäver.

Min databas kör jag bara med en rad rakt upp och ner med alla ord.

tex

s??la ger SADLA, SEGLA, SPOLA, SKOLA.....

men det rimmar inte så bra.

Robert 2006-06-15 16:53

Vad anses vara den korrekta regeln för ett vettigt rim egentligen? Skulle nästan säga de fyra, alternativt tre sista bokstäverna endast. Man rimmar väl inte med första bokstäverna?

Men som sagt, måste du ha ett system där användaren väljer så... :D

Lundmark 2006-06-15 17:05

Men ko och bo rimmar och det är bara en bokstav.....

Första bokstaven ska ju inte ha något igentligen med detta att göra.

http://susning.nu/Rim

koala 2006-06-15 18:25

Jag har också gjort ett liknande script, kan väl användas till både rim, korsord, scrabble, och för det mesta också de där töntiga ordpusslen som går på TV som man ska ringa in på. http://www.expensive.se/scrabble/scrabble.php För den intresserade...

Förresten undrar jag om någon vet var man kan få tag på olika språkdatabaser. Jag skulle t ex vilja ha tabeller över kanske 100 000 ord i språket, och sedan tabeller där man kan få reda på vilken ordklass varje ord tillhör, hur det böjs, hur vanligt förekommande ordet var procentuellt sett under olika år, osv... Tänkte leka lite AI-forskare om jag har tid...

zilveer 2006-06-15 21:06

självklart an man ju inte rimma hur som helst, detta är upp till användaren .


PeterM & egomaster:

men då blir ju databasen dubbelt så stor om jag har en word_reversed- kolumnen också?
vad blir det för skillnaden i prestandan ifall jag har med "word_reversed" resp. att jag inte har word_reversed, utan bara söker i word-kolumnen?

jonny 2006-06-15 21:55

Citat:

Originally posted by zilveer@Jun 15 2006, 21:06
självklart an man ju inte rimma hur som helst, detta är upp till användaren .

PeterM egomaster:
men då blir ju databasen dubbelt så stor om jag har en word_reversed- kolumnen också?
vad blir det för skillnaden i prestandan ifall jag har med word_reversed resp. att jag inte har word_reversed, utan bara söker i word-kolumnen?

Tanken var väl att du bara skulle ha en tabell (inte kolumn!) där orden stod baklänges och att du skulle "vända" på dem för att presentera dem.

zilveer 2006-06-15 21:57

jonny:

jag menade en tabell där kolumnen word_reverse fanns med.

har ni andra förslag på hur jag kan göra databasen?

jonny 2006-06-15 22:03

Sorry för missförståndet. Men om du har orden baklänges kan du vända på dem. Du behöver inte ha dem både fram och baklänges.

eg0master 2006-06-15 22:39

Nja, om du skall söka efter ABD....GHT och vill optimera sökningarna efter index genom att använda 'ABC%' Så behöver du orden i båda ordningarna och syftet med det är att kunna ha index på orden både fram och baklänges. Troligen ger det bättre prestanda och tid har du ont om, medans diskplats kan du alltid köpa. SÅ att optimera för att spara plats i databasen är knappast något du skall lägga tid på.

Sedan hur bra indexen kommer fungera får du nog tyvärr göra någon form av tester för att se.

zilveer 2006-07-18 22:37

Hejsan,
först och främst vill jag tacka för lösningarna, de fungerar bra i mindre tabeller. då databasen inte alls kan indexera trots att vi har FULLTEXT på word och word_reverse.

när jag väljer att söka på ett "k" i början av ordet och "ek" i slutet av ordet får jag följande resultat:

Kod:

SELECT * FROM rimlexikon_words WHERE word LIKE 'k%' AND word_reversed LIKE 'ke%' LIMIT 0, 30


id  word    word_reversed description
1  kortlek  keltrok        NULL
14 kartotek ketotrak      NULL
15 kinotek  ketonik        NULL
16 klippotek ketoppilk      NULL

jag väljer att visa EXPLAIN för denna sql sats och får fram följande:
Kod:

table type possible_keys key key_len ref rows Extra
rimlexikon_words ALL word_reversed,word NULL NULL NULL 29 where used

jag har sammanlagt 29 ord i databasen bara för att testa och den söker igenom hela databasen. om jag nu haft 1 miljon ord så skulle den söka igenom alla dessa ord.

kan jag inte undkomma detta på något sätt?

nicclas 2006-07-18 23:14

Du ska väl inte ha FULLTEXT på word och word_reverse!? Du ska väl ange att du vill ha INDEX på dem!? Tag bort FULLTEXT:en och addera ett INDEX istället och prova igen. Ett vanligt INDEX på båda kolumnerna border nog fungera bra, eller vad tror ni andra?

nomicon 2006-07-19 00:51

Varför uppfinna hjulet på nytt =)

http://www.gameelite.se/rimma/

-martin

zilveer 2006-07-19 22:40

Citat:

Originally posted by nomicon@Jul 19 2006, 00:51
Varför uppfinna hjulet på nytt =)

http://www.gameelite.se/rimma/

-martin

den är nog mer komplicerad än så.
dels vill jag lära mig dels innehåller inte det lexikonet alla ord.=)

nomicon 2006-07-24 12:46

Ursäkta, var inte meningen att stjälpa något för dig =) Ofc så ska du utveckla en bättre tjänst än de som redan finns.. och du får gärna lägga ett PM till mig när din tjänst är klar för användning så får jag bookmarka den.

/Martin

zilveer 2006-10-03 01:27

Hejsan,
jag skulle väldigt gärna ha ris och ros innan jag gör slutversionen av sidan till rimlexikon.net.

http://www.rimlexikon.net

tack för all kritik

tartareandesire 2006-10-03 16:03

Bara ett par stavfel på förstasidan:

Välkomen => Välkommen
Kontakta oss sidan => Kontakta oss-sidan

Annars ser det helt okej ut, kanske lite smal sida.


Alla tider är GMT +2. Klockan är nu 03:25.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson