Google Cloud Natural Language przez gRPC w Delphi

· Komponenty

Google Cloud Natural Language odczytuje nieustrukturyzowany tekst i informuje Cię, co się w nim znajduje. Mierzy ogólny sentyment dokumentu, wyodrębnia wspominane w nim osoby, miejsca i organizacje jako encje oraz klasyfikuje tekst do taksonomii treści. Edycja Enterprise sgcWebSockets dostarcza typowanego klienta gRPC Natural Language zbudowanego na TsgcGRPCClient, więc możesz dotrzeć do usługi language.googleapis.com bezpośrednio z Delphi i C++Builder bez żadnego zewnętrznego środowiska uruchomieniowego gRPC.

Jak to działa

API Natural Language jest udostępnione jako usługa gRPC, a gRPC to komunikaty Protocol Buffers opakowane w HTTP/2. sgcWebSockets dostarcza już kompletny stos HTTP/2, więc klient gRPC działa na transporcie TsgcHTTP2Client wskazującym na language.googleapis.com:443 przez TLS. TsgcGRPCClient obsługuje opakowywanie, typ zawartości i trailery statusu; typowany moduł sgcGRPC_Google_Language obsługuje komunikaty żądań i odpowiedzi.

Każde żądanie opakowuje dokument: tekst do analizy plus jego typ (zwykły tekst lub HTML) oraz opcjonalną podpowiedź dotyczącą języka. Typowane klasy serializują ten dokument do dokładnego układu Protocol Buffers, którego oczekuje API, i parsują odpowiedź z powrotem do gotowych do odczytu właściwości. Nigdy nie składasz ręcznie protobufa ani nie szukasz numerów pól.

Uwierzytelnianie korzysta z konta usługi Google Cloud. Samodzielnie podpisany JWT konta usługi jest wymieniany na token bearer, który jest następnie wysyłany jako metadane gRPC przy każdym wywołaniu. Ponieważ ten token jest powiązany z odbiorcą, JWT jest tworzony dla punktu końcowego Natural Language, aby został zaakceptowany przez language.googleapis.com.

Konfigurowanie klienta

Utwórz transport HTTP/2 dla hosta Natural Language, a następnie dołącz do niego TsgcGRPCClient i wybierz binarny typ zawartości protobuf. Token bearer uzyskany z konta usługi jest dodawany do DefaultMetadata jako standardowy nagłówek authorization, aby towarzyszył każdemu żądaniu.

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;

Analiza sentymentu

Analiza sentymentu raportuje emocjonalny wynik od -1.0 (negatywny) do +1.0 (pozytywny) oraz wielkość, która odzwierciedla, ile treści emocjonalnej niesie dokument. Zbuduj TsgcGRPCLanguageAnalyzeSentimentRequest, ustaw zawartość dokumentu, wywołaj metodę AnalyzeSentiment na LanguageService, a następnie wczytaj bajty odpowiedzi do typowanej odpowiedzi.

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;

Wyodrębnianie encji

Analiza encji zwraca istotne rzeczy, o których mówi dokument. Odpowiedź to lista encji, każda z Name, EntityType (osoba, lokalizacja, organizacja itd.) oraz oceną Salience, która klasyfikuje, jak centralna jest dana encja dla tekstu. Typowana odpowiedź daje Ci indeksowaną listę do przejścia.

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;

Klasyfikacja tekstu

Klasyfikacja treści sortuje dokument do taksonomii kategorii Google, zwracając listę kategorii, każda z Name takim jak /Computers & Electronics/Software oraz wartością Confidence. Wzorzec jest taki sam: zbuduj TsgcGRPCLanguageClassifyTextRequest, wywołaj ClassifyText, a następnie odczytaj kategorie z TsgcGRPCLanguageClassifyTextResponse za pomocą CategoryCount i Category(i). Klasyfikacja potrzebuje rozsądnej ilości tekstu, aby działać dobrze, więc podaj jej więcej niż jedno zdanie.

Dostępność

Klient gRPC Natural Language jest częścią edycji Enterprise sgcWebSockets i działa na Windows, macOS, Linux, iOS oraz Android, w Delphi i C++Builder. Kompletny, gotowy do uruchomienia przykład znajduje się w Demos\21.GRPC\14.Natural_Language, a bazowy klient jest udokumentowany na stronie produktu gRPC Client.

Pytania lub uwagi? Skontaktuj się z nami. Otrzymasz odpowiedź od osób, które napisały ten kod.