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:
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.