[mysql/php] meest voorkomende woord combinaties

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil uit een table met titels, een lijstje displayen met meest voorkomende woord combinaties.

bijv als ik een table heb met dit:
  • ervaren werkvoorbereider wegenbouw
  • senior werkvoorbereider wegenbouw
  • ervaren werkvoorbereider
  • werkvoorbereider wegenbouw
dan zou de top 2 van meest voorkomende woordcombinaties zou dan dus moeten zijn:

1. werkvoorbereider wegenbouw
2. ervaren werkvoorbereider

iemand ideeën hoe je zoiets als dit kunt fixen?

het gaat trouwens niet alleen om combinaties van 2 woorden, maar zou dus ook van combinaties van 3 woorden kunnen zijn

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

En wat heb je zelf al geprobeerd? Wat lukte daar dan niet mee? Alleen een vraag stellen zonder verder enige info is hier niet de bedoeling. Zie ook PRG Beleid. Dus wat heb je zelf al geprobeerd?

[ Voor 55% gewijzigd door Creepy op 10-11-2009 15:44 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op dinsdag 10 november 2009 @ 15:43:
En wat heb je zelf al geprobeerd? Wat lukte daar dan niet mee? Alleen een vraag stellen zonder verder enige info is hier niet de bedoeling. Zie ook PRG Beleid. Dus wat heb je zelf al geprobeerd?
nou ik weet dus niet hoe ik moet beginnen,

ik heb wel alle woorden los in een table staan, en kan zo dus heel makkelijk zien wat de meeste voorkomende woorden zijn, maar weet niet hoe ik het dus voor elkaar krijg om te laten zien welke combinaties van die woorden het meeste voorkomen.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Gewoon per row alle combinaties van woorden opslaan en dan in bijv. een array knallen en checken welke t meest voorrkomt.

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Cartman! schreef op woensdag 11 november 2009 @ 14:26:
Gewoon per row alle combinaties van woorden opslaan en dan in bijv. een array knallen en checken welke t meest voorrkomt.
Dit lijkt me wel een klusje wat je het liefst door je database op wilt laten lossen.

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Brakkie schreef op woensdag 11 november 2009 @ 14:33:
[...]

Dit lijkt me wel een klusje wat je het liefst door je database op wilt laten lossen.
ja via mysql lijkt me de beste optie, maar de vraag is hoe? zit er standaard een functionaliteit in mysql waarmee je dit kan zien?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op woensdag 11 november 2009 @ 15:12:
[...]

ja via mysql lijkt me de beste optie, maar de vraag is hoe? zit er standaard een functionaliteit in mysql waarmee je dit kan zien?
In de nieuwste versie van MySQL wel: de functie die je zoekt heet getMostCommonWordCombinations(FromTable);.


Ik zou niet weten hoe dit in MySQL zou kunnen, maar ik werk er dan ook niet bepaald dagelijks mee. De oplossing van Cartman! lijkt mij de meest bruikbare.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • XiniX88
  • Registratie: December 2006
  • Laatst online: 19:30
CodeCaster schreef op woensdag 11 november 2009 @ 15:15:
[...]

In de nieuwste versie van MySQL wel: de functie die je zoekt heet getMostCommonWordCombinations(FromTable);.


Ik zou niet weten hoe dit in MySQL zou kunnen, maar ik werk er dan ook niet bepaald dagelijks mee. De oplossing van Cartman! lijkt mij de meest bruikbare.
Is pas vanaf versie 10.0, helaas is die nu nog niet stabiel. Een andere leuke functie is SELECT MAX(column) FROM table.

Maar de leukste functie vind ik

SELECT ik, ben, te, lui, dingen, uit, te FROM zoeken WHERE jammer = hoor

Btw, het mooiste is dit met Oracle, en dan een procedure maken, aangezien hier niet een echte functie voor is. Zie ook: http://www.techonthenet.com/oracle/procedures.php en dit kan ook in het goedkopere (gratis) postgre, MySQL heb ik geen idee :)

Of via een programeertaal:

http://en.wikibooks.org/w.../Longest_common_substring (tnx to B0rf)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function strlcs($str1, $str2){
    $m = strlen($str1);
    $n = strlen($str2);
    $L = array();
    $z = 0;
    $ret = array();
 
    for($i=0; $i<$m; $i++){
        $L[$i] = array();
        for($j=0; $j<$n; $j++){
            $L[$i][$j] = 0;
        }
    }
 
    for($i=0; $i<$m; $i++){
        for($j=0; $j<$n; $j++){
            if( $str1[$i] == $str2[$j] ){
                $L[$i][$j] = $L[$i-1][$j-1] + 1;
                if( $L[$i][$j] > $z ){
                    $z = $L[$i][$j];
                    $ret = array();
                }
                if( $L[$i][$j] == $z )
                    $ret[] = substr($str1, $i-$z+1, $z);
            }
        }
    }
    return $ret;
}

[ Voor 44% gewijzigd door XiniX88 op 11-11-2009 15:28 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik wel benieuwd wat precies je definitie van woord combinaties is, en hoe dit precies in een tabel staat. Dat heeft natuurlijk nogal invloed op een eventuele oplossing.

[ Voor 70% gewijzigd door Woy op 11-11-2009 15:24 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • B0rf
  • Registratie: Oktober 2008
  • Laatst online: 03-10-2024
Klinkt een beetje als Longest Common Substring probleem. Volgens mij heeft mysql hier niet echt een mooie oplossing voor, en zul je dit in code moeten doen, en door alle rijen heenlopen

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou, ik heb een oplossing gevonden, tis vast niet de mooiste, maar t doet wel wat ik wil

Ik explode een titel, en insert alle aparte combinaties dan in een table, waar ik dus later de populairste woord combinaties uit kan halen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
$words = explode(" ",$titel);
    for($l=1;$l<=count($words);$l++){
        $functienaam = implode(" ",array_slice($words, 0, $l)); 
        //MYSQL INSERT INTO bla bla bla
    
    }
    for($s=1;$s<count($words);$s++){
        $functienaam = implode(" ",array_slice($words, $s, $l)); 
        //MYSQL INSERT INTO bla bla bla
    
    }


voorbeeld:

"dit is een test titel met meerdere woorden"

zou zo in de db komen te staan


dit
dit is
dit is een
dit is een test
dit is een test titel
dit is een test titel met
dit is een test titel met meerdere
dit is een test titel met meerdere woorden
is een test titel met meerdere woorden
een test titel met meerdere woorden
test titel met meerdere woorden
titel met meerdere woorden
met meerdere woorden
meerdere woorden
woorden

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Mis je dan niet combinaties als "test titel" ?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Ik heb een tijd terug zo'n oplossing moeten fixen voor tags op een website en ik heb op het laatst gewoon maar zelf een script geschreven dat de rows doorliep en alles explode. Dus niet zoals ^^ ludohelder. Dan mis je inderdaad de laatste woorden of de woorden die midden in de zin staan;
Verwijderd schreef op donderdag 03 december 2009 @ 07:59:
[...]

voorbeeld:

"dit is een test titel met meerdere woorden"

zou zo in de db komen te staan
Klik hier voor een voorbeeld wat ik laatst heb gedaan ;)

Edit: met jouw oplossing kun je dan heel ver komen ;)

[ Voor 4% gewijzigd door JefSnare op 03-12-2009 08:59 ]

Twitter Flickr


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
inderdaad was mijn oplossing nog niet volledig.

dus dan wordt het nu zo:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$words = explode(" ","dit is een test titel met meerdere woorden"); 
$word_cnt = count($words);
    for($l=1;$l<=$word_cnt;$l++){ 
        $functienaam = implode(" ",array_slice($words, 0, $l)); 
    echo $functienaam."<br />";
        //MYSQL INSERT INTO bla bla bla 
     
    } 
    
    for($s=1;$s<$word_cnt;$s++){ 
        for($l=1;$l<=($word_cnt-$s);$l++){ 
            $functienaam = implode(" ",array_slice($words, $s, $l)); 
        echo $functienaam."<br />";
            //MYSQL INSERT INTO bla bla bla 
        }
    }


dit geeft de juiste output

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
ingewikkelde oplossing volgens mij,

Kun je niet beter een tabel met woorden maken, en 1 koppel tabel waar je de combinatie tussen woord en item in opslaat? Kun je volgens mij veel makkelijker een query op doen.

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • Twan V
  • Registratie: Oktober 2001
  • Laatst online: 16-09 15:39

Twan V

...en er stralend uitzien

Mysql ondersteunt tegenwoordig views. Ik zou een view maken met daarin alle losse woorrden en het aantal keer dat het woord voorkomt:

wordoccurance
werkvoorbereider4
de392
......

Blaat het niet dan schaadt het niet...
Reflex Discoshow - Het beste wat je bruiloft kan overkomen


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Twan V schreef op donderdag 03 december 2009 @ 16:59:
Mysql ondersteunt tegenwoordig views. Ik zou een view maken met daarin alle losse woorrden en het aantal keer dat het woord voorkomt:

wordoccurance
werkvoorbereider4
de392
......
Prachtig...en dan !?

@TS:
Definieer eerst eens goed weer je naar op zoek bent (gaat het bvaltijd om twee aaneengesloten woorden ?), schrijf hiervoor een oplossing die het doet (en die heb je al) en ga daarna nog eens kijken of je algoritme (/gekozen oplossing) optimaal is.

Kijk ook eens naar de opmerking van kwaakvaak_v2, deze ziet er al veel netter en vooral ontzettend veel sneller uit.

Tot slot nog een vraagje: hoe groot is je tabel (als in hoeveel data bevat de tabel) ?

Eerst het probleem, dan de oplossing

Pagina: 1