Ik ben een parser aan het schrijven voor chatlogs. Ik wil de inhoud van mijn chatlogs netjes in een database wegschrijven en ze zo makkelijk en snel kunnen doorzoeken of analyseren. Op het moment ben ik bezig met een parser voor de XML bestanden die Windows Live Messenger maakt. Het probleem met deze logs is dat bij berichten enkel de nicknames van de zender en de ontvanger worden opgeslagen, en verder geen enkele methode van identificatie.
Voorbeeld van een bericht:
Het punt is dat die nicknames door de log heen kunnen veranderen. Uit die log haal ik de unieke nicknames (de keys van de nicknames in deze array worden aan de berichten gekoppeld):
Nu wil ik deze nicknames grouperen op gelijkenis. Ik heb al een stukje code die van de bovenstaande nicknames een leesbaarder array geeft:
Nu zit ik echter vast op hoe ik deze nicknames kan grouperen op gelijkenis. In dit geval zijn ze na mijn bewerking allemaal gelijk, maar dit hoeft niet altijd zo te zijn, er kan makkelijk een kleine variatie inzitten.
Ik heb de functie Levehnstein al gevonden, maar geen idee hoe ik met die scores netjes kan grouperen. Ik haal met de volgende code een array met de scores op:
Dit levert al een (na sorteren met asort()) prima array op:
Maar hier zit ik vast. Hoe ga ik van deze gegevens naar een array met 2 (of meer) elementen waarin alle gelijkende nicknames bij elkaar staan?
Zoiets dus:
Waarschijnlijk is het heel gemakkelijk en zie ik wat over het hoofd, maar ik kom er niet uit.
Voorbeeld van een bericht:
XML:
1
2
3
4
5
| <Message Date="22-1-2007" Time="11:43:43" DateTime="2007-01-22T10:43:43.546Z" SessionID="1"> <From><User FriendlyName="Kay"/></From> <To><User FriendlyName="Joyce... Toetsweek [0/11] ×"/></To> <Text Style="font-family:MS Shell Dlg; color:#000000; ">goedemorgen! :)</Text> </Message> |
Het punt is dat die nicknames door de log heen kunnen veranderen. Uit die log haal ik de unieke nicknames (de keys van de nicknames in deze array worden aan de berichten gekoppeld):
code:
1
2
3
4
5
6
7
| Array ( [0] => Kay [1] => Joyce... Toetsweek [0/11] × [2] => Joyce... om 12 uur gaan we starten! Toetsweek [0/11] × [3] => Joyce... Toetsweek [0/11] × ) |
Nu wil ik deze nicknames grouperen op gelijkenis. Ik heb al een stukje code die van de bovenstaande nicknames een leesbaarder array geeft:
code:
1
2
3
4
5
6
7
| Array ( [0] => kay [1] => joyce [2] => joyce [3] => joyce ) |
Nu zit ik echter vast op hoe ik deze nicknames kan grouperen op gelijkenis. In dit geval zijn ze na mijn bewerking allemaal gelijk, maar dit hoeft niet altijd zo te zijn, er kan makkelijk een kleine variatie inzitten.
Ik heb de functie Levehnstein al gevonden, maar geen idee hoe ik met die scores netjes kan grouperen. Ik haal met de volgende code een array met de scores op:
PHP:
1
2
3
4
5
| for($x = 0; $x < count($nicks); $x++) for($y = 0; $y < count($nicks); $y++) if($x != $y && !isset($scores[$y][$x])) $scores[$x][$y] = levenshtein($nicks[$x],$nicks[$y]); |
Dit levert al een (na sorteren met asort()) prima array op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Array ( [2] => Array ( [3] => 0 ) [1] => Array ( [2] => 0 [3] => 0 ) [0] => Array ( [1] => 4 [2] => 4 [3] => 4 ) ) |
Maar hier zit ik vast. Hoe ga ik van deze gegevens naar een array met 2 (of meer) elementen waarin alle gelijkende nicknames bij elkaar staan?
Zoiets dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| Array ( [0] => Array ( [0] => 0 // kay ) [1] => Array ( [0] => 1 // joyce [1] => 2 // joyce [2] => 3 // joyce ) ) |
Waarschijnlijk is het heel gemakkelijk en zie ik wat over het hoofd, maar ik kom er niet uit.
[ Voor 5% gewijzigd door Verwijderd op 23-01-2007 10:38 ]