2013-05-14 44 views
0

我有一个问题,我很不确定如何解决此问题。计算阵列内部阵列的相似性

给出的是这样的形式排列:

$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是那些集群(他们不必是相同长度)

编辑: 所以我尽量进一步说明一点: 每个数组是聚类条件的用户的结果(根据他们的意思,这是一个伟大的,wel,,杜,ich ......)。所以每个子阵都是用户定义的一个集群。现在的问题是,用户没有限制他放置词语或整个群集的位置,所以我不能将$ array01 [0]与$ array02 [0]进行比较。 我想我需要比较具有最常见术语的子阵列。尽管每个用户都需要对所有术语进行聚类。

因此,例如:

$ array01 [0]和$ array02 [2]。他们有2个共同的术语:“du”和“ich” - > +1

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

+0

那么user1的任何单词都可以在user2的任何其他子数组中? – Borik 2013-05-14 17:22:23

+0

你能比较详细地描述你想要比较的内容以及你的意思吗?例如,你是否想比较'$ array01'和'$ array02'之间嵌套数组的所有值,并查看有多少个相互的值?你只想比较0到0,1到1等吗? – 2013-05-14 17:22:43

+2

你可以请你给你的例子预期的结果? – 2013-05-14 17:25:11

回答

2

这个怎么样?


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)); 

结果:可能通过foreach()机器人阵列

Array 
(
    [hallo] => 2 
    [welt] => 2 
    [du] => 3 
    [ich] => 3 
    [mag] => 4 
    [dich] => 4 
    [nicht] => 2 
    [haha] => 5 
    [huhu] => 2 
) 
1
count(array_intersect($array01[0],$array02[0])); 

&总和它。

1

根据你的评论,我的理解是你想比较第一个数组中的所有值到第二个数组。 IOW ARRAY1的所有子阵列内的所有字应该是比较数组2

$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)