Delphi'de gRPC Üzerinden Google Cloud Natural Language

· Bileşenler

Google Cloud Natural Language, yapılandırılmamış metni okur ve içinde ne olduğunu söyler. Bir belgenin genel duygu durumunu ölçer, bahsettiği kişileri, yerleri ve kuruluşları varlık olarak çıkarır ve metni bir içerik taksonomisine sınıflandırır. sgcWebSockets Enterprise sürümü, TsgcGRPCClient üzerine kurulu türlü bir Natural Language gRPC istemcisi içerir, böylece language.googleapis.com hizmetine doğrudan Delphi ve C++Builder'dan herhangi bir harici gRPC çalışma zamanı olmadan ulaşabilirsiniz.

Nasıl çalışır

Natural Language API'si bir gRPC hizmeti olarak sunulur ve gRPC, HTTP/2 üzerinde çerçevelenmiş Protocol Buffers mesajlarıdır. sgcWebSockets zaten eksiksiz bir HTTP/2 yığını içerir, bu nedenle gRPC istemcisi, TLS üzerinden language.googleapis.com:443 adresine yönlendirilmiş bir TsgcHTTP2Client taşımasına oturur. TsgcGRPCClient çerçevelemeyi, içerik türünü ve durum trailer'larını işler; türlü birim sgcGRPC_Google_Language ise istek ve yanıt mesajlarını işler.

Her istek bir belgeyi sarar: analiz edilecek metin ile birlikte türü (düz metin veya HTML) ve isteğe bağlı bir dil ipucu. Türlü sınıflar, bu belgeyi API'nin beklediği tam Protocol Buffers hat düzenine serileştirir ve yanıtı okunmaya hazır özelliklere geri ayrıştırır. Asla elle bir protobuf bir araya getirmez veya alan numaralarının peşine düşmezsiniz.

Kimlik doğrulama, bir Google Cloud hizmet hesabı kullanır. Kendinden imzalı bir hizmet hesabı JWT'si bir bearer belirteciyle takas edilir ve bu belirteç daha sonra her çağrıda gRPC meta verisi olarak gönderilir. Bu belirteç hedef kitleye bağlı olduğundan, JWT, language.googleapis.com tarafından kabul edilmesi için Natural Language uç noktasına karşı oluşturulur.

İstemcinin kurulması

Natural Language ana bilgisayarı için bir HTTP/2 taşıması oluşturun, ardından ona bir TsgcGRPCClient ekleyin ve ikili protobuf içerik türünü seçin. Hizmet hesabından elde edilen bearer belirteci, standart bir authorization üst bilgisi olarak DefaultMetadata'ya eklenir, böylece her istekte taşınır.

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;

Duygu durumunu analiz etme

Duygu durumu analizi, -1,0 (olumsuz) ile +1,0 (olumlu) arasında duygusal bir puan ve belgenin ne kadar duygusal içerik taşıdığını yansıtan bir büyüklük (magnitude) bildirir. Bir TsgcGRPCLanguageAnalyzeSentimentRequest oluşturun, belge içeriğini ayarlayın, LanguageService üzerindeki AnalyzeSentiment metodunu çağırın, ardından yanıt baytlarını türlü bir yanıta yükleyin.

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;

Varlıkları çıkarma

Varlık analizi, bir belgenin bahsettiği belirgin şeyleri döndürür. Yanıt, her biri bir Name, bir EntityType (kişi, konum, kuruluş vb.) ve varlığın metne ne kadar merkezi olduğunu sıralayan bir Salience puanına sahip bir varlık listesidir. Türlü yanıt, size üzerinde gezinmek için dizinlenmiş bir liste verir.

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;

Metni sınıflandırma

İçerik sınıflandırması, bir belgeyi Google'ın kategori taksonomisine ayırır ve her biri /Computers & Electronics/Software gibi bir Name ve bir Confidence değerine sahip bir kategori listesi döndürür. Desen aynıdır: bir TsgcGRPCLanguageClassifyTextRequest oluşturun, ClassifyText'i çağırın, ardından kategorileri TsgcGRPCLanguageClassifyTextResponse'tan CategoryCount ve Category(i) ile okuyun. Sınıflandırmanın iyi çalışması için makul miktarda metne ihtiyacı vardır, bu nedenle ona tek bir cümleden fazlasını verin.

Kullanılabilirlik

Natural Language gRPC istemcisi, sgcWebSockets Enterprise sürümünün bir parçasıdır ve Delphi ile C++Builder üzerinde Windows, macOS, Linux, iOS ve Android'de çalışır. Eksiksiz, çalıştırılmaya hazır bir örnek Demos\21.GRPC\14.Natural_Language içinde yer alır ve temeldeki istemci gRPC Client ürün sayfasında belgelenmiştir.

Sorularınız veya geri bildirimleriniz mi var? Bize ulaşın. Kodu yazan kişilerden bir yanıt alacaksınız.