【问题标题】:Counting similarity of arrays inside array计算数组内数组的相似度
【发布时间】:2013-05-14 17:04:33
【问题描述】:

我有一个问题,我很不确定如何解决。

给出的是这样格式的数组:

$array01 = array(
    0 => array("hallo", "welt", "du", "ich"),
    1 => array("mag", "dich"),
    2 => array("nicht", "haha", "huhu")
);

$array02 = array(
    0 => array("haha", "welt", "dich"),
    1 => array("hallo", "mag", "nicht"),
    2 => array("du", "ich", "huhu")
);

现在我想计算这些数组的某种相似度值。这些数组是根据含义对术语进行聚类的结果。

我想知道的是,两个不同的用户($array01 = user1, $array02 = user2) 对这些术语的相似程度如何。 0,1,2 是那些簇(它们不必是相同的长度)

编辑: 所以我试着进一步描述一下: 每个数组都是用户根据其含义对术语(hallo、welt、du、ich...)进行聚类的结果。所以每个子数组都是用户定义的一个簇。现在的问题是用户不受限制在他放置术语或整个集群的位置,所以我不能只比较 $array01[0] 和 $array02[0]。 我想我需要将子数组与最常见的术语进行比较。但是,每个用户都必须对所有术语进行聚类。

例如:

$array01[0] 和 $array02[2]。它们有两个共同点:“du”和“ich” -> +1

其他术语没有明确的聚类,所以我猜这个例子会产生 1,因为聚类不是很相似。

【问题讨论】:

  • 那么来自 user1 的任何单词,都可以在 user2 的任何其他子数组中吗?
  • 您能否更具体地说明您想要比较的内容以及比较的含义?例如,您是否只想比较$array01$array02之间嵌套数组的所有值,看看有多少相互值?您是否只想比较 0 与 0、1 与 1 等?
  • 您能否发布您给出的示例的预期结果?
  • 我试图更好地描述这个问题...寻找我的编辑。
  • 那么你想要一个关于 subArary 有多少项重叠的 Matrix 结果?

标签: php arrays


【解决方案1】:

这个怎么样?


get_similar_items

代码:

<?php

$array01 = array(
    0 => array("hallo", "welt", "du", "ich"),
    1 => array("mag", "dich"),
    2 => array("nicht", "haha", "huhu")
);

$array02 = array(
    0 => array("haha", "welt", "dich"),
    1 => array("hallo", "mag", "nicht"),
    2 => array("du", "ich", "huhu")
);

function get_similar_items() {
    $arrs = func_get_args();
    foreach ($arrs as &$arr) {
        while (list($k, $v) = each($arr)) {
            if (is_array($v)) {
                array_splice($arr,$k,1,$v);
                next($arr);
            }
        }
    }
    return call_user_func_array('array_intersect',$arrs);
}

print_r(get_similar_items($array01,$array02));

结果:

Array
(
    [0] => hallo
    [1] => welt
    [2] => du
    [3] => ich
    [4] => mag
    [5] => dich
    [6] => nicht
    [7] => haha
    [8] => huhu
)

get_similar_items_count

代码:

<?php

$array01 = array(
    0 => array("hallo", "welt", "du", "ich"),
    1 => array("mag", "dich"),
    2 => array("nicht", "haha", "huhu")
);

$array02 = array(
    0 => array("haha", "welt", "dich"),
    1 => array("hallo", "mag", "nicht"),
    2 => array("du", "ich", "huhu")
);

$array03 = array(
    0 => array("haha", "haha", "dich"),
    1 => array("dich", "mag", "mag"),
    2 => array("du", "ich", "haha")
);

function get_similar_items_count() {
    $arrs = func_get_args();
    foreach ($arrs as &$arr) {
        while (list($k, $v) = each($arr)) {
            if (is_array($v)) {
                array_splice($arr,$k,1,$v);
                next($arr);
            }
        }
    }
    unset($arr);
    $counts = array();
    foreach ($arrs as $arr) {
        foreach (array_count_values($arr) as $k => $v) {
            if ($v) {
                if (!isset($counts[$k])) {
                    $counts[$k]  = $v;
                } else {
                    $counts[$k] += $v;
                }
            }                
        }
    }
    return $counts;
}

print_r(get_similar_items_count($array01,$array02,$array03));

结果:

Array
(
    [hallo] => 2
    [welt] => 2
    [du] => 3
    [ich] => 3
    [mag] => 4
    [dich] => 4
    [nicht] => 2
    [haha] => 5
    [huhu] => 2
)

【讨论】:

    【解决方案2】:
    count(array_intersect($array01[0],$array02[0]));
    

    可能foreach() 通过机器人数组并求和。

    【讨论】:

      【解决方案3】:

      根据您的评论,我的理解是您想将第一个数组中的所有值与第二个数组进行比较。 IOW array1 的所有子数组中的所有单词都应该与 array2 的所有子数组的所有单词进行比较

      $array01 = array(
          0 => array("hallo", "welt", "du", "ich"),
          1 => array("mag", "dich"),
          2 => array("nicht", "haha", "huhu")
      );
      
      $array02 = array(
          0 => array("haha", "welt", "dich"),
          1 => array("hallo", "mag", "nicht"),
          2 => array("du", "ich", "huhu")
      );
      
      $t_array01 = array();
      foreach($array01 as $arr) {
        $t_array01 = array_merge($t_array01,$arr);
      }
      $t_array02 = array();
      foreach($array02 as $arr) {
        $t_array02 = array_merge($t_array02,$arr);
      }
      
      $common = array_intersect($t_array01,$t_array02);
      

      $common 是两个数组中所有单词的数组。在您的示例中,两个数组都包含所有相同的单词,因此它包含所有单词。如果你只想计算有多少,你可以做count($common)

      【讨论】:

        猜你喜欢
        • 2020-03-16
        • 2018-05-31
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        相关资源
        最近更新 更多