{"id":28683,"date":"2019-04-30T00:00:00","date_gmt":"2019-04-29T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=28683"},"modified":"2021-01-13T09:40:37","modified_gmt":"2021-01-13T08:40:37","slug":"lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/","title":{"rendered":"Lost in Translations: traduzione e Sentiment Analysis in tempo reale"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"28684\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/attachment\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"13a5ce76-34c7-4bd2-93fd-374d7a0569b7\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-28684\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"introduzione\">Introduzione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Proseguiamo il nostro viaggio nel mondo dei&nbsp;<strong>cognitive services<\/strong>&nbsp;(<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Riconoscimento-delle-immagini-nel-Cloud-24\" target=\"_blank\" rel=\"noreferrer noopener\">vedi articolo precedente<\/a>), partendo stavolta da un progetto&nbsp;<strong>Angular<\/strong>. Utilizzeremo le&nbsp;<strong>Google Translate API<\/strong>&nbsp;per tradurre in tempo reale il testo inserito in una textarea sfruttando i Reactive Form in Angular e, contemporaneamente, sottoporremo lo stesso testo a una&nbsp;<strong>Sentiment Analysis<\/strong>&nbsp;grazie alle&nbsp;<strong>Text Analytics API<\/strong>&nbsp;di&nbsp;<strong>Azure<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per utilizzare i servizi di traduzione di Google, occorre creare un progetto nella GCP Console in cui abilitare la Cloud Translation API. Dal pannello di configurazione del progetto sar\u00e0 quindi possibile estrarre la chiave da inserire nelle chiamate http. La documentazione delle chiamate REST possibili \u00e8 disponibile al seguente\u00a0<a rel=\"noreferrer noopener\" href=\"https:\/\/cloud.google.com\/translate\/docs\/reference\/rest\/v2\/translate\" target=\"_blank\">link<\/a>. A partire da essa, abbiamo creato due interfacce Typescript per gestire la request e la response<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport interface GoogleTranslateRequest {\n\u00a0\u00a0q: string;\n\u00a0\u00a0source: string;\n\u00a0\u00a0target: string;\n\u00a0\u00a0format: string;\n}\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport interface Translation {\n\u00a0\u00a0translatedText: string;\n}\n\u00a0\nexport interface Data {\n\u00a0\u00a0translations: Translation&#x5B;];\n}\n\u00a0\nexport interface GoogleTranslateResponse {\n\u00a0\u00a0data: Data;\n\u00a0\u00a0language: string;\n}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo quindi creato un servizio per eseguire la chiamata REST mediante l&#8217;HttpClientModule di Angular. Da notare come sia stato importato l&#8217;environment per andare a recupare la URL del servizio e la chiave dal file environment.ts. La classe ha un metodo\u00a0<em>translate<\/em>\u00a0che restituisce un Observable&lt;GoogleTranslateResponse><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@Injectable({\n\u00a0\u00a0providedIn: &#039;root&#039;\n})\nexport class GoogleService {\n\u00a0\n\u00a0\u00a0url = environment.googleTranslateUrl + environment.googleApiKey;\n\u00a0\n\u00a0\u00a0constructor(private http: HttpClient) {}\n\u00a0\n\u00a0\u00a0translate(obj: GoogleTranslateRequest): Observable&lt;GoogleTranslateResponse&gt; {\n\u00a0\u00a0\u00a0\u00a0return this.http.post&lt;GoogleTranslateResponse&gt;(this.url, obj);\n\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"il-servizio-di-sentiment-analysis-di-azure-text-analytics\">Il servizio di sentiment analysis di Azure Text Analytics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dal portale di Azure \u00e8 possibile aggiungere una nuova risorsa di tipo&nbsp;<strong>Intelligenza artificiale e Machine Learning, Analisi del testo<\/strong>. Ad essa saranno associati una URL e una chiave per la chiamata REST.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anche in questo caso creiamo un&#8217;interfaccia per la request e una per la response.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport interface AzureSentimentRequest {\n\u00a0\u00a0documents: AzureSentimentDocument&#x5B;];\n}\n\u00a0\nexport interface AzureSentimentDocument {\n\u00a0\u00a0language: string;\n\u00a0\u00a0id: number;\n\u00a0\u00a0text: string;\n}\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport interface Document {\n\u00a0\u00a0id: string;\n\u00a0\u00a0score: number;\n}\n\u00a0\nexport interface AzureSentimentResponse {\n\u00a0\u00a0documents: Document&#x5B;];\n\u00a0\u00a0errors: any&#x5B;];\n}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo poi creato un servizio chiamato AzureService che mette a disposizione un metodo chiamato analyze a cui passare la lingue e il testo da analizzare che restituisce un Observable&lt;AzureSentimentResponse>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n@Injectable({\n\u00a0\u00a0providedIn: &#039;root&#039;\n})\nexport class AzureService {\n\u00a0\n\u00a0\u00a0httpOptions = {\n\u00a0\u00a0\u00a0\u00a0headers: new HttpHeaders({ &#039;Ocp-Apim-Subscription-Key&#039;: environment.azureTextAnalyticsKey,\n\u00a0\u00a0\u00a0\u00a0&#039;Content-Type&#039;: &#039;application\/json&#039;,\n\u00a0\u00a0\u00a0\u00a0Accept: &#039;application\/json&#039;\n\u00a0\u00a0})};\n\u00a0\n\u00a0\u00a0constructor(private http: HttpClient) {}\n\u00a0\n\u00a0\u00a0analize(lang: string, textInput: string): Observable&lt;AzureSentimentResponse&gt; {\n\u00a0\n\u00a0\u00a0\u00a0\u00a0const body: AzureSentimentRequest = {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0documents : &#x5B;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{id: 1,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0language: lang,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text: textInput\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}]\n\u00a0\u00a0\u00a0\u00a0};\n\u00a0\u00a0\u00a0\u00a0return this.http.post&lt;AzureSentimentResponse&gt;(environment.azureTextAnalyticsUrl, body, this.httpOptions);\n\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"il-componente\">Il componente<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nell&#8217;app.module.ts abbiamo importato il ReactiveFormsModule per potere avere a disposizione mediante un&#8217;observable\u00a0il testo da analizzare proveniente da una textarea.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;form-group&quot;&gt;\n\u00a0\u00a0&lt;label for=&quot;testoOriginale&quot;&gt;Testo da Tradurre&lt;\/label&gt;\n\u00a0\u00a0&lt;textarea class=&quot;form-control&quot; id=&quot;testoOriginale&quot; rows=&quot;3&quot; &#x5B;formControl]=&#039;testoOriginale&#039;&gt;&lt;\/textarea&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Nel codice typescript del component possiamo dichiarare<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ntestoIstantaneo: Observable&lt;string&gt; = null;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">e poi associare a testoIstantaneo il valueChanges del formControl testoOriginale<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nthis.testoIstantaneo = this.testoOriginale.valueChanges;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Prima di creare il subscribe del nostro Observable, abbiamo inserito un tempo di attesa di un secondo dalla fine dell&#8217;inserimento del testo, in maniera tale da non eseguire le chiamate ai servizi ad ogni nuovo carattere inserito nella textarea. Ci\u00f2 \u00e8 possibile mediante l&#8217;operatore\u00a0<strong>debounce()<\/strong>\u00a0passato in una\u00a0<strong>pipe<\/strong>\u00a0all&#8217;Observable.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nthis.testoIstantaneo.pipe( debounceTime(1000) ).subscribe(testo =&gt; {\n\u00a0\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A questo punto nel subscribe siamo pronti ad eseguire le chiamate ai servizi REST. Abbiamo richiesto quattro traduzioni (dall&#8217;italiano all&#8217;inglese, giapponese, arabo, e finlandese) configurando i seguenti oggetti<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nprivate impostaTraduzione() {\n\u00a0\u00a0\u00a0\u00a0this.impostazioniTraduzione = &#x5B;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ q: &#039;&#039;, source: &#039;it&#039;, target: &#039;en&#039;, format: &#039;text&#039; },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ q: &#039;&#039;, source: &#039;it&#039;, target: &#039;ja&#039;, format: &#039;text&#039; },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ q: &#039;&#039;, source: &#039;it&#039;, target: &#039;ar&#039;, format: &#039;text&#039; },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ q: &#039;&#039;, source: &#039;it&#039;, target: &#039;fi&#039;, format: &#039;text&#039; }\n\u00a0\u00a0\u00a0\u00a0];\n\u00a0\u00a0}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ecco le chiamate<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nthis.testoIstantaneo.pipe( debounceTime(1000) ).subscribe(testo =&gt; {\n\u00a0\u00a0\u00a0\u00a0\u00a0this.azureSentiment.analize(&#039;it&#039;, testo).subscribe((sentiments: AzureSentimentResponse) =&gt; {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.sentiments = sentiments;\n\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0\u00a0this.traduzioni = &#x5B;];\n\u00a0\u00a0\u00a0\u00a0\u00a0this.impostazioniTraduzione.forEach(impostazione =&gt; {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0impostazione.q = testo;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.googleTanslatorService.translate(impostazione).subscribe((response: GoogleTranslateResponse) =&gt; {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0response.language = impostazione.target;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.traduzioni.push(response);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0});\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La sottoscrizione rende disponibile al template html un array di traduzioni e un array contenente i risultati della sentiment analysis.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;form-group&quot;&gt;\n\u00a0\u00a0&lt;label for=&quot;testoOriginale&quot;&gt;Testo da Tradurre&lt;\/label&gt;\n\u00a0\u00a0&lt;textarea class=&quot;form-control&quot; id=&quot;testoOriginale&quot; rows=&quot;3&quot; &#x5B;formControl]=&#039;testoOriginale&#039;&gt;&lt;\/textarea&gt;\n&lt;\/div&gt;\n\u00a0\n&lt;div *ngIf=&quot;sentiments &amp;&amp; sentiments.documents&quot;&gt;\n\u00a0\u00a0&lt;div *ngFor=&quot;let sentiment of sentiments.documents&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=&quot;progress&quot; style=&quot;margin-bottom: 10px&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=&quot;progress-bar progress-bar-striped progress-bar-animated&quot;\u00a0 &#x5B;ngClass]=&quot;{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#039;bg-success&#039;:sentiment.score &gt;= 0.50,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#039;bg-danger&#039;: sentiment.score &lt; 0.50}&quot;\u00a0 role=&quot;progressbar&quot; &#x5B;attr.aria-valuenow]=&quot;sentiment.score*100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#x5B;style.width.%]=&quot;sentiment.score*100&quot;&gt;&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0&lt;\/div&gt;\n&lt;\/div&gt;\n\u00a0\n&lt;div *ngFor=&quot;let traduzione of traduzioni&quot;&gt;\n\u00a0\u00a0&lt;app-translation &#x5B;traduzione]=&#039;traduzione&#039;&gt;&lt;\/app-translation&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il component app-translation \u00e8 una card bootstrap che mostra il risultato della traduzione.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;card text-white bg-primary mb-3&quot;&gt;\n\u00a0\u00a0&lt;div class=&quot;card-header&quot;&gt;{{traduzione.language}}&lt;\/div&gt;\n\u00a0\u00a0&lt;div class=&quot;card-body&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;p *ngIf=&quot;traduzione &amp;&amp; traduzione.data &amp;&amp; traduzione.data.translations &amp;&amp; traduzione.data.translations.length &gt;0&quot;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=&quot;card-text&quot;&gt;{{traduzione.data.translations&#x5B;0].translatedText}}&lt;\/p&gt;\n\u00a0\u00a0&lt;\/div&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La progress bar \u00e8 colorata in verde se il risultato dell&#8217;analisi del testo \u00e8 maggiore o uguale a 0,50 (ossia se esprime uno stato d&#8217;animo positivo) mentre diventa rossa per valori inferiori.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"621\" data-attachment-id=\"28691\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/attachment\/pictures01\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures01.png?fit=1183%2C718&amp;ssl=1\" data-orig-size=\"1183,718\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"pictures01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures01.png?fit=1024%2C621&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures01.png?resize=1024%2C621&#038;ssl=1\" alt=\"\" class=\"wp-image-28691\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures01-1024x621.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures01-980x595.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures01-480x291.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"609\" data-attachment-id=\"28693\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/attachment\/pictures02\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures02.png?fit=1191%2C708&amp;ssl=1\" data-orig-size=\"1191,708\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"pictures02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures02.png?fit=1024%2C609&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures02.png?resize=1024%2C609&#038;ssl=1\" alt=\"\" class=\"wp-image-28693\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures02-1024x609.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures02-980x583.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/pictures02-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Trovate tutto il codice qui:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/sorrentmutie\/lost-translations\">https:\/\/github.com\/sorrentmutie\/lost-translations<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla prossima!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Utilizzare i servizi in Cloud di Azure e Google per la traduzione e la Sentiment Analysis da un client Angular<\/p>\n","protected":false},"author":196716245,"featured_media":28684,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637387,688637377],"class_list":["post-28683","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-angular","tag-azure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Lost in Translations: traduzione e Sentiment Analysis in tempo reale - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lost in Translations: traduzione e Sentiment Analysis in tempo reale - Blexin\" \/>\n<meta property=\"og:description\" content=\"Utilizzare i servizi in Cloud di Azure e Google per la traduzione e la Sentiment Analysis da un client Angular\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-29T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salvatore Sorrentino\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salvatore Sorrentino\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/\"},\"author\":{\"name\":\"Salvatore Sorrentino\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\"},\"headline\":\"Lost in Translations: traduzione e Sentiment Analysis in tempo reale\",\"datePublished\":\"2019-04-29T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/\"},\"wordCount\":484,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Angular\",\"Azure\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/\",\"name\":\"Lost in Translations: traduzione e Sentiment Analysis in tempo reale - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2019-04-29T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:37+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lost in Translations: traduzione e Sentiment Analysis in tempo reale\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/354db2bc97cac71c2ceeca21a92d5bed\",\"name\":\"Salvatore Sorrentino\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g\",\"caption\":\"Salvatore Sorrentino\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/salvatore-sorrentinoblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Lost in Translations: traduzione e Sentiment Analysis in tempo reale - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/","og_locale":"it_IT","og_type":"article","og_title":"Lost in Translations: traduzione e Sentiment Analysis in tempo reale - Blexin","og_description":"Utilizzare i servizi in Cloud di Azure e Google per la traduzione e la Sentiment Analysis da un client Angular","og_url":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/","og_site_name":"Blexin","article_published_time":"2019-04-29T22:00:00+00:00","article_modified_time":"2021-01-13T08:40:37+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Salvatore Sorrentino","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Salvatore Sorrentino","Tempo di lettura stimato":"4 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/"},"author":{"name":"Salvatore Sorrentino","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"headline":"Lost in Translations: traduzione e Sentiment Analysis in tempo reale","datePublished":"2019-04-29T22:00:00+00:00","dateModified":"2021-01-13T08:40:37+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/"},"wordCount":484,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1","keywords":["Angular","Azure"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/","url":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/","name":"Lost in Translations: traduzione e Sentiment Analysis in tempo reale - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1","datePublished":"2019-04-29T22:00:00+00:00","dateModified":"2021-01-13T08:40:37+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/lost-in-translations-traduzione-e-sentiment-analysis-in-tempo-reale\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Lost in Translations: traduzione e Sentiment Analysis in tempo reale"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/354db2bc97cac71c2ceeca21a92d5bed","name":"Salvatore Sorrentino","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a6ec0dc827d2acaa55df9dbf1007e23f6fcb8c9436df52ab48274bb2221085bf?s=96&d=identicon&r=g","caption":"Salvatore Sorrentino"},"url":"https:\/\/blexin.com\/it\/author\/salvatore-sorrentinoblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/13a5ce76-34c7-4bd2-93fd-374d7a0569b7.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-7sD","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716245"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=28683"}],"version-history":[{"count":7,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28683\/revisions"}],"predecessor-version":[{"id":28697,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/28683\/revisions\/28697"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/28684"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=28683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=28683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=28683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}