Google Cloud Natural Language über gRPC in Delphi

· Komponenten

Google Cloud Natural Language liest unstrukturierten Text und sagt Ihnen, was darin steckt. Es misst die Gesamtstimmung eines Dokuments, extrahiert die erwähnten Personen, Orte und Organisationen als Entitäten und klassifiziert den Text in eine Inhalts-Taxonomie. Die sgcWebSockets Enterprise Edition liefert einen typisierten Natural-Language-gRPC-Client auf Basis von TsgcGRPCClient, sodass Sie den Dienst language.googleapis.com direkt aus Delphi und C++Builder erreichen können, ohne externe gRPC-Laufzeitumgebung.

Wie es funktioniert

Die Natural-Language-API wird als gRPC-Dienst bereitgestellt, und gRPC sind Protocol-Buffers-Nachrichten, die über HTTP/2 gerahmt werden. sgcWebSockets liefert bereits einen vollständigen HTTP/2-Stack, sodass der gRPC-Client auf einem TsgcHTTP2Client-Transport sitzt, der auf language.googleapis.com:443 über TLS verweist. TsgcGRPCClient übernimmt das Framing, den Content-Type und die Status-Trailer; die typisierte Unit sgcGRPC_Google_Language übernimmt die Request- und Response-Nachrichten.

Jeder Request umschließt ein Dokument: den zu analysierenden Text plus dessen Typ (Klartext oder HTML) und einen optionalen Sprachhinweis. Die typisierten Klassen serialisieren dieses Dokument in genau das Protocol-Buffers-Wire-Layout, das die API erwartet, und parsen die Antwort zurück in lesebereite Eigenschaften. Sie stellen niemals ein Protobuf von Hand zusammen oder jagen Feldnummern hinterher.

Die Authentifizierung verwendet ein Google-Cloud-Dienstkonto. Ein selbstsigniertes Dienstkonto-JWT wird gegen ein Bearer-Token ausgetauscht, das dann bei jedem Aufruf als gRPC-Metadaten gesendet wird. Da dieses Token audience-gebunden ist, wird das JWT gegen den Natural-Language-Endpunkt ausgestellt, damit es von language.googleapis.com akzeptiert wird.

Den Client einrichten

Erstellen Sie einen HTTP/2-Transport für den Natural-Language-Host, hängen Sie dann einen TsgcGRPCClient daran an und wählen Sie den binären Protobuf-Content-Type. Das aus dem Dienstkonto bezogene Bearer-Token wird den DefaultMetadata als standardmäßiger authorization-Header hinzugefügt, sodass es bei jedem Request mitgesendet wird.

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;

Stimmung analysieren

Die Stimmungsanalyse meldet einen emotionalen Score von -1.0 (negativ) bis +1.0 (positiv) und eine Magnitude, die widerspiegelt, wie viel emotionalen Gehalt das Dokument trägt. Erstellen Sie einen TsgcGRPCLanguageAnalyzeSentimentRequest, setzen Sie den Dokumentinhalt, rufen Sie die Methode AnalyzeSentiment des LanguageService auf und laden Sie dann die Antwort-Bytes in eine typisierte 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;

Entitäten extrahieren

Die Entitätsanalyse gibt die wesentlichen Dinge zurück, über die ein Dokument spricht. Die Response ist eine Liste von Entitäten, jede mit einem Name, einem EntityType (Person, Ort, Organisation und so weiter) und einem Salience-Wert, der einstuft, wie zentral die Entität für den Text ist. Die typisierte Response gibt Ihnen eine indizierte Liste zum Durchlaufen.

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;

Text klassifizieren

Die Inhaltsklassifizierung sortiert ein Dokument in Googles Kategorie-Taxonomie ein und gibt eine Liste von Kategorien zurück, jede mit einem Name wie /Computers & Electronics/Software und einem Confidence-Wert. Das Muster ist dasselbe: Erstellen Sie einen TsgcGRPCLanguageClassifyTextRequest, rufen Sie ClassifyText auf und lesen Sie dann die Kategorien aus TsgcGRPCLanguageClassifyTextResponse mit CategoryCount und Category(i). Die Klassifizierung benötigt eine angemessene Textmenge, um gut zu funktionieren, geben Sie ihr also mehr als einen einzelnen Satz.

Verfügbarkeit

Der Natural-Language-gRPC-Client ist Teil der sgcWebSockets Enterprise Edition und läuft unter Windows, macOS, Linux, iOS und Android, in Delphi und C++Builder. Ein vollständiges, sofort lauffähiges Beispiel befindet sich in Demos\21.GRPC\14.Natural_Language, und der zugrunde liegende Client ist auf der gRPC-Client-Produktseite dokumentiert.

Fragen oder Feedback? Nehmen Sie Kontakt auf. Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.