Кластеризация фраз по 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;
}

Ответы (0 шт):