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

ここで、これらの配列のある種の類似値を計算したいと思います。これらの配列は、意味に従って用語をクラスタリングした結果です。

私が知りたいのは、これらの用語が 2 人の異なるユーザーによってどの程度類似しているかということです($array01 = user1, $array02 = user2)。0,1,2 はそれらのクラスターです (同じ長さである必要はありません)

編集:だから私はもう少し説明しようとします:すべての配列は、ユーザーが意味に従って用語(ハロー、ウェルト、デュ、イク...)をクラスタリングした結果です。したがって、すべてのサブアレイは、ユーザーによって定義された 1 つのクラスターです。問題は、ユーザーが用語またはクラスター全体を配置する場所に制限されていないため、$array01[0] と $array02[0] を単純に比較できないことです。サブアレイを最も一般的な用語と比較する必要があると思います。ただし、すべてのユーザーはすべての用語をクラスター化する必要があります。

たとえば、次のようになります。

$array01[0] と $array02[2]。「du」と「ich」の 2 つの用語が共通している -> +1

他の用語には明確なクラスタリングがないため、クラスタリングがあまり似ていないため、この例では 1 が返されると思います。

4

3 に答える 3

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

結果:

Array
(
    [hallo] => 2
    [welt] => 2
    [du] => 3
    [ich] => 3
    [mag] => 4
    [dich] => 4
    [nicht] => 2
    [haha] => 5
    [huhu] => 2
)
于 2013-05-14T17:22:34.180 に答える
1
count(array_intersect($array01[0],$array02[0]));

おそらくforeach()ボット配列を介して、合計します。

于 2013-05-14T17:23:09.693 に答える