WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Jämförelse av strängar i MySQL (https://www.wn.se/forum/showthread.php?t=24520)

andi 2007-10-22 13:52

Jag har en tabell som har ett textfält som innehåller ca 40-50 ord per rad. Varje sådant fält innehåller ord som är typiska för en textkategori och varje rad representerar alltså en sådan kategori. Jag vill kunna klassificera texter genom att se hur många av orden i varje textfält i databasen som finns i texten jag vill klassificera eller använda någon annan sorts jämförelsealgoritm av den oklassificerade texten och varje textfält i databasen. Något sorts rankingsystem får sedan bestämma vilken kategori den nya texten tillhör.

Det finns ju olika strängjämförelsefunktioner i php och man skulle ju kunna tänka sig att bara iterera över hela kategoritabellen (ca 100 rader) och jämföra den oklassificerade texten med varje textfält i databasen. Då sker ju själva strängjämförelsen i php och inte i MySQL och fördelen är att man då även kan bygga ihop sin egen jämförelsealgoritm.

Skulle det gå att använda MySQL:s fulltext-sökning eller någon strängjämförelsealgoritm som finns i MySQL? Kan man stoppa in hela den oklassificerade texten (hundratalet ord och med stopp-ord borttagna) i en SQL-fråga eller blir det för mycket för MySQL? Ordföljden spelar ingen roll för mig men är det något som MySQL tar hänsyn till vid fulltext-sökning?

En annan approach skulle ju vara att ha en tabell med ett ord per rad och sedan iterera över alla ord och se vilka som förekommer i den nya texten, men då är det ju 5000 ord som skall kollas, kanske lite väl många?



Någon som gjort något liknande? Hur gjorde ni?

Weaver 2007-10-23 23:21

Jag skulle lösa detta i PHP eftersom det är mer skalbart.

eg0master 2007-10-24 09:06

Om du har en en tabelle med ett ord per rad behöver du inte (själv) iterera över den. En SQL fråga löser det.
Kod:

SELECT kategori_id, COUNT(*) as cnt FROM words WHERE 0 != INSTR(din_text, word) GROUP by kategor_id order by cnt DESC
Då låter du iaf databasen göra jobbet åt dig vilket troligen är bättre än att göra samma sak i PHP.

andi 2007-10-24 11:10

Citat:

Originally posted by eg0master@Oct 24 2007, 09:06
Om du har en en tabelle med ett ord per rad behöver du inte (själv) iterera över den. En SQL fråga löser det.
Kod:

SELECT kategori_id, COUNT(*) as cnt FROM words WHERE 0 != INSTR(din_text, word) GROUP by kategor_id order by cnt DESC
Då låter du iaf databasen göra jobbet åt dig vilket troligen är bättre än att göra samma sak i PHP.

Aha, vad smart! Är stringfunktioner i MySQL resurskrävande? Det kommer ju som sagt att bli några tusen anrop per fråga och databasen har nog med jobb som det är...

/Andreas

eg0master 2007-10-26 12:34

INSTR är sannolikt en ganska billig operation. Att hitta substrängar är ganska enkelt och effektivt att implementera rent algoritmmässigt. Och antingen gör du jobbet i databasen eller i ditt PHP-script. Generellt sett är databasen att föredra skulle jag säga, men exakt vet du inte förrän du testat båda varianterna.


Alla tider är GMT +2. Klockan är nu 02:57.

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