DeepL API aanroepen vanuit SQL of Power BI

Met de DeepL API kunnen eenvoudig grote hoeveelheden tekst vertaald worden tussen voornamelijk Europese talen. Gebruik van de DeepL API is gratis tot 500.000 karakters per maand

In dit artikel wordt uitgelegd hoe via Invantive SQL en afgeleide platformen zoals Azure Data Factory en Power BI het gebruik van DeepL voor het automatisch vertalen mogelijk is. De gepresenteerde SQL statements werken met enige beperkingen ook met de gratis versies van SQL in het Invantive Query Tool.

De beschreven aanpak kan gebruikt worden om buiten de ruim 70 ondersteunde platformen relatief eenvoudige API’s aan te roepen als bron voor datareplicatie of verwerkingsprocessen.

Mogelijkheden DeepL

De DeepL API is een eenvoudige reeks van API’s om gegevens uit te wisselen met DeepL. Denk hierbij aan:

  • Vertalen
  • woordenlijsten maken en bijhouden
  • Saldo-informatie (voor betaalde abonnementen)

De API’s zijn allen gelijkend qua structuur en mogelijkheden.

Voorbereidingen DeepL API

Voor gebruik van de DeepL API is een API-sleutel nodig. Die is online te verkrijgen binnen enkele minuten. Een DeepL API-sleutel heeft het formaat van een zogenaamde “GUID” of “UUID”.

DeepL translate

De API “translate” biedt de mogelijkheid om een of meerdere teksten te vertalen naar een andere taal. De invoer wordt aangeboden via GET of (beter) als een arbitrair omvangrijke POST zoals:

auth_key=secret&source_lang=EN&target_lang=DE&text=how+to+write+a+text%3F

Voor de rest van deze tekst gaan we uit van het gebruik van POST omdat met GET al vrij snel de maximale lengte van hoogstens enkele duizenden tekens bereikt wordt.

Door het voorgaand bericht op te sturen samen met content-type application/x-www-form-urlencoded komt een resultaat terug zoals:

{"translations":[{"detected_source_language":"EN","text":"wie man einen Text schreibt?"}]}

Het resultaat bevat de Duitse vertaling. Voor andere doeltalen is een aparte API-aanroep nodig. Het veld text kan maximaal 50x herhaald worden zodat minder aanroepen nodig zijn.

SQL DeepL API Aanroep

Vanuit Invantive SQL kan de DeepL API aangeroepen worden met httpdownload@DataDictionary. Het content type wordt als header doorgegeven en de rest als payload als volgt via een POST; het resultaat wordt met jsontable omgezet naar een tabelvorm:

select jte.*
from   httpdownload@datadictionary
       ( url => 'https://api.deepl.com/v2/translate'
       , acceptMimeType => 'application/json'
       , contentType => 'application/x-www-form-urlencoded'
       , method => 'POST'
       , textPayload 
         => 
         'auth_key=secret'
         || '&source_lang=EN'
         || '&target_lang=DE'
         || '&split_sentences=0'
         || '&tag_handling=0'
         || '&preserve_formatting=0'
         || '&formality=default'
         --|| '&glossary_id=...'
         || '&text=' || urlencode('how to write a text using the =-sign?')
       ) htp
join   jsontable
       ( 'translations[*]'
         passing htp.contents_char
         columns detected_source_language varchar2 null path 'detected_source_language'
         ,       text                     varchar2 null path 'text'
       ) jte

Het resultaat ziet er dan ongeveer zo uit:

In- en uitvoer met Tabellen

Soms is het wenselijk om een lijst van te vertalen teksten te verwerken en die weg te schrijven naar een tabel. Dergelijke output kan ook verwerkt worden door bijvoorbeeld Power Query of bijvoorbeeld door in Invantive Control for Excel een Excel tabel (TABELNAAM@InvantiveControl) uit te lezen en de gevalideerde resultaten in een blok weer te retourneren in Excel.

Een voorbeeld hiervan is de volgende query die een lijst van teksten maakt, vertaalt en wegschrijft in naar een in-memory tabel output:

create or replace table input@inmemorystorage
as
select 'EN' source_lang
,      'This is text number ' || to_char(rge.value) source_text
from   range(100)@datadictionary rge

create or replace table output@inmemorystorage
as
select inp.source_text
,      jte.*
from   input@inmemorystorage inp
join   httpdownload@datadictionary
       ( url => 'https://api.deepl.com/v2/translate'
       , acceptMimeType => 'application/json'
       , contentType => 'application/x-www-form-urlencoded'
       , method => 'POST'
       , textPayload 
         => 
         'auth_key=secret'
         || '&source_lang=' || inp.source_lang
         || '&target_lang=DE'
         || '&split_sentences=0'
         || '&tag_handling=0'
         || '&preserve_formatting=0'
         || '&formality=default'
         --|| '&glossary_id=...'
         || '&text=' || urlencode(inp.source_text)
       ) htp
join   jsontable
       ( 'translations[*]'
         passing htp.contents_char
         columns detected_source_language varchar2 null path 'detected_source_language'
         ,       text                     varchar2 null path 'text'
       ) jte

select *
from   output@inmemorystorage

Het verwerken duurt circa 250 ms per vertaling. Het resultaat ziet er als volgt uit:

image

De snelheid kan verhoogd worden door meerdere teksten in 1x op te sturen, bijvoorbeeld door de row_number functie te gebruiken in Invantive SQL. De prestaties nemen echter niet enorm toe. Het vertalen van 50 teksten in 1x duurt circa 6 seconden, waardoor de snelheidswinst een factor 2 is ten op zichte van vertalen per regel.