サイトユーザーの手によるオブジェクトの入力(プロパティの定義)

新しく作成されたオブジェクトのプロパティのセットを定義する必要がある場合が頻繁にあります。 たとえば、これは商品、映画の説明があるサイトに関係する場合があります(したがって、各オブジェクトにはタグまたはプロパティのセットが必要です)。 一般に、これは、プロパティの存在と、「類似または非類似」の原則に基づいてオブジェクトを相互に比較する能力を暗示するオブジェクトの記述のリポジトリに適用されます。



そのため、サイトには、プロパティが定義および検証される既製のオブジェクトセットがあります。 そして、新しいオブジェクトが追加されます。これについては何も知りませんが、サイトの訪問者は判断できます。 目的:管理者が必要なプロパティを手動で追加する必要がないことを確認しますが、すべてはサイト訪問者の手によって自分で行われます。



明確にするために、携帯電話専用のWebサイトがあると仮定します。 サイト上(単純化のため)-次の条件付きプロパティを持つ5台の電話機(プロパティには便宜上番号が付けられています):

A>振動アラート(1)、ラジオ(2)、スピーカーフォン(3)、懐中電灯(4)

B>振動アラート(1)、スピーカーフォン(3)、mp3プレーヤー(5)

C>懐中電灯(4)、ワンピースハウジング(6)、MP3プレーヤー(5)

D>分離不可能なハウジング(6)、TV(7)

E> MP3プレーヤー(5)、TV(7)、ラジオ(2)



そして、6番目のデバイスが追加されます。これについては、訪問者とは異なり、サイト管理者は何も知りません。 ラジオ(2)とテレビ(7)を備えたデバイスとします。



この例では、オブジェクトの可能な属性は7つのみです。 すべての可能なプロパティを新しいオブジェクトに割り当てます。



次のステップは、オブジェクトが実際に所有するプロパティのみを決定することです。これを行うには、サイトへの訪問者が既知のオブジェクトと新しいオブジェクトとの類似度を選択することをお勧めします。 類似性は0〜2倍のスケールで評価されます。0-「見えない」、1-「共通点がある」、2-「非常に類似している」。 より拡張されたスケールを作成することもできますが、簡単にするためにここではこれを使用します。



比較するとき、新しいオブジェクトと既知のオブジェクトの両方が持つプロパティのみを考慮します。 ユーザーが「非常に似ている」類似度を選択した場合、不明なオブジェクトの交差するプロパティの「重み」に1を追加します。 「共通点がある」場合は0.5を加算し、「似ていない」場合は1を減算します。



アルゴリズムの動作を説明するPHPの小さな例をスケッチしました。



//      $known_objects = array ('a'=>1, 'b'=>0, 'c'=>0, 'd'=>1, 'e'=>2); //    $a = array (1,2,3,4); $b = array (1,3,5); $c = array (4,6,5); $d = array (6,7); $e = array (5,7,2); //       ,    = 1 $new_object = array (1=>1, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1); //,   ,      const K_MUL = 0.1; $s = array_keys($known_objects); //100 ,      for ($i=0; $i<100; $i++) { shuffle($s); $new_object = cmp($new_object, $$s[0], $known_objects[$s[0]]); } //  process($new_object); //  print_r($new_object); //        0.5 function process(&$new_object) { $max = 0; foreach ($new_object as $k=>$v) { if ($v > $max) { $max = $v; } } $mv = 1.1; if ($max > $mv) { $div = (1 / $max); foreach ($new_object as $k=>$v) { $new_object[$k] *= $div; } } foreach ($new_object as $k=>$v) { if ($new_object[$k] <0.5) { unset($new_object[$k]); } } } //  ($a)   ($b)  function cmp($a,$b,$val) { switch ($val) { case 0: { $add = -0.5; break; } case 1: { $add = 0.5; break; } case 2: { $add = 1; break; } } foreach ($a as $k=>$v) { if (in_array($k, $b)) { $a[$k] += $add * K_MUL; } } return $a; }
      
      







コードは非常に原始的ですが、作業の理解を提供します。

出力では、このような配列のようなものが得られます。キーはプロパティ番号であり、値は計算された重みです



配列



[2] => 1

[7] => 0.944444





テストが示すように、精度は反復回数に依存し、最小反復回数= 50(K_MUL * 0.5と相関します。0.5は最小重量変化ステップです)。



類似度が異なる既知のオブジェクトを追加すると、未知のオブジェクトのプロパティの定義が改善されます。



人的要因


私たちが検討したケースは理想的です。 しかし、たとえば、特定の割合のユーザーが不正確に応答した場合はどうなりますか? この状況をシミュレートするには、cmp関数に次の行を追加して、応答のランダム化を追加します。

If(rand(0,100)> 70){

$ val = rand(0,2);

}



3つごとの答えがランダムである状況をシミュレートします(真実に対応する場合も、そうでない場合もあります)。



テストが示したように、反復回数が3倍増加すると(潜在的に間違った答えの同じ1/3)、同じ配列2と7が得られ、「プロセス」関数のしきい値を変更することで除去できる変動が時々現れる

配列(

[2] => 0.98648648648649-有効なプロパティ

[6] => 0.50675675675676-変動

[7] => 1は有効なプロパティです





可能な改善


最初の改善点は、エラーの排除です。 十分な数の比較を行うことで、総質量に適合しない結果を除外することができ、それにより精度を高めることができます。



2番目の改善:ユーザー間で音声の重みを変更します。

大多数の回答と一致する回答を持つユーザーは、自分の声からより大きな重みを受けます。 したがって、「類似性」に対するその後の投票では、そのようなユーザーの投票はより重要になり、スプレッドも減少するはずです。



重要な追加:このようなアルゴリズムは、ユーザーがミスを犯す可能性のあるフレンドリーな環境で動作すると想定されていますが、意図的または大規模に動作することはありません。



質問、提案、コメントだけに喜んでいます。



All Articles