Кластеризация фраз по url
Кластеризация фраз по url
Добрый день. Столкнулся с задачей, пытаюсь понять и написать код для кластеризации поисковых запросов на основе общих url. Надо сравнить каждый элемент массива c каждым по url, и если у них есть общие URL, то объединить их в группу. Написал простенький скрипт, но он жрет много памяти. Подскажите, пожалуйста, как можно реализовать данную задачу. Может есть какие-то готовые библиотеки?
Есть массив words вида, пример:
[0] => array(
"word" => "порошковый огнетушитель",
"id" => 1,
"urls" => array(
[0] => url_1,
[1] => url_2,
[3] => url_3,
[4] => url_4,
[5] => url_5)
),
[1] => array(
"word" => "углекислотный огнетушитель",
"id" => 2,
"urls" => array(
[0] => url_1,
[1] => url_2,
[3] => url_3,
[4] => url_4,
[5] => url_5)
),
[2] => array(
"word" => "огнетушитель оп 4",
"id" => 3,
"urls" => array(
[0] => url_1,
[1] => url_2,
[3] => url_3,
[4] => url_4,
[5] => url_5)
)
... и т.д.
Я написал такой код. Простеший алгоритм: берем первую фразу, и циклом проходимся по каждому элементу. Если есть совпадения удаляем из общего массива, перезапускаем функцию. Но жрет много оперативной памяти.
function cluster($words, $group = array())
{
$first_elem = array_shift($words);
$first_group = $first_elem['id'];
$array_urls = $first_elem['urls'];
foreach ($words as $i=>$data)
{
$check = array_intersect_key($array_urls, $data['urls']);
if(count($check) >= 3)
{
$group[$first_group][$i] = $data['word'];
unset($words[$i]);
}
}
if(!empty($words)) return cluster($words, $group);
return $group;
}