相似度算法建议,使用二维关联数组
Similarity algorithm advice, using two dimensional associative array
该算法的主要目标是从不同的网络来源中找到相似的新闻文章标题并将它们分组,假设相似度在 55.55% 以上。
我目前的算法方法包括以下步骤:
- 将 MYSQL 数据库中的数据输入 two-dimensional 数组 ex。 $arrayOne.
- 将该数组的另一个副本复制到 ex 中。 $arrayTwo.
- 创建一个干净的数组,它只包含类似的标题和其他内容。 $array_smlr.
- 循环,foreach $arrayOne article_title 检查与 $arrayTwo[=40= 的相似性] 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[ 中包含重复的数据行=40=]。
如果您对优化此算法以提高性能有任何建议,我将不胜感激。
谢谢,
你真的不需要 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;
}
}
}
该算法的主要目标是从不同的网络来源中找到相似的新闻文章标题并将它们分组,假设相似度在 55.55% 以上。
我目前的算法方法包括以下步骤:
- 将 MYSQL 数据库中的数据输入 two-dimensional 数组 ex。 $arrayOne.
- 将该数组的另一个副本复制到 ex 中。 $arrayTwo.
- 创建一个干净的数组,它只包含类似的标题和其他内容。 $array_smlr.
- 循环,foreach $arrayOne article_title 检查与 $arrayTwo[=40= 的相似性] 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[ 中包含重复的数据行=40=]。
如果您对优化此算法以提高性能有任何建议,我将不胜感激。
谢谢,
你真的不需要 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;
}
}
}