diff --git a/app/Http/Controllers/AutograderController.php b/app/Http/Controllers/AutograderController.php index 0a0bfaadd0074ae57890161542633e659cc22678..67993bd06f9bb10ca323b789792372abbc909099 100644 --- a/app/Http/Controllers/AutograderController.php +++ b/app/Http/Controllers/AutograderController.php @@ -147,23 +147,60 @@ class AutograderController extends Controller } } - $results[] = AutograderController::jaccardIndex($key, $answer); + $results[] = AutograderController::cosine($key, $answer); } return $results; } /** - * Get Jaccard Index score + * Get Cosine Similarity * * @return score */ - public function jaccardIndex($key, $answer) { - $arr_intersection = count(array_intersect( $key, $answer )); - $arr_union = count(array_merge( $key, $answer )) - $arr_intersection; - $jaccard_index = $arr_intersection / $arr_union; + public function cosine($key, $answer) { + $token = []; + $vector1 = []; + $vector2 = []; + foreach($key as $k) { + if (!in_array($k, $token)) { + $token[] = $k; + $vector1[] = 0; + $vector2[] = 0; + } + } + + foreach($answer as $k) { + if (!in_array($k, $token)) { + $token[] = $k; + $vector1[] = 0; + $vector2[] = 0; + } + } + + foreach($key as $k) { + $vector1[array_search($k, $token)] += 1; + } + foreach($answer as $k) { + $vector2[array_search($k, $token)] += 1; + } + + $dot_product = 0; + for($i=0; $i<count($token); $i++) { + $dot_product += ($vector1[$i])*($vector2[$i]); + } + + $length1 = 0; + $length2 = 0; - return $jaccard_index; + for($i=0; $i<count($token); $i++) { + $length1 += pow($vector1[$i], 2); + $length2 += pow($vector2[$i], 2); + } + + $similarity = $dot_product/sqrt($length1*$length2); + + return $similarity; } /**