- スレ立てるまでもない質問はここで 142匹目 [無断転載禁止]©2ch.net
537 :デフォルトの名無しさん[]:2016/04/14(木) 11:28:30.22 ID:zK0B8WUx - >>536
PHPでいま作った。単語の重み、重要度考慮なし。参考。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); }
| - スレ立てるまでもない質問はここで 142匹目 [無断転載禁止]©2ch.net
538 :デフォルトの名無しさん[]:2016/04/14(木) 11:37:07.70 ID:zK0B8WUx - >>537で全角ひらがなの価値をゼロにしたら少しは改善する気はする。
それをやってみるか。
| - スレ立てるまでもない質問はここで 142匹目 [無断転載禁止]©2ch.net
539 :デフォルトの名無しさん[]:2016/04/14(木) 12:22:59.25 ID:zK0B8WUx - ひらがな無視したら95%の類似度になった。
$A="1192年鎌倉幕府が誕生し、源頼朝が最初の征夷大将軍になった。";$B="源頼朝が征夷大将軍となり、鎌倉に幕府が誕生したのが1192年のことであった。"; $A = tovector($A); $B = tovector($B); echo "類似度は " .cossimilar($A, $B)."です。\n"; // 0.95 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_sub( &$tango, $A) { $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]++; }} function tovector($A) { $tango = array(); $X = preg_split("/[。、ぁ-ん]/u", $A, -1, PREG_SPLIT_NO_EMPTY); foreach ($X as $x) tovector_sub( $tango, $x); return normalization($tango); }
| - スレ立てるまでもない質問はここで 142匹目 [無断転載禁止]©2ch.net
545 :デフォルトの名無しさん[]:2016/04/14(木) 17:43:02.68 ID:zK0B8WUx - 意味までいくと、英語、ロシア語、中国語でも判定しないといけないだろうし
翻訳ソフトなみの技術、手間がかかるな。まともな検索エンジンを作ることとも似てるが。
|
|