function calcularPuntosIntereses($post_id, $datos)
{
    $puntosIntereses = 0;
    $datosAlgoritmo = (isset($datos['datosAlgoritmo'][$post_id]) && isset($datos['datosAlgoritmo'][$post_id]->meta_value))
        ? json_decode($datos['datosAlgoritmo'][$post_id]->meta_value, true)
        : [];
    $oneshot = ['one shot', 'one-shot', 'oneshot'];
    $esOneShot = false;

    $metaValue = isset($datos['datosAlgoritmo'][$post_id]->meta_value) ? $datos['datosAlgoritmo'][$post_id]->meta_value : '';

    if (!empty($metaValue)) {
        foreach ($oneshot as $palabra) {
            if (stripos($metaValue, $palabra) !== false) {
                $esOneShot = true;
                break;
            }
        }
    }

    foreach ($datosAlgoritmo as $key => $value) {
        if (is_array($value)) {
            foreach (['es', 'en'] as $lang) {
                if (isset($value[$lang]) && is_array($value[$lang])) {
                    foreach ($value[$lang] as $item) {
                        if (isset($datos['interesesUsuario'][$item])) {
                            $puntosIntereses += 10 + $datos['interesesUsuario'][$item]->intensity;
                        }
                    }
                }
            }
        } elseif (!empty($value) && isset($datos['interesesUsuario'][$value])) {
            $puntosIntereses += 10 + $datos['interesesUsuario'][$value]->intensity;
        }
    }
    
    if ($esOneShot) {
        $puntosIntereses *= 1;
    }
    
    return $puntosIntereses;
}


function calcularPuntosPost($post_id, $post_data, $datos, $esAdmin, $vistas_posts_processed, $identifier = '', $similar_to = null)
{
    $autor_id = $post_data->post_author;
    $post_date = $post_data->post_date;

    $puntosUsuario = in_array($autor_id, $datos['siguiendo']) ? 20 : 0;
    $puntosIntereses = calcularPuntosIntereses($post_id, $datos);

    // Calculate points based on identifier matches
    $puntosIdentifier = 0;
    if (!empty($identifier)) {
        $puntosIdentifier = calcularPuntosIdentifier($post_id, $identifier, $datos);
    }

    // Calculate points based on similarity to the specified post
    $puntosSimilarTo = 0;
    if (!empty($similar_to)) {
        $puntosSimilarTo = calcularPuntosSimilarTo($post_id, $similar_to, $datos);
    }

    $likes = isset($datos['likes_by_post'][$post_id]) ? $datos['likes_by_post'][$post_id] : 0;
    $puntosLikes = 30 + $likes;

    $diasDesdePublicacion = (current_time('timestamp') - strtotime($post_date)) / (3600 * 24);
    $factorTiempo = pow(0.99, $diasDesdePublicacion);

    $metaVerificado = (isset($datos['verificado_results'][$post_id]->meta_value) && $datos['verificado_results'][$post_id]->meta_value == '1') ? true : false;
    $metaPostAut = (isset($datos['postAut_results'][$post_id]->meta_value) && $datos['postAut_results'][$post_id]->meta_value == '1') ? true : false;

    $puntosFinal = calcularPuntosFinales(
        $puntosUsuario,
        $puntosIntereses + $puntosIdentifier + $puntosSimilarTo,
        $puntosLikes,
        $metaVerificado,
        $metaPostAut,
        $esAdmin
    );

    if (isset($vistas_posts_processed[$post_id])) {
        $vistas = $vistas_posts_processed[$post_id]['count'];
        $reduccion_por_vista = 0.01;
        $factorReduccion = pow(1 - $reduccion_por_vista, $vistas);
        $puntosFinal *= $factorReduccion;
    }

    $aleatoriedad = mt_rand(0, 20);
    $puntosFinal = $puntosFinal * (1 + ($aleatoriedad / 100));
    $ajusteExtra = mt_rand(-50, 50);
    $puntosFinal = $puntosFinal * $factorTiempo;
    $puntosFinal += $ajusteExtra;

    return max($puntosFinal, 0);
}


Entiendo que esto por cada coincidencia encontrada, suma 200 puntos, pero no debe de ser así, supongamos que identifier es así, hip hop drum, aqui tenemos 3 palabras, habran post que tengan la palabra hip hop y ese valor se va a sumar muchas veces a pesar de que ese post no tenga la palabra drum, lo importante es que si que mientras mas palabras, mas especifico tiene que ser y darle mas punto a las coicidencias, no me explico bien pero Identifier es la busqueda que hace el usuario, debe optimizarse para que encuentre lo que necesita 


function calcularPuntosIdentifier($post_id, $identifier, $datos)
{
    // Get datosAlgoritmo for the post
    $datosAlgoritmo = !empty($datos['datosAlgoritmo'][$post_id]->meta_value)
        ? json_decode($datos['datosAlgoritmo'][$post_id]->meta_value, true)
        : [];

    // Normalize identifier(s)
    if (is_array($identifier)) {
        $identifiers = $identifier;
    } else {
        $identifiers = preg_split('/\s+/', strtolower($identifier), -1, PREG_SPLIT_NO_EMPTY);
    }

    $count = 0;

    // Now go through datosAlgoritmo and count matches
    foreach ($datosAlgoritmo as $key => $value) {
        if (is_array($value)) {
            foreach (['es', 'en'] as $lang) {
                if (isset($value[$lang]) && is_array($value[$lang])) {
                    foreach ($value[$lang] as $item) {
                        $item_normalized = strtolower($item);
                        foreach ($identifiers as $id_word) {
                            if ($item_normalized == $id_word) {
                                $count += 1;
                            }
                        }
                    }
                }
            }
        } elseif (!empty($value)) {
            $value_normalized = strtolower($value);
            foreach ($identifiers as $id_word) {
                if ($value_normalized == $id_word) {
                    $count += 1;
                }
            }
        }
    }

    // Assign points based on occurrences
    $puntosIdentifier = $count * 200; 
    return $puntosIdentifier;
}