Google Cloud Natural Language sobre gRPC en Delphi

· Componentes

Google Cloud Natural Language lee texto no estructurado y te dice qué hay en él. Mide el sentimiento general de un documento, extrae las personas, lugares y organizaciones que menciona como entidades, y clasifica el texto en una taxonomía de contenido. La edición Enterprise de sgcWebSockets incluye un cliente gRPC de Natural Language tipado sobre TsgcGRPCClient, así que puedes alcanzar el servicio language.googleapis.com directamente desde Delphi y C++Builder sin ningún runtime gRPC externo.

Cómo funciona

La API de Natural Language se expone como un servicio gRPC, y gRPC son mensajes de Protocol Buffers enmarcados sobre HTTP/2. sgcWebSockets ya incluye una pila HTTP/2 completa, así que el cliente gRPC se apoya en un transporte TsgcHTTP2Client apuntando a language.googleapis.com:443 sobre TLS. TsgcGRPCClient gestiona el enmarcado, el content type y los trailers de estado; la unidad tipada sgcGRPC_Google_Language gestiona los mensajes de petición y respuesta.

Cada petición envuelve un documento: el texto a analizar más su tipo (texto plano o HTML) y una pista de idioma opcional. Las clases tipadas serializan ese documento al formato de cable exacto de Protocol Buffers que la API espera, y analizan la respuesta de vuelta en propiedades listas para leer. Nunca ensamblas un protobuf a mano ni persigues números de campo.

La autenticación usa una cuenta de servicio de Google Cloud. Un JWT de cuenta de servicio autofirmado se intercambia por un bearer token, que luego se envía como metadata gRPC en cada llamada. Como ese token está vinculado a la audiencia, el JWT se emite contra el endpoint de Natural Language para que sea aceptado por language.googleapis.com.

Configurar el cliente

Crea un transporte HTTP/2 para el host de Natural Language, luego adjunta un TsgcGRPCClient a él y selecciona el content type binario de protobuf. El bearer token obtenido de la cuenta de servicio se añade a DefaultMetadata como una cabecera authorization estándar, para que viaje en cada petición.

uses
  sgcHTTP2_Client, sgcGRPC_Client, sgcGRPC_Types, sgcGRPC_Google_Language;

var
  HTTP2: TsgcHTTP2Client;
  GRPC: TsgcGRPCClient;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.Host := 'language.googleapis.com';
  HTTP2.Port := 443;
  HTTP2.TLS  := True;

  GRPC := TsgcGRPCClient.Create(nil);
  GRPC.Client := HTTP2;
  GRPC.ChannelOptions.ContentType := grpcProto;
  GRPC.ChannelOptions.Compression := grpcNoCompression;

  // bearer token from the service-account JWT exchange
  GRPC.DefaultMetadata.Add('authorization', 'Bearer ' + Token);

  HTTP2.Active := True;
end;

Analizar el sentimiento

El análisis de sentimiento informa de una puntuación emocional de -1.0 (negativo) a +1.0 (positivo) y una magnitud que refleja cuánto contenido emocional lleva el documento. Construye un TsgcGRPCLanguageAnalyzeSentimentRequest, establece el contenido del documento, llama al método AnalyzeSentiment en el LanguageService, luego carga los bytes de la respuesta en una respuesta tipada.

var
  oRequest: TsgcGRPCLanguageAnalyzeSentimentRequest;
  oResponse: TsgcGRPCResponse;
  oResult: TsgcGRPCLanguageAnalyzeSentimentResponse;
begin
  oRequest := TsgcGRPCLanguageAnalyzeSentimentRequest.Create;
  try
    oRequest.Document.DocType := 1; // PLAIN_TEXT
    oRequest.Document.Content := 'sgcWebSockets makes gRPC in Delphi easy.';

    oResponse := GRPC.Call('google.cloud.language.v1.LanguageService',
      'AnalyzeSentiment', oRequest.ToBytes);

    if oResponse.StatusCode = grpcOK then
    begin
      oResult := TsgcGRPCLanguageAnalyzeSentimentResponse.Create;
      try
        oResult.LoadFromBytes(oResponse.Data);
        ShowMessage('Score: ' + FloatToStr(oResult.DocumentSentiment.Score) +
          '  Magnitude: ' + FloatToStr(oResult.DocumentSentiment.Magnitude));
      finally
        oResult.Free;
      end;
    end;
  finally
    oRequest.Free;
  end;
end;

Extraer entidades

El análisis de entidades devuelve las cosas relevantes de las que habla un documento. La respuesta es una lista de entidades, cada una con un Name, un EntityType (persona, ubicación, organización, etc.) y una puntuación de Salience que clasifica cuán central es la entidad para el texto. La respuesta tipada te da una lista indexada para recorrer.

var
  oRequest: TsgcGRPCLanguageAnalyzeEntitiesRequest;
  oResponse: TsgcGRPCResponse;
  oResult: TsgcGRPCLanguageAnalyzeEntitiesResponse;
  i: Integer;
begin
  oRequest := TsgcGRPCLanguageAnalyzeEntitiesRequest.Create;
  try
    oRequest.Document.DocType := 1; // PLAIN_TEXT
    oRequest.Document.Content := Memo1.Text;

    oResponse := GRPC.Call('google.cloud.language.v1.LanguageService',
      'AnalyzeEntities', oRequest.ToBytes);

    oResult := TsgcGRPCLanguageAnalyzeEntitiesResponse.Create;
    try
      oResult.LoadFromBytes(oResponse.Data);
      for i := 0 to oResult.EntityCount - 1 do
        Memo2.Lines.Add(oResult.Entity(i).Name + ' (type ' +
          IntToStr(oResult.Entity(i).EntityType) + ', salience ' +
          FloatToStr(oResult.Entity(i).Salience) + ')');
    finally
      oResult.Free;
    end;
  finally
    oRequest.Free;
  end;
end;

Clasificar texto

La clasificación de contenido ordena un documento en la taxonomía de categorías de Google, devolviendo una lista de categorías cada una con un Name como /Computers & Electronics/Software y un valor de Confidence. El patrón es el mismo: construye un TsgcGRPCLanguageClassifyTextRequest, llama a ClassifyText, luego lee las categorías de TsgcGRPCLanguageClassifyTextResponse con CategoryCount y Category(i). La clasificación necesita una cantidad razonable de texto para funcionar bien, así que aliméntala con más de una sola frase.

Disponibilidad

El cliente gRPC de Natural Language forma parte de la edición Enterprise de sgcWebSockets y se ejecuta en Windows, macOS, Linux, iOS y Android, en Delphi y C++Builder. Un ejemplo completo y listo para ejecutar está en Demos\21.GRPC\14.Natural_Language, y el cliente subyacente está documentado en la página de producto del Cliente gRPC.

¿Preguntas o comentarios? Ponte en contacto. Recibirás respuesta de las personas que escribieron el código.