スレ立てるまでもない質問はここで 142匹目 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0537デフォルトの名無しさん
2016/04/14(木) 11:28:30.22ID:zK0B8WUxPHPでいま作った。単語の重み、重要度考慮なし。参考。http://altarf.net/computer/ruby/3226
$A="1192年鎌倉幕府が誕生し、源頼朝が最初の征夷大将軍になった。";$B="源頼朝が征夷大将軍となり、鎌倉に幕府が誕生したのが1192年のことであった。";
$A = tovector($A); $B = tovector($B); echo "類似度は " .cossimilar($A, $B)."です。\n"; // 0.747
$A="のび太とドラえもん"; $B="ドラえもんと野比のび太";
$A = tovector($A); $B = tovector($B); echo "類似度は " .cossimilar($A, $B)."です。\n"; // 0.819
return;
function cossimilar($X, $Y) {
$s=0.0; reset($X); reset($Y);
do { $m = key($X); $n = key($Y);
if($m < $n) { if(!next($X)) break; continue; }
if($m > $n) { if(!next($Y)) break; continue; }
$s += current($X)*current($Y);
$f = next($X); $g = next($Y);
if(!$f && !$g) break; if(!!$f && !!$g) continue;
if(!$f) end($X); else end($Y); } while(1);
return sqrt($s); }
function normalization($V) {
ksort($V);
$s=0.0; foreach ($V as &$x) $s += $x*$x; $s=sqrt($s);
foreach ($V as &$x) $x /= $s; return $V; }
function tovector($A) {
$tango = array(); $X = unpack( "C*", $A );
for($n=1; $n+2<=count($X); $n++) {
$y = $X[$n] + 256*$X[$n+1] + 256*256*$X[$n+2];
if( !isset($tango[$y])) $tango[$y]=1;else $tango[$y]++; }
return normalization($tango); }
■ このスレッドは過去ログ倉庫に格納されています