[MySQL] stopwoorden filteren

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • BKJ
  • Registratie: April 2000
  • Laatst online: 21-05 15:04
Ik heb hier een database met een heel groot aantal entries. Deze entries bevatten koppen van nieuwsitems die hier intern worden gepubliceerd. Aangezien we al een flink aantal items hebben gepubliceerd over de afgelopen jaren ben ik geinteresseerd geraakt in statistieken die ik los kan laten op de DB.

Nu heb ik bv een soort "hot item" thing gebouwd. Werd er bv het afgelopen jaar veel geschreven over bv Kaas dan komt ie hoog in een lijstje te staan. Dit werkt uitstekend, helaas alleen met wat beperkingen.

Ik heb nl, om het toonbaar te maken, woorden korter dan 4 letters niet meegeteld. Dit is al een eerste schifting van stopwoorden. Maar hierdoor mis ik wel items over bv Kok (onze vorige premier).

Ook heb ik woorden gefilterd die NIET met een hoofdletter beginnen. Ook een soort schifting maar nogal rigoreus.

Nu zou je bv alleen kunnen filteren op hoofdletter. Dan krijg je dus ALLE eerste woorden terug uit de koppen en namen en plaatsen etc etc. Alles wat dus met hoofdletters begint. Ik heb gemerkt dat bv Lucille de B. ook een erge uitwerking heeft op deze methode.

Wat doe ik globaal: Ik split op de spaties tussen de woorden in de koppen, zo krijg ik alle woorden, helaas split ik dan wel belangrijke paren zoals bv Roland Garros oid. Hier valt nauwelijks op te checken. Maar dat boeit me ook niet zoveel. Deze lijst sorteer ik en tel hoevaak (we beginnen bij het eerste woord) een woord er in voorkomt en verwijder vervolgens die woorden. Ik sla dan in de DB het woord plus het aantal occurences op. En het script gaat door naar woord 2. etc etc

Dat lijkt langzaam maar over een pool van 4800 woorden doet deze functie er 3 a 4 seconden over. Best redelijk.

Helaas ben ik niet tevreden met de resultaten gezien de nogal rigoreuze schiftingen.

IK heb al geprobeerd om, als ik een woord heb te pakken, te tellen hoe vaak deze voorkomt in de database en deze vervolgens bij een HELE hoge waarde (>40%) niet mee te tellen. Dit betekent dus wel een flink aantal extra queries op de DB. Ik heb 10 mins geleden zo'n querie gedaan en hij is nu NOG bezig. Niet echt handig dus.

Goed, dan eindelijk mijn vraag.

Weten jullie een betere manier voor deze statistic? Bestaat er niet een lijst met 'most common words' van de Nederlandse taal? Deze in een DB zetten en die vervolgens steeds raadplegen is het makkelijkst lijkt me.

Nogal lang verhaal, maar de achtergrond is volgens mij niet onbelangrijk!

Kamer huren


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Wat ik zelf zou doen is die woorden die je wil "zoeken" indexeren in een aparte tabel. Als je dan een artikel plaatst moet je dat artikel eerst doorlopen op woorden die voldoen aan de criteria, dan checken of het woord al voorkomt; zo ja, aantal occurrences ophogen met 1, zo nee, nieuw record maken met 1 occurrence, en dan door naar het volgende woord. Zo heb je steeds met maar 1 artikel te maken, en kun je uiteindelijk bij het weergeven gewoon uit die geïndexeerde tabel een SELECT ... ORDER BY occurrence DESC doen. Ik weet niet in hoeverre je het nu op deze manier doet, maar sneller dan dit kan niet echt geloof ik.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • BKJ
  • Registratie: April 2000
  • Laatst online: 21-05 15:04
NMe84 schreef op 04 juni 2004 @ 23:11:
Wat ik zelf zou doen is die woorden die je wil "zoeken" indexeren in een aparte tabel. Als je dan een artikel plaatst moet je dat artikel eerst doorlopen op woorden die voldoen aan de criteria, dan checken of het woord al voorkomt; zo ja, aantal occurrences ophogen met 1, zo nee, nieuw record maken met 1 occurrence, en dan door naar het volgende woord. Zo heb je steeds met maar 1 artikel te maken, en kun je uiteindelijk bij het weergeven gewoon uit die geïndexeerde tabel een SELECT ... ORDER BY occurrence DESC doen. Ik weet niet in hoeverre je het nu op deze manier doet, maar sneller dan dit kan niet echt geloof ik.
Maar stel dat je nú al 15000 artikelen hebt.....dan gaat dat niet heel snel. :)

Kamer huren


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

hitchhacker schreef op 04 juni 2004 @ 23:16:
Maar stel dat je nú al 15000 artikelen hebt.....dan gaat dat niet heel snel. :)
Dat wordt in het begin inderdaad een flinke klus, maar dat kun je desnoods in etappes doen... Of je laat de query gewoon een dag draaien. Ik heb zelf eens een zoekscript gemaakt, en bij 50MB aan artikelen in de vorm van HTML files is ie ongeveer 2 uur bezig. Ik weet niet hoe lang je artikelen zijn, maar uitgaande van 1000-2000 woorden per artikel heb je zo'n 15-30MB, dus dat is te doen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • zeekoe
  • Registratie: Januari 2002
  • Laatst online: 15:14
Kun je hem dan niet gewoon alle woorden uit de koppen laten indexeren, en dan klik-klik-klik alle foute woorden eruit gooien met de hand.
Als je dat af en toe een keer doet heb je na een tijdje zelf zo'n database gemaakt. Klaar is Kees, toch?

Nieuw huis, nieuwe (verduurzamings)kansen...


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
* Gomez12 zou gewoon alles laten indexeren en dan op aantal keer voorkomend gaan sorteren. Dan blijkt hopelijk we dat "de" "het" en "een" etc. heel vaak voorkomen zodat je deze als stopwoord zou moet gebruiken.

Of je zou 3 tabellen moeten maken, goed, fout, nog niet beoordeeld. En dan zou je alles uit nog niet beoordeeld naar een van de andere 2 moeten gooien.

Het is in het begin een kl*te klus. Maar uiteindelijk heb je er meer aan dan aan een stopwoorden lijst van de dikke van dale. Omdat forum bezoekers lang niet niet altijd ABN gebruiken.
Pagina: 1