06.01.2019 10:30:34 am
Доброго времени суток!
Как можно по заголовку статьи получить схожие записи в языке PHP?
Спасибо.
Как можно по заголовку статьи получить схожие записи в языке PHP?
Спасибо.
- Жалоба
06.01.2019 12:06:03 pm
Думаю, получить похожие записи можно при помощи функции similar_text(): http://php.net/manual/ru/function.similar-text.php. Функция создана для вычисления степени схожести двух строк. Решение на скорую руку: прогоняем все заголовки через цикл получая процент схожести каждого заголовка и сохраняя результат в отдельный массив. Затем получаем самый большой процент и выводим заголовок на экран. Что то типа того:
Результат выполнения:
Чтобы не терять производительность при переборе большого массива заголовков, рекомендую сохранять похожие статьи в кэше сайта.
// Ищем похожие статьи для заголовка "Не работают динамики"
$nameArticle = 'Не работают динамики';
// Заголовки статей
$titles = [
'Делаем клетку для кроликов',
'Как разблокировать смартфон',
'Как найти похожие записи',
'Сканер отпечатка пальца не работает',
'Тихий звук из разговорного динамика'
];
$similar = [];
foreach ($titles as $title)
{
similar_text($nameArticle, $title, $perc);
$similar[] = $perc;
}
echo $titles[array_search(max($similar), $similar)];
Результат выполнения:
Тихий звук из разговорного динамика
Чтобы не терять производительность при переборе большого массива заголовков, рекомендую сохранять похожие статьи в кэше сайта.
07.01.2019 09:34:26 am
Я показал пример из массива, где будут только заголовки, но при получении данных о статьях, например, из Базы Данных, массив будет состоять из массивов, а не из строк... В массивах будут заголовки, идентификаторы и возможно еще какие то данные на статью. Следовательно, массив должен выглядеть примерно так:
Далее. Можно добавлять в каждый массив новый элемент, а не создавать новый массив (как я делал первый раз):
Сортируем массив по элементу
И получаем последние три массива:
Меняйте цифру
Теперь переменная
$articles = [
['id' => 1, 'name' => 'Делаем клетку для кроликов'],
['id' => 2, 'name' => 'Как разблокировать смартфон'],
['id' => 3, 'name' => 'Как найти похожие записи'],
['id' => 4, 'name' => 'Сканер отпечатка пальца не работает'],
['id' => 5, 'name' => 'Тихий звук из разговорного динамика']
];
Далее. Можно добавлять в каждый массив новый элемент, а не создавать новый массив (как я делал первый раз):
foreach ($articles as $key => $article)
{
similar_text($nameArticle, $article['name'], $perc);
$articles[$key]['similar'] = $perc;
}
Сортируем массив по элементу
similar
:usort ($articles, function($a, $b)
{
return ($a['similar'] - $b['similar']);
});
И получаем последние три массива:
$articles = array_slice($articles, -3, 3);
Меняйте цифру
3
на нужное количество схожим статьям.Теперь переменная
$articles
содержит три массива данных похожих статей.