【问题标题】:Similarity algorithm advice, using two dimensional associative array相似算法建议,使用二维关联数组
【发布时间】:2015-05-18 21:05:31
【问题描述】:

该算法的主要目标是找到来自不同网络来源的新闻文章的相似标题并将它们分组,假设相似度高于 55.55%。

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

  • 将 MYSQL 数据库中的数据输入二维数组 ex。 $arrayOne
  • 将该数组的另一个副本复制到 ex。 $arrayTwo
  • 创建一个只包含类似标题和其他内容的干净数组。 $array_smlr
  • 循环,foreach $arrayOne article_title 检查与 $arrayTwo article_title 的相似性
  • 如果两个标题之间的相似度超过 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 中包含重复的数据行。

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

谢谢,

【问题讨论】:

标签: php arrays algorithm similarity


【解决方案1】:

你真的不需要 2 个数组而不是没有 $key 通配符的 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; 
        }
    }
}

【讨论】:

  • 你能解释一下如何实现它吗?我还使用similar_text吗?
  • 是的,当然。如果我的回答是有帮助的,请考虑接受和/或投票。谢谢。
  • 感谢您的回复,但我收到此错误。解析错误:语法错误,意外的 '$key' (T_VARIABLE) 我什至尝试通过更改 $arrayOne $key => $rowOn 和 $arrayOne $ikey => $rowTwo 来修复该错误,但它不会返回任何内容。
  • 将 Group by article_title 添加到您的 MySQL 子句中。
  • 试试这样的关联数组:$array_smlr[$key]=$data;
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 2011-04-05
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多