¿Cómo se llama la tarjeta gráfica Baidu ai?
1 Introducción
Primero, hablemos de los requisitos del proyecto.
Dos usuarios subieron dos textos diferentes. Calcule la similitud entre los dos textos y haga coincidir los datos calificados en la base de datos. Se estima que se enumerarán entre 60 y 100 artículos, ni más, solo menos. El requisito final es encontrar aquellos elementos con alta similitud a partir de estos resultados coincidentes.
Escribir un algoritmo usted mismo es un gran proyecto que involucra algunos aspectos del procesamiento del lenguaje natural, lo cual es relativamente complicado. Entonces busqué en línea y descubrí que el procesamiento del lenguaje natural de la plataforma abierta Baidu se puede llamar de forma gratuita, con 10 W de llamadas por día, que es suficiente para mi pequeño proyecto. Pero cuando me negué, descubrí que Baidu me dio un recordatorio y no garantizó la concurrencia. En otras palabras, cuando lo llamo, es fácil devolver resultados incorrectos y esta parte debe manejarse adecuadamente.
Dado que este es un combate real, comencemos desde el principio.
2. Preparación
¿Por dónde empezar? Comience creando una aplicación en Baidu Open Platform. Después de crear la aplicación (el siguiente entorno de desarrollo es PHP, así que complete HTML al seleccionar el tipo de uso de la aplicación), estará la ID, la clave y el secreto de la aplicación. Los dos últimos parámetros serán útiles a continuación.
Utilizo la API de similitud de texto corto y las funciones de otros tipos son básicamente las mismas que esta (no se aceptan disputas). Al mirar primero la documentación de desarrollo/docs#/NLP-API/top, puede ver que hay dos métodos de llamada. Aquí tomamos el primer método de llamada como ejemplo: usamos POST para enviar una solicitud a la dirección del servicio API para lograr la función anterior. Si observa la descripción, se requiere un parámetro denominado access_token y el artículo original también proporciona su método de adquisición. Tome access_token para obtener similitud de texto breve como ejemplo:
/oauth/2.0/token? Tipo de autorización=Certificado de cliente. client_id = MzRN * * * * * * txgske 3 qrf 5 yj 69 & client_secret = a 30 cabc * * * * * bduugldhleyrazk 1tq 5 &
A * * * implica tres parámetros, el primero está fijo en client_credentials, no lo cambie.
La segunda y tercera son las claves y secretos obtenidos anteriormente.
Coloque esta cadena de direcciones en la barra de direcciones y presione Enter para devolver una cadena en formato json. Busque el token de acceso y cópielo en un archivo para usarlo más adelante.
Nota: Al copiar la dirección, pueden quedar espacios en el medio, los cuales deben eliminarse. Especialmente al copiar el código en el documento de desarrollo, si hay espacios, no se obtendrán los resultados devueltos. Puedes copiar mi dirección, pero no hay problema.
En tercer lugar, comencemos
Escribamos código PHP. Sólo necesitamos un archivo para todo el proceso.
PHP puede usar curl para solicitar parámetros de URL. En la documentación de desarrollo se explica que se debe pasar access_token y que el texto de la solicitud se debe pasar en formato json (la codificación es GBK). El código es el siguiente:
$ access_token=" 24 . a 810 B4 be 2b 5683 a4 D6 af 2f 47 b 420877 f . 2592000.1507883636.282335-10044457 "
$url = "/rpc/2.0/nlp/v2/simnet?access_token=". $ access _ token
$body=array(
" text_1"= >"Vi una colcha frente al salón B. Algún compañero debe haber olvidado quitársela. Recuerda . Recógelo.",
" text_2"= >"Hay una bicicleta amarilla en la puerta de Un mensaje. Por favor, reclámala.
”
);
$ JSON _ data = JSON _ encode($ body);
Este código implementa las funciones anteriores a tiempo. Al convertir al formato json, el chino se convierte de UTF8 a GBK de forma predeterminada, no se requieren otras operaciones
$ curl = curl _init();
curl_setopt($curl, CURLOPT_URL, $ URL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, verdadero);
curl_setopt($curl, CURLOPT_POST, verdadero);
curl_setopt($ curl, CURLOPT_POSTFIELDS, $data array[$I]);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //Cancelar la verificación de la certificación SSL
Finalmente, debes cancelar SSL verificación de certificación; de lo contrario, se informará un error.
$ resultado = curl _ exec($ ch
//var _ dump($ resultado
<); p>$json = iconv( "gb2312", "UTF-8", $result); //El formato devuelto es codificación GBK china y debe convertirse a UTF8Salida $json. Puede ver el resultado devuelto.
p>Pero el proceso anterior solo logra coincidencias de similitud para un registro. ¿Cómo implementar múltiples registros? ¡No! al mismo tiempo, la respuesta es: el resultado se devuelve correctamente, pero el tiempo de retorno es muy lento, porque las 10 solicitudes se ejecutan secuencialmente, por lo que el siguiente problema es resolver el problema paralelo. > Cuarto, resolver problemas paralelos y problemas de concurrencia QPS
La mala noticia que todos saben es que PHP en sí no admite subprocesos múltiples, lo que me hace sentir como si estuviera muriendo
El otro. La buena noticia es que curl puede procesar múltiples subprocesos en paralelo para simular subprocesos múltiples. Muy bien, ¡bang! Se envían 30 solicitudes de URL al mismo tiempo y el tiempo final depende de la solicitud más lenta. p>El siguiente es el primer código. Creé 20 datos (el contenido del texto es el mismo, no importa si es diferente)):
& lt? abreviatura de preprocesador de hipertexto profesional)
header( ' content-type: text/html; charset = utf8 ');
$localtime=date('y-m-d H:i:s '); , hora());
Echo "Hora de inicio":$ hora local
$ acceso _ token = " 24 . a 810 B4 be 2 b5 * * * * * * * * * * * * * * * * * 507883636.282335-10044457 ";
$url = "/rpc/2.0/nlp/v2/simnet? Access token = ".$ access _ token
$body=array(
" text_1"= >"Vi una colcha frente al salón B. ¿Qué compañero debería ser? Se me olvidó llevármela. Recuerda recogerla.",
" text_2"=>"Hay una bicicleta amarilla en la puerta, por favor reclámala.
”
);
$ JSON _ datos = JSON _ codificar ($ cuerpo
$ datos matriz = matriz(); p>for($I = 0;$i & lt160;$i++){
array_push($dataArray, $JSON_data);
}
$ jsonResultArray = array();
mFunction($url, $dataArray, $jsonResultArray);
/*$jsonResultArray=func($url,$JSON_data); devolvió matriz json*/
Función mFunction($url, $dataArray y amp$jsonResultArray){
$ multi URL = curl _ multi _ init();
$ curls = array(); // Almacena todos los objetos ch
for($ I = 0; $i & ltcount($ data array); $i++){
$ curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $URL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, verdadero
curl_setopt($curl, CURLOPT_POST, verdadero);
curl_setopt($curl, CURLOPT_POSTFIELDS, $matriz de datos[$I]);
curl_setopt($ curl, CURLOPT_SSL_VERIFYPEER, falso) ; // Cancelar la verificación de la certificación SSL
curl_multi_add_handle($multi URL, $curl);
array_push($curls, $curl );
} p>
/* $ corriendo = null;
Hacer {
$ MRC = curl _ multi _ exec($ multi curl, $ corriendo);
} while($MRC == CURLM _ CALL _ MULTI _ PERFORM);
mientras($ejecutando & amp; & amp$mrc == CURLM_OK) {
if( curl_multi_select($multiURL)! =-1) ¡El lote {/$ MH también tiene un identificador $ch ejecutable, curl_multi_select($mh)! = -1El programa sale del estado de bloqueo.
Hacer {//Continuar ejecutando el identificador $ch que debe procesarse.
$MRC = curl_multi_exec($multi curl,$running);
} while($MRC = = CURLM_CALL_MULTI_PERFORM);
}
}*/
$ running = null
//Ejecutar identificador por lotes
Haz { p>
us LEEP(10000);
curl_multi_exec($multicurl, $running);
} while($running>0);
$ fail array = array();
for($ I = 0; $ i & ltcount($ matriz de datos); $i++){
$temp=iconv( "gb2312", "UTF-8", curl_multi_get content( $ curls[$I])); //Lo que se obtiene es la cadena en formato json del resultado devuelto.
$ matriz de resultados = JSON _ decode($ temp); //Obtener una matriz
Si (la matriz _ clave _ existe ("error _ msg", $ matriz de resultados)) {//Si hay un error, reenviar la solicitud y asignar el resultado final a temporal.
array_push($failArray, $data array[$I]);
curl_multi_remove_handle($multi curl,$curls[$I]);
p >
}else{
array_push($jsonResultArray, $temp);
curl_multi_remove_handle($multi curl,$curls[$I]) ;
}
}
if($failArray!=null){//Si la matriz $failArray no está vacía, continúe llamando a func().
curl_multi_close($multi curl);
mFunction($url, $failArray, $jsonResultArray //$url, $JSON_data&$ jsonResultArray
}else{//Si la matriz $failArray está vacía, return puede salir de la función.
curl _ multi _ close($ multi curl
Retorno
}
}
for($I = 0;$i & ltcount($jsonResultArray);$i++){
var _ dump($jsonResultArray[$I]);
}
$localtime=date('y-m-d H:i:s ', time());
Echo "end time":$ localtime
El código anterior, eso es Bien, todo el código ha sido publicado y los comentarios se pueden leer. Todo en el código resuelve todos los problemas causados por la concurrencia.
curl_multi_init(). No quiero decir más sobre el uso de "", pero puedo buscarlo en todas partes de Internet. Puedes consultar el tutorial para principiantes. Hablemos de cómo lidiar con QPS.
Debido a que la velocidad de envío paralelo es demasiado rápida, el servidor puede alcanzar fácilmente el límite de QPS y devolverá un código de error:
{"error_msg ":"Abrir solicitud qps de API Se ha alcanzado el límite", " error_code":18} '(length=66)
No existe una buena solución. Si desea usarlo de forma gratuita, mi solución es verificar si hay error_msg en el resultado devuelto y reenviar la solicitud si está presente. Si el resultado devuelto es normal, el resultado devuelto se almacena en la matriz de personas. En la parte que maneja la solicitud de reenvío, use la función para iterar hasta que no haya mensajes de error. Finalmente, todos los resultados correctos están en la matriz.
Resultados de la prueba de verbo (abreviatura de verbo)
Prueba:
A partir de los resultados, los elementos de datos de la prueba y los tiempos de respuesta correspondientes son aceptables.
/*
* 20 artículos = & gt1
*
*Artículo 40 = >3s
*
*Artículo 80 = >7 chelines
*
* 160 = >16 chelines
* */
Este artículo fue escrito anoche. Inesperadamente, la escuela perdió repentinamente la red y el suministro eléctrico. Los cortes de energía no son terribles. Lo importante es que cuando se acabe la batería, la red de telefonía móvil desaparecerá...desaparecerá...se perderá...