Php 相似性算法建议,使用二维关联数组

Php 相似性算法建议,使用二维关联数组,php,arrays,algorithm,similarity,Php,Arrays,Algorithm,Similarity,该算法的主要目标是从不同的网络来源中找到相似的新闻文章标题,并对它们进行分组,比如说在55.55%以上的相似性 我目前的算法方法包括以下步骤: 将MYSQL数据库中的数据馈送到二维数组中,例如,$arrayOne 将该数组的另一个副本复制到ex.$arrayTwo 创建一个干净的数组,该数组只包含类似的标题和其他内容,例如,$array\u smlr 循环,foreach$arrayOne文章标题检查与$arrayTwo文章标题的相似性 如果两个标题之间的相似性超过55%,并且文章不是来自同一

该算法的主要目标是从不同的网络来源中找到相似的新闻文章标题,并对它们进行分组,比如说在55.55%以上的相似性

我目前的算法方法包括以下步骤:

  • 将MYSQL数据库中的数据馈送到二维数组中,例如,$arrayOne
  • 将该数组的另一个副本复制到ex.$arrayTwo
  • 创建一个干净的数组,该数组只包含类似的标题和其他内容,例如,$array\u smlr
  • 循环,foreach$arrayOne文章标题检查与$arrayTwo文章标题的相似性
  • 如果两个标题之间的相似性超过55%,并且文章不是来自同一新闻来源(这样我就不会检查来自同一来源的相同文章),则将其添加到$array\u smlr
  • 根据相似性百分比对$array\u 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>";
}
$result=mysqli\u query($conn,“选择id\u文章,文章img,文章标题,左侧(文章内容,200),psource,日期\u从project.articles WHERE.rtrim($values,'or').”按日期排序\u获取描述限制70”);
$arrayOne=array();
$arrayTwo=array();
while($row=mysqli\u fetch\u assoc($result)){
$arrayOne[]=$row;
}
$arrayTwo=$arrayOne;
$array_smlr=array();
foreach($arrayOne作为$rowOne){
foreach($arrayTwo作为$rowTwo){
$compare=相似的文本($rowOne['article\u title'],$rowTwo['article\u title'],$p);
如果(四舍五入($p,2)>=55.50和$rowOne['psource']!=$rowOne['psource']){
$data=array('percentage'=>round($p,2),'article\u title'=>$rowdow2['article\u title'],'psource'=>$rowdow2['psource'],'id\u articles'=>$rowdow2['id\u articles'],'date\u fetched'=>$rowdow2['date\u fetched'];
$array_smlr[]=$data;
}
}
}
阵列多端口($array\u smlr);
foreach($array\u smlr作为$row3){
echo$row3['percentage']。$row3['article_title']。$row3['psource']。$row3['id_articles']。$row3['date_fetched']。“

”; }
只有当我有两个类似的标题时,它的功能才有限,但假设我有3个类似的标题,它将在$array\u smlr中包含重复的数据行

如果您对优化该算法以提高性能有任何建议,我将不胜感激


谢谢,

如果没有$key通配符,您实际上不需要2个数组而不是foreach循环,您可以将其与$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; 
        }
    }
}

只需使用mysql的全文搜索:你能解释一下如何实现它吗?我仍然使用类似的文本吗?是的,当然。如果我的答案是HelfPUL,请考虑接受和/或投票表决。谢谢。谢谢你的回复,但是我得到了这个错误。解析错误:语法错误,意外的“$key”(T_变量)我甚至尝试通过更改$arrayOne$key=>$rowOn和$arrayOne$ikey=>$rowow来修复该错误,但它不会返回任何内容。请将Group by ARCHIENT_title添加到MySQL子句中。尝试这样的关联数组:$array_smlr[$key]=$data;