package cybersecurity // JaccardSimilarity calcula la similitud de Jaccard entre dos conjuntos de tokens. // Devuelve un valor entre 0.0 (sin interseccion) y 1.0 (conjuntos identicos). func JaccardSimilarity(a, b []string) float64 { if len(a) == 0 && len(b) == 0 { return 1.0 } if len(a) == 0 || len(b) == 0 { return 0.0 } setA := make(map[string]struct{}, len(a)) for _, s := range a { setA[s] = struct{}{} } setB := make(map[string]struct{}, len(b)) for _, s := range b { setB[s] = struct{}{} } intersection := 0 for k := range setA { if _, ok := setB[k]; ok { intersection++ } } // Union = |A| + |B| - |A intersect B| (usando conjuntos sin duplicados) union := len(setA) + len(setB) - intersection if union == 0 { return 0.0 } return float64(intersection) / float64(union) }