double cosine_similarity(vector<double>& v1, vector<double>& v2) {
double dot_product = 0.0;
double norm_v1 = 0.0;
double norm_v2 = 0.0;
for (int i = 0; i < v1.size(); i++) {
dot_product += v1[i] * v2[i];
norm_v1 += v1[i] * v1[i];
norm_v2 += v2[i] * v2[i];
}
return dot_product / (sqrt(norm_v1) * sqrt(norm_v2));
}