[MySQL] Tellen van woorden

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

  • BKJ
  • Registratie: April 2000
  • Laatst online: 11:56
Ik heb hier een database met een groot aantal nieuwsartikelen (enkele duizenden) die allemaal itern gepubliceerd zijn in de loop der jaren. Nu wil ik er wat statistieken op los laten. Eén daarvan is het tellen van onderwerpen. Oftewel een soort top 20 samenstellen van populairste onderwerpen waarover geschreven is. Je kunt dan natuurlijk beginnen bij het 1e artikel alle woorden te bekijken, uitgezonderd de, het, een etc etc, en die woorden gaan tellen in de rest van de artikelen. Woorden onthouden die je gehad hebt en dan naar het volgende artikel. maar volgens mij is dit een nogal omslachtige methode...

Heeft MySQL hier niet een mooie funtie voor? Of heeft iemand hier ervaring mee?

Kamer huren


Verwijderd

Heeft de programmeertaal van waaruit je MySQL gebruikt ook een functie waarbij je karakters in een tekst kunt vervangen ? dan kun je een truukje doen: Vervang alle spaties met niets, en kijk dan hoeveel karakters je tekst kleiner is geworden. Tel daar 1 bij op, en je hebt het aantal woorden. ( misschien dat het niet helemaal correct is, bijvoorbeeld als mensen geen spaties achter een punt hebben gezet, maar het geeft een goede indicatie, lijkt me)

  • BKJ
  • Registratie: April 2000
  • Laatst online: 11:56
Verwijderd schreef op 16 mei 2004 @ 12:33:
Heeft de programmeertaal van waaruit je MySQL gebruikt ook een functie waarbij je karakters in een tekst kunt vervangen ? dan kun je een truukje doen: Vervang alle spaties met niets, en kijk dan hoeveel karakters je tekst kleiner is geworden. Tel daar 1 bij op, en je hebt het aantal woorden. ( misschien dat het niet helemaal correct is, bijvoorbeeld als mensen geen spaties achter een punt hebben gezet, maar het geeft een goede indicatie, lijkt me)
Ik gebruik Perl en die heeft dat. Alleen bereken ik met jou methode de gemiddelde lengte van een nieuwsitem (cq kop). Ik wil bv weten hoe populair een bepaald onderwerp is van zeg het afgelopen jaar. Zoiets als dit:

1. Irak 2300 artikelen
2. Google 2000 artikelen
3. KPN 1245 artikelen
4. Balkenende 1187 artikelen

Om nou allemaal woorden te gaan verzinnen en daarop te gaan zoeken is nogal tijdrovend.

Kamer huren


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22:23

NMe

Quia Ego Sic Dico.

Ik denk dat je daarvoor je koppen moet gaan indexeren in een aparte tabel met zoekwoorden. De tabel moet een veld hebben voor het betreffende woord en een veld voor een link naar het id van het artikel, beiden samen zijn primary key.
Op het moment dat je een artikel plaatst werk je ook die tabel bij waarmee je alle woorden van de kop bekijkt (in PHP zou je de trim functie gebruiken, en daarna elk woord doorlopen met foreach, zoiets kan in Perl vast ook wel). De tabel ziet er in jouw geval zo uit:
code:
1
2
3
4
5
6
woord            artikel

Irak                1
Google              1
Irak                2
Irak                3

Enz.

Straks hoef je alleen maar een SELECT COUNT(*) FROM tabel WHERE woord = 'watjeookzoekt'.

[ Voor 6% gewijzigd door NMe op 16-05-2004 13:00 ]

'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: 11:56
NMe84 schreef op 16 mei 2004 @ 12:59:
Ik denk dat je daarvoor je koppen moet gaan indexeren in een aparte tabel met zoekwoorden. De tabel moet een veld hebben voor het betreffende woord en een veld voor een link naar het id van het artikel, beiden samen zijn primary key.
Op het moment dat je een artikel plaatst werk je ook die tabel bij waarmee je alle woorden van de kop bekijkt (in PHP zou je de trim functie gebruiken, en daarna elk woord doorlopen met foreach, zoiets kan in Perl vast ook wel). De tabel ziet er in jouw geval zo uit:
code:
1
2
3
4
5
6
woord            artikel

Irak                1
Google              1
Irak                2
Irak                3

Enz.

Straks hoef je alleen maar een SELECT COUNT(*) FROM tabel WHERE woord = 'watjeookzoekt'.
Dat betekent dus dat je zelf zoekwoorden moet gaan verzinnen. Kun je niet alle woorden meenemen? Ik had op zich al een aanvalsplan bedacht in mijn openingpost, maar ik vroeg me alleen af of dat niet sneller kan. Ik meende iets een x gelezen te hebben over occurence. Weet iemand een methode? :)

Kamer huren


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
zitten er niet bepaalde FULL TEXT INDEXING functies in MySQL die dit kunnen?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • BKJ
  • Registratie: April 2000
  • Laatst online: 11:56
P_de_B schreef op 16 mei 2004 @ 15:30:
zitten er niet bepaalde FULL TEXT INDEXING functies in MySQL die dit kunnen?
Daar ben ik dus ook denk ik benieuwd naar....

Kamer huren


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
hitchhacker schreef op 16 mei 2004 @ 15:44:
[...]


Daar ben ik dus ook denk ik benieuwd naar....
Ik durf het niet te zeggen, maar misschien zou je met de zoekterm full text indexing wat kunnen zoeken?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • BKJ
  • Registratie: April 2000
  • Laatst online: 11:56
P_de_B schreef op 16 mei 2004 @ 15:55:
[...]

Ik durf het niet te zeggen, maar misschien zou je met de zoekterm full text indexing wat kunnen zoeken?
Ik weet wat full text indexing doet: zoeken in text. Maar ik wil graag frequenties van woorden tellen over de hele db. Nu kan dat prima per woord mbv full text indexing, alleen, zoals ik al zei, wil ik alle frequenties van ALLE woorden weten.

Heeft iemand hier een zinnig idee over?

Kamer huren


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

hitchhacker schreef op 16 mei 2004 @ 16:11:
[...]


Ik weet wat full text indexing doet: zoeken in text. Maar ik wil graag frequenties van woorden tellen over de hele db. Nu kan dat prima per woord mbv full text indexing, alleen, zoals ik al zei, wil ik alle frequenties van ALLE woorden weten.

Heeft iemand hier een zinnig idee over?
Je moet, zoals NMe84 al schreef, de artikelen doorlopen en steeds als een woord voorkomt gewoon een insert doen in een tabel met kolommen (woord, artikelId).

Als je dit hebt gedaan kan je met:

SQL:
1
SELECT COUNT(*) AS frequentie, woord FROM frequentietabel GROUP BY woord


een lijstje opvragen van alle woorden met hun frequentie.

TheStreme - Share anything with anyone


  • BKJ
  • Registratie: April 2000
  • Laatst online: 11:56
Vladimir G. schreef op 16 mei 2004 @ 17:39:
[...]


Je moet, zoals NMe84 al schreef, de artikelen doorlopen en steeds als een woord voorkomt gewoon een insert doen in een tabel met kolommen (woord, artikelId).

Als je dit hebt gedaan kan je met:

SQL:
1
SELECT COUNT(*) AS frequentie, woord FROM frequentietabel GROUP BY woord


een lijstje opvragen van alle woorden met hun frequentie.
Beste mensen, ik waardeer dat jullie replyen maar ik denk dat jullie het nog niet helemaal doorhebben....ik kan namelijk NIET voorspellen welke woorden er voor komen in de koppen. Als ik idd wist dat ik zocht naar het woord IRAK dan kon ik jullie methode prima toepassen. Niks mis mee. Alleen als het gaat om 11624 artikelen is dat nogal lastig. Is er niet een andere oplossing?

Kamer huren


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

Je hoeft ook helemaal niet te weten welke woorden er in de teksten voorkomen :) .

Als je gewoon een willekeurig woord tegenkomt in de tekst, doe je een insert (voor elke tekenreeks gescheiden door leestekens en/of witruimte dus). Simpel. Daarvoor hoef je niet van tevoren te weten welke woorden je tegenkomt.

TheStreme - Share anything with anyone

Pagina: 1