Советы алгоритма подобия с использованием двумерного ассоциативного массива

Основная цель этого алгоритма состоит в том, чтобы найти похожие заголовки новостных статей из разных источников в сети и сгруппировать их, скажем, выше 55,55% сходства.

Мой текущий подход к алгоритму состоит из следующих шагов:

  • Подача данных из базы данных MYSQL в двумерный массив ex. $ arrayOne.
  • Сделайте еще одну копию этого массива в ex. $ arrayTwo.
  • Создайте чистый массив, который будет содержать только похожие заголовки и другой контент, напр. $ array_smlr.
  • Петля, foreach $ arrayOne название статьи проверить на сходство с $ arrayTwo название статьи
  • Если сходство между двумя заголовками превышает 55% и если статья не из одного источника новостей (таким образом, я не проверяю одни и те же статьи из одного источника), добавьте ее в $ array_smlr
  • Сортировать $ array_smlr основываясь на процентах сходства, таким образом, я в итоге группирую названия, которые похожи.

Ниже мой код для упомянутых выше задач.

$result = mysqli_query($conn,"SELECT id_articles,article_img,article_title,LEFT(article_content , 200),psource, date_fetched FROM project.articles WHERE " . rtrim($values,' or') . " ORDER BY date_fetched DESC LIMIT 70");

$arrayOne=array();
$arrayTwo=array();

while($row = mysqli_fetch_assoc($result)){
$arrayOne[] = $row;
}
$arrayTwo = $arrayOne;
$array_smlr=array();
foreach ($arrayOne as $rowOne) {
foreach($arrayTwo as $rowTwo){
$compare = similar_text($rowOne['article_title'], $rowTwo['article_title'], $p);
if ( round($p,2) >= 55.50 and $rowOne['psource'] != $rowTwo['psource'] ){
$data =  array('percentage' => round($p,2), 'article_title' => $rowTwo['article_title'], 'psource' => $rowTwo['psource'], 'id_articles' => $rowTwo['id_articles'], 'date_fetched' =>$rowTwo['date_fetched']);
$array_smlr[]=$data;
}
}
}
array_multisort($array_smlr);
foreach($array_smlr as $row3){
echo $row3['percentage'] . $row3['article_title'] . $row3['psource'] . $row3['id_articles'] . $row3['date_fetched'] . "<br><br>";
}

Это работало бы с ограниченной функциональностью, только если бы у меня было два одинаковых заголовка, но, скажем, если бы у меня было 3 одинаковых заголовка, это включало бы дублированные строки данных в $ array_smlr.

Буду признателен, если у вас есть предложения по оптимизации этого алгоритма с целью повышения производительности.

Спасибо,

-1

Решение

На самом деле вам не нужны 2 массива вместо цикла foreach без подстановочного знака $ key, вы можете использовать его с $ key и пропускать решатель, когда $ key одинаков. Тогда вы также избегаете обманщиков.

foreach ($arrayOne as $key => $rowOne) {
foreach($arrayOne as $ikey => $rowTwo){
if ($ikey != $key) {
$compare = similar_text($rowOne['article_title'],$rowTwo['article_title'], $p);
if ( round($p,2) >= 55.50 and $rowOne['psource'] != $rowTwo['psource'] ){
$data =  array('percentage' => round($p,2), 'article_title' => $rowTwo['article_title'], 'psource' => $rowTwo['psource'], 'id_articles' => $rowTwo['id_articles'], 'date_fetched' =>$rowTwo['date_fetched']);
$array_smlr[$rowTwo['id_articles']]=$data;
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]