Kom ihåg mig?
Home Menu

Menu


Jämförelse av strängar i MySQL

Ämnesverktyg Visningsalternativ
Oläst 2007-10-22, 13:52 #1
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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?
andi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 23:21 #2
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Jag skulle lösa detta i PHP eftersom det är mer skalbart.
Weaver är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-24, 09:06 #3
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-24, 11:10 #4
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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
andi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-26, 12:34 #5
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 05:27.

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