En la sub carpeta 'reconocimento' almacenamos el archivo 'facturas.php' que tiene por objetivo analizar preguntas puntuales sobre las facturas que almacena el sistema.
facturas.php
<?php
//******************************Consultas sobre facturacion **************************************/
function consultasSobreFacturas()
{
    global $palabras;
    if (strpos($_GET['oracion'], "facturas de") !== false || strpos($_GET['oracion'], "factura de") !== false) {
        $nombres = '';
        for ($inicio = 2; $inicio < count($palabras); $inicio++) {
            $nombres .= $palabras[$inicio] . " ";
        }
        facturasde(trim($nombres));
        exit();
    }
    if (
        strpos($_GET['oracion'], "facturas con importe menor a") !== false ||
        strpos($_GET['oracion'], "factura con importe menor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMenorA($importe);
        exit();
    }
    if (
        strpos($_GET['oracion'], "facturas con importe mayor a") !== false ||
        strpos($_GET['oracion'], "factura con importe mayor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMayorA($importe);
        exit();
    }
    if (
        strpos($_GET['oracion'], "factura numero") !== false ||
        strpos($_GET['oracion'], "facturas numero") !== false
    ) {
        $numero = $palabras[count($palabras) - 1];
        facturaNumero($numero);
        exit();
    }
}
function facturasde($persona)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select 
              fact.codigo as codigo,
              date_format(fecha,'%d/%m/%Y') as fecha,
              nombre,
              round(sum(deta.precio*deta.cantidad),2) as importefactura
          from facturas as fact 
          join clientes as cli on cli.codigo=fact.codigocliente
          join detallefactura as deta on deta.codigofactura=fact.codigo
          where nombre='$persona'
          group by deta.codigofactura
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
function facturasConImporteMenorA($importe)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select 
              fact.codigo as codigo,
              date_format(fecha,'%d/%m/%Y') as fecha,
              nombre,
              round(sum(deta.precio*deta.cantidad),2) as importefactura
          from facturas as fact 
          join clientes as cli on cli.codigo=fact.codigocliente
          join detallefactura as deta on deta.codigofactura=fact.codigo          
          group by deta.codigofactura
          having importefactura<$importe
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
function facturasConImporteMayorA($importe)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select 
              fact.codigo as codigo,
              date_format(fecha,'%d/%m/%Y') as fecha,
              nombre,
              round(sum(deta.precio*deta.cantidad),2) as importefactura
          from facturas as fact 
          join clientes as cli on cli.codigo=fact.codigocliente
          join detallefactura as deta on deta.codigofactura=fact.codigo          
          group by deta.codigofactura
          having importefactura>$importe
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
function facturaNumero($numero)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select    pro.descripcion as descripcion,         
              deta.precio as precio,
              cantidad,
              round(deta.precio*deta.cantidad,2) as importefactura
            from detallefactura as deta 
            inner join productos as pro on pro.codigo=deta.codigoproducto
            where codigofactura=$numero
    union
    select   '',
             '',
             'Total a pagar:',
             round(sum(deta.precio*deta.cantidad),2) as importefactura
           from facturas as fact 
           join clientes as cli on cli.codigo=fact.codigocliente
           join detallefactura as deta on deta.codigofactura=fact.codigo          
           where fact.codigo=$numero
           group by deta.codigofactura
    ");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
?>
La función 'consultasSobreFacturas' accede a la variable global '$palabras' que recordemos es un arreglo con todas las palabras contenida en la oración:
function consultasSobreFacturas()
{
    global $palabras;
En la misma función 'consultasSobreFacturas' mediante un if verificamos si la horación contiene la cadena 'facturas de' o 'factura de':
    if (strpos($_GET['oracion'], "facturas de") !== false || strpos($_GET['oracion'], "factura de") !== false) {
        $nombres = '';
        for ($inicio = 2; $inicio < count($palabras); $inicio++) {
            $nombres .= $palabras[$inicio] . " ";
        }
        facturasde(trim($nombres));
        exit();
    }
En caso afirmativo mediante un for recuperamos todas las palabras que tiene la oración después de dichas dos palabras, tenemos un resultado similar a:

Es responsabilidad de la función 'facturasde' generar el archivo JSON que retornaremos:
function facturasde($persona)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select 
              fact.codigo as codigo,
              date_format(fecha,'%d/%m/%Y') as fecha,
              nombre,
              round(sum(deta.precio*deta.cantidad),2) as importefactura
          from facturas as fact 
          join clientes as cli on cli.codigo=fact.codigocliente
          join detallefactura as deta on deta.codigofactura=fact.codigo
          where nombre='$persona'
          group by deta.codigofactura
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
Si la oración contiene la cadena "facturas con importe menor a" o "factura con importe menor a" se llama a la función encargada de generar ej JSON correspondiente que es facturasConImporteMenorA:
    if (
        strpos($_GET['oracion'], "facturas con importe menor a") !== false ||
        strpos($_GET['oracion'], "factura con importe menor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMenorA($importe);
        exit();
    }
La función facturasConImporteMenorA implementa el algoritmo:
function facturasConImporteMenorA($importe)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select 
              fact.codigo as codigo,
              date_format(fecha,'%d/%m/%Y') as fecha,
              nombre,
              round(sum(deta.precio*deta.cantidad),2) as importefactura
          from facturas as fact 
          join clientes as cli on cli.codigo=fact.codigocliente
          join detallefactura as deta on deta.codigofactura=fact.codigo          
          group by deta.codigofactura
          having importefactura<$importe
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
Tenemos un resultado en el navegador similar a:

De forma idéntica resolvemos el problema para mostrar la/s facturas con importe mayor a un cierto importe:
    if (
        strpos($_GET['oracion'], "facturas con importe mayor a") !== false ||
        strpos($_GET['oracion'], "factura con importe mayor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMayorA($importe);
        exit();
    }
Finalmente generamos el listado de una factura conociendo su número cuando ingresamos la frase 'factura número':
    if (
        strpos($_GET['oracion'], "factura numero") !== false ||
        strpos($_GET['oracion'], "facturas numero") !== false
    ) {
        $numero = $palabras[count($palabras) - 1];
        facturaNumero($numero);
        exit();
    }
Tenemos un resultado en el navegador similar a:

Dicho resultado procede de la ejecución del siguiente comando SQL:
function facturaNumero($numero)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select    pro.descripcion as descripcion,         
              deta.precio as precio,
              cantidad,
              round(deta.precio*deta.cantidad,2) as importefactura
            from detallefactura as deta 
            inner join productos as pro on pro.codigo=deta.codigoproducto
            where codigofactura=$numero
    union
    select   '',
             '',
             'Total a pagar:',
             round(sum(deta.precio*deta.cantidad),2) as importefactura
           from facturas as fact 
           join clientes as cli on cli.codigo=fact.codigocliente
           join detallefactura as deta on deta.codigofactura=fact.codigo          
           where fact.codigo=$numero
           group by deta.codigofactura
    ");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
Para extender las posibilidades de consultas de facturación debemos agregar las cadenas a buscar en la oración que se efectúan en la función 'consultasSobreFacturas' y la posterior implementación del comando SQL que la responde.