Google Cloud Natural Language via gRPC in Delphi

· Componenten

Google Cloud Natural Language leest ongestructureerde tekst en vertelt je wat erin zit. Het meet het algehele sentiment van een document, extraheert de personen, plaatsen en organisaties die het noemt als entiteiten, en classificeert de tekst in een content-taxonomie. De sgcWebSockets Enterprise-editie levert een getypeerde Natural Language gRPC-client bovenop TsgcGRPCClient, zodat je de language.googleapis.com-service rechtstreeks vanuit Delphi en C++Builder kunt bereiken zonder enige externe gRPC-runtime.

Hoe het werkt

De Natural Language-API wordt aangeboden als een gRPC-service, en gRPC bestaat uit Protocol Buffers-berichten ingekapseld over HTTP/2. sgcWebSockets levert al een complete HTTP/2-stack, dus de gRPC-client draait op een TsgcHTTP2Client-transport gericht op language.googleapis.com:443 over TLS. TsgcGRPCClient verzorgt de framing, het contenttype en de status-trailers; de getypeerde unit sgcGRPC_Google_Language verzorgt de request- en response-berichten.

Elke request omvat een document: de te analyseren tekst plus het type (plattetekst of HTML) en een optionele taalhint. De getypeerde klassen serialiseren dat document naar de exacte Protocol Buffers-wire-layout die de API verwacht, en parsen het antwoord terug naar kant-en-klare eigenschappen. Je stelt nooit met de hand een protobuf samen of jaagt op veldnummers.

Authenticatie gebruikt een Google Cloud-service-account. Een zelfondertekende service-account-JWT wordt ingewisseld voor een bearer-token, dat vervolgens als gRPC-metadata bij elke call wordt verzonden. Omdat dat token audience-gebonden is, wordt de JWT aangemaakt tegen het Natural Language-endpoint zodat het door language.googleapis.com wordt geaccepteerd.

De client opzetten

Maak een HTTP/2-transport voor de Natural Language-host, koppel er vervolgens een TsgcGRPCClient aan en selecteer het binaire protobuf-contenttype. Het bearer-token verkregen van het service-account wordt toegevoegd aan DefaultMetadata als een standaard authorization-header, zodat het bij elke request meereist.

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;

Sentiment analyseren

Sentimentanalyse rapporteert een emotionele score van -1.0 (negatief) tot +1.0 (positief) en een magnitude die weerspiegelt hoeveel emotionele inhoud het document draagt. Bouw een TsgcGRPCLanguageAnalyzeSentimentRequest, stel de documentinhoud in, roep de AnalyzeSentiment-methode aan op de LanguageService, en laad vervolgens de antwoordbytes in een getypeerde response.

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;

Entiteiten extraheren

Entiteitsanalyse retourneert de saillante dingen waar een document over praat. De response is een lijst met entiteiten, elk met een Name, een EntityType (persoon, locatie, organisatie enzovoort) en een Salience-score die rangschikt hoe centraal de entiteit is voor de tekst. De getypeerde response geeft je een geïndexeerde lijst om te doorlopen.

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;

Tekst classificeren

Contentclassificatie sorteert een document in Google's categorie-taxonomie en retourneert een lijst met categorieën elk met een Name zoals /Computers & Electronics/Software en een Confidence-waarde. Het patroon is hetzelfde: bouw een TsgcGRPCLanguageClassifyTextRequest, roep ClassifyText aan, en lees vervolgens de categorieën uit TsgcGRPCLanguageClassifyTextResponse met CategoryCount en Category(i). Classificatie heeft een redelijke hoeveelheid tekst nodig om goed te werken, dus voer er meer dan een enkele zin aan.

Beschikbaarheid

De Natural Language gRPC-client maakt deel uit van de sgcWebSockets Enterprise-editie en draait op Windows, macOS, Linux, iOS en Android, op Delphi en C++Builder. Een compleet, kant-en-klaar voorbeeld staat in Demos\21.GRPC\14.Natural_Language, en de onderliggende client is gedocumenteerd op de productpagina van de gRPC Client.

Vragen of feedback? Neem contact op. Je krijgt antwoord van de mensen die de code hebben geschreven.