Marc Ermshaus’ avatar

Marc Ermshaus

Linkblog

Algorithmic Advent: 23 – Frequency of words in a text

Published on 23 Dec 2010. Tagged with php, algorithmicadvent.

<?php

$text = <<<EOT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur augue risus,
sollicitudin nec convallis sit amet, tristique sit amet elit. Nam mauris turpis,
pulvinar sed commodo ac, luctus quis erat. Nulla vitae velit tellus. Etiam non
eros quis quam fringilla dapibus. Cras nec risus lorem. Phasellus cursus, magna
nec elementum porttitor, risus mauris ultricies turpis, varius interdum nisi leo
vitae risus. Donec non justo vitae est condimentum varius at fermentum risus.
Proin volutpat dignissim arcu eu bibendum. Vivamus eget feugiat eros. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam
varius sem sed mi pulvinar commodo. Ut lorem enim, tincidunt eu condimentum
vitae, gravida sit amet magna. Fusce blandit viverra convallis. Etiam egestas
neque vitae leo mattis placerat. Pellentesque hendrerit odio ac ligula eleifend
vel iaculis neque euismod. Nunc nec malesuada mauris. Duis non urna nec sem
porta bibendum sit amet in enim. Nam consequat elit vel purus porta ut euismod
sapien consectetur.

Donec venenatis pellentesque massa, eget mollis magna congue quis. Fusce eu
gravida magna. Phasellus quis eros enim. Nulla facilisi. In eu risus eu orci
sodales laoreet. Nunc tellus tellus, porttitor nec interdum in, suscipit et
risus. Ut adipiscing adipiscing molestie. Praesent nec nisl nulla, et congue
tellus. Etiam ornare, metus ac tristique euismod, elit orci pharetra neque,
consectetur feugiat orci nulla ac sem. Nullam suscipit, turpis quis mollis
cursus, ipsum ligula rutrum arcu, ac commodo eros neque non purus. Vestibulum
ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed
vestibulum, nunc non consectetur ullamcorper, justo mi pulvinar dolor, vel
viverra quam elit fringilla enim. Nam varius eros vel velit dignissim vitae
mollis risus aliquam. Sed accumsan, nunc sodales elementum consectetur, sapien
leo egestas orci, id commodo felis eros ac nisl. Nulla ut lectus eu felis
scelerisque ullamcorper pharetra at tellus. Nunc pellentesque rutrum velit id
pharetra. Etiam ac imperdiet nisi.
EOT;

header('Content-Type: text/plain; charset=UTF-8');

echo $text;

echo "\n--------------\n";

// Ignore case

$text = mb_strtolower($text);

// Everything consisting of 3+ letters shall be indexed as a word

$cleaned = trim(preg_replace('/(.+?)(?:(\p{L}{3,})|$)/su', ' $2', $text));

// Let's calculate some word frequencies

$words = explode(' ', $cleaned);

$map = array();

foreach ($words as $word) {
    if (array_key_exists($word, $map)) {
        $map[$word]++;
    } else {
        $map[$word] = 1;
    }
}

// Group by number of occurrences

$grouped = array();

foreach ($map as $word => $count) {
    $grouped[$count][] = $word;
}

krsort($grouped);

// Sort words per group alphabetically

foreach ($grouped as $count => &$words) {
    sort($words);
}
unset($words);

print_r($grouped);