2010-03-15 21 views
9

Tengo una gran cantidad de datos de texto y quiero traducirlo a diferentes idiomas.¿Cuál es la mejor manera de traducir una gran cantidad de datos de texto?

maneras posibles sé:

  • API de Google Translate
  • Bing Traducir API

El problema es que todos estos servicios tienen limitaciones en la longitud del texto, etc. número de llamadas que hace ellos inconveniente en uso.

¿Qué servicios/formas podría aconsejar utilizar en este caso?

+1

No programación relacionada. Votando para pasar a Super Usuario. –

+8

@David_Thornley Él está pidiendo una API para traducir de forma programática textos grandes ... ¿cómo no está relacionada la programación? – Marcelo

+3

esto definitivamente está relacionado con la programación –

Respuesta

4

Tuve que resolver el mismo problema al integrar la traducción de idiomas con un servidor de chat xmpp. Particione mi carga útil (el texto que necesitaba para traducir) en subconjuntos más pequeños de oraciones completas. No puedo recordar el número exacto, pero con la URL de traducción basada en el reposo de Google, traduje un conjunto de oraciones completas que colectivamente tenían un total de menos de (1024 caracteres), por lo que un párrafo grande daría lugar a múltiples llamadas al servicio de traducción.

+0

sí ... es cierto ... pero ¿cuál es el caso cuando tenemos datos formateados en html ... la división del contenido no lo considerará como html adicional si lo dividimos en> o

3

Divida su texto grande en cadenas tokenizadas y pase cada ficha a través del traductor a través de un bucle. Almacene la salida traducida en una matriz y una vez que todos los tokens se traducen y almacenan en la matriz, vuélvalos a juntar y tendrá un documento completamente traducido.

EDIT: 4/25/2010

Sólo para demostrar un punto Tiré esto juntos :) es peligrosa por los bordes, pero va a manejar una gran cantidad enteras de texto y lo hace tan bueno como Google para la precisión de la traducción porque utiliza la API de Google. Procesé toda la presentación de SEC 10-K de 2005 con este código y el clic de un botón (tomó aproximadamente 45 minutos). El resultado fue básicamente idéntico al que obtendría si copiara y pegara una frase por vez en Google Translator. No es perfecto (la puntuación final no es precisa y no escribí en el archivo de texto línea por línea), pero muestra una prueba de concepto. Podría tener una mejor puntuación si trabajó con Regex un poco más.

Imports System.IO 
Imports System.Text.RegularExpressions 

Public Class Form1 

    Dim file As New String("Translate Me.txt") 
    Dim lineCount As Integer = countLines() 

    Private Function countLines() 

     If IO.File.Exists(file) Then 

      Dim reader As New StreamReader(file) 
      Dim lineCount As Integer = Split(reader.ReadToEnd.Trim(), Environment.NewLine).Length 
      reader.Close() 
      Return lineCount 

     Else 

      MsgBox(file + " cannot be found anywhere!", 0, "Oops!") 

     End If 

     Return 1 

    End Function 

    Private Sub translateText() 

     Dim lineLoop As Integer = 0 
     Dim currentLine As String 
     Dim currentLineSplit() As String 
     Dim input1 As New StreamReader(file) 
     Dim input2 As New StreamReader(file) 
     Dim filePunctuation As Integer = 1 
     Dim linePunctuation As Integer = 1 

     Dim delimiters(3) As Char 
     delimiters(0) = "." 
     delimiters(1) = "!" 
     delimiters(2) = "?" 

     Dim entireFile As String 
     entireFile = (input1.ReadToEnd) 

     For i = 1 To Len(entireFile) 
      If Mid$(entireFile, i, 1) = "." Then filePunctuation += 1 
     Next 

     For i = 1 To Len(entireFile) 
      If Mid$(entireFile, i, 1) = "!" Then filePunctuation += 1 
     Next 

     For i = 1 To Len(entireFile) 
      If Mid$(entireFile, i, 1) = "?" Then filePunctuation += 1 
     Next 

     Dim sentenceArraySize = filePunctuation + lineCount 

     Dim sentenceArrayCount = 0 
     Dim sentence(sentenceArraySize) As String 
     Dim sentenceLoop As Integer 

     While lineLoop < lineCount 

      linePunctuation = 1 

      currentLine = (input2.ReadLine) 

      For i = 1 To Len(currentLine) 
       If Mid$(currentLine, i, 1) = "." Then linePunctuation += 1 
      Next 

      For i = 1 To Len(currentLine) 
       If Mid$(currentLine, i, 1) = "!" Then linePunctuation += 1 
      Next 

      For i = 1 To Len(currentLine) 
       If Mid$(currentLine, i, 1) = "?" Then linePunctuation += 1 
      Next 

      currentLineSplit = currentLine.Split(delimiters) 
      sentenceLoop = 0 

      While linePunctuation > 0 

       Try 

        Dim trans As New Google.API.Translate.TranslateClient("") 
        sentence(sentenceArrayCount) = trans.Translate(currentLineSplit(sentenceLoop), Google.API.Translate.Language.English, Google.API.Translate.Language.German, Google.API.Translate.TranslateFormat.Text) 
        sentenceLoop += 1 
        linePunctuation -= 1 
        sentenceArrayCount += 1 

       Catch ex As Exception 

        sentenceLoop += 1 
        linePunctuation -= 1 

       End Try 

      End While 

      lineLoop += 1 

     End While 

     Dim newFile As New String("Translated Text.txt") 
     Dim outputLoopCount As Integer = 0 

     Using output As StreamWriter = New StreamWriter(newFile) 

      While outputLoopCount < sentenceArraySize 

       output.Write(sentence(outputLoopCount) + ". ") 

       outputLoopCount += 1 

      End While 

     End Using 

     input1.Close() 
     input2.Close() 

    End Sub 

    Private Sub translateButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles translateButton.Click 

     translateText() 

    End Sub 

End Class 

EDIT: 4/26/2010 favor probarlo antes de Downvote, no habría publicado si no funcionaba bien.

+1

nice guess. pero esto dará lugar, en la mayoría de los casos, a resultados ininteligibles e inconexos. La traducción es muy sensible al contexto. La expresión humana a través del lenguaje no es tokenizable y compilable. –

+0

Tiene razón en que el lenguaje es muy sensible al contexto, pero puede evitarlo. Ni siquiera necesita buscar cognados perfectos en los idiomas, basó sus tokens de cadena en algo similar a ambos lenguajes, como la puntuación. Hablo inglés y alemán malo y sé que esto funcionará para un traductor de inglés a alemán o de alemán a inglés porque los períodos en oraciones están en el mismo lugar. Podrías usar REGEX, sería simple e impresionante. – ubiquibacon

+0

Ok, reemplaza esas 30 líneas de munging de cuerda con la línea recta de una línea que te di y cómo funciona eso ;-) –

1

Es bastante simple, hay pocas maneras:

  • uso de la API y traducir los datos en trozos (que coincide con las limitaciones).
  • Escribe tu propia biblioteca simple para usar HttpWebRequest y POST algunos datos.

Aquí es un ejemplo (de segundo uno):

Método:

private String TranslateTextEnglishSpanish(String textToTranslate) 
{   
     HttpWebRequest http = WebRequest.Create("http://translate.google.com/") as HttpWebRequest; 
     http.Method = "POST"; 
     http.ContentType = "application/x-www-form-urlencoded"; 
     http.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"; 
     http.Referer = "http://translate.google.com/"; 

     byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(String.Format("js=y&prev=_t&hl=en&ie=UTF-8&layout=1&eotf=1&text={0}+&file=&sl=en&tl=es", textToTranslate); 

     http.ContentLength = dataBytes.Length; 

     using (Stream postStream = http.GetRequestStream()) 
     { 
      postStream.Write(dataBytes, 0, dataBytes.Length); 
     } 

     HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
     if (httpResponse != null) 
     { 
      using (StreamReader reader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       //* Return translated Text 
       return reader.ReadToEnd(); 
      } 
     } 

     return ""; 
} 

llamada de método:

cadena translatedText = TranslateTextEnglishSpanish ("Hola mundo") ;

Resultado:

translatedText == "hola mundo";

Lo que necesita es obtener todos los parámetros de idiomas y usarlos para obtener las traducciones que necesita.

Puede obtener los valores thous usando Live Http Headers addon for firefox.

2

Utilice MyGengo. Tienen una API gratuita para la traducción automática: no sé cómo es la calidad, pero también puedes agregar traducciones humanas por una tarifa.

No estoy afiliado a ellos ni los he usado, pero he escuchado cosas buenas.

1

Descargo de responsabilidad: Aunque definitivamente considero que tokenizar es un medio de traducción sospechoso, dividir oraciones como se ilustra más adelante con tipeo puede producir resultados que llenen sus requisitos.

Sugerí que su código podría mejorarse al reducir las más de 30 líneas de munging de cuerda a la línea recta de 1 línea que pidió in another question, pero la sugerencia no fue bien recibida.

Aquí es una implementación usando google api for .net en VB y CSharp

Program.cs

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Text.RegularExpressions; 
using Google.API.Translate; 

namespace TokenizingTranslatorCS 
{ 
    internal class Program 
    { 
     private static readonly TranslateClient Client = 
      new TranslateClient("http://code.google.com/p/google-api-for-dotnet/"); 

     private static void Main(string[] args) 
     { 
      Language originalLanguage = Language.English; 
      Language targetLanguage = Language.German; 

      string filename = args[0]; 

      StringBuilder output = new StringBuilder(); 

      string[] input = File.ReadAllLines(filename); 

      foreach (string line in input) 
      { 
       List<string> translatedSentences = new List<string>(); 
       string[] sentences = Regex.Split(line, "\\b(?<sentence>.*?[\\.!?](?:\\s|$))"); 
       foreach (string sentence in sentences) 
       { 
        string sentenceToTranslate = sentence.Trim(); 

        if (!string.IsNullOrEmpty(sentenceToTranslate)) 
        { 
         translatedSentences.Add(TranslateSentence(sentence, originalLanguage, targetLanguage)); 
        } 
       } 


       output.AppendLine(string.Format("{0}{1}", string.Join(" ", translatedSentences.ToArray()), 
               Environment.NewLine)); 
      } 

      Console.WriteLine("Translated:{0}{1}{0}", Environment.NewLine, string.Join(Environment.NewLine, input)); 
      Console.WriteLine("To:{0}{1}{0}", Environment.NewLine, output); 
      Console.WriteLine("{0}Press any key{0}", Environment.NewLine); 


      Console.ReadKey(); 
     } 

     private static string TranslateSentence(string sentence, Language originalLanguage, Language targetLanguage) 
     { 
      string translatedSentence = Client.Translate(sentence, originalLanguage, targetLanguage); 
      return translatedSentence; 
     } 
    } 
} 

Module1.vb

Imports System.Text.RegularExpressions 
Imports System.IO 
Imports System.Text 
Imports Google.API.Translate 


Module Module1 

    Private Client As TranslateClient = New TranslateClient("http://code.google.com/p/google-api-for-dotnet/") 

    Sub Main(ByVal args As String()) 

     Dim originalLanguage As Language = Language.English 
     Dim targetLanguage As Language = Language.German 

     Dim filename As String = args(0) 

     Dim output As New StringBuilder 

     Dim input As String() = File.ReadAllLines(filename) 

     For Each line As String In input 
      Dim translatedSentences As New List(Of String) 
      Dim sentences As String() = Regex.Split(line, "\b(?<sentence>.*?[\.!?](?:\s|$))") 
      For Each sentence As String In sentences 

       Dim sentenceToTranslate As String = sentence.Trim 

       If Not String.IsNullOrEmpty(sentenceToTranslate) Then 

        translatedSentences.Add(TranslateSentence(sentence, originalLanguage, targetLanguage)) 

       End If 

      Next 

      output.AppendLine(String.Format("{0}{1}", String.Join(" ", translatedSentences.ToArray), Environment.NewLine)) 

     Next 

     Console.WriteLine("Translated:{0}{1}{0}", Environment.NewLine, String.Join(Environment.NewLine, input)) 
     Console.WriteLine("To:{0}{1}{0}", Environment.NewLine, output) 
     Console.WriteLine("{0}Press any key{0}", Environment.NewLine) 
     Console.ReadKey() 


    End Sub 

    Private Function TranslateSentence(ByVal sentence As String, ByVal originalLanguage As Language, ByVal targetLanguage As Language) As String 

     Dim translatedSentence As String = Client.Translate(sentence, originalLanguage, targetLanguage) 
     Return translatedSentence 
    End Function 

End Module 

de entrada (robado directamente de typoking)

solo para probar un punto arrojé este juntos :) Es áspero alrededor de los bordes , pero manejará un lote ENTERO de texto y lo hace tan bueno como Google para precisión de traducción porque utiliza la API de Google. I procesó todo el 2005 SEC 10-K de Apple con este código y el clic de un botón (tomó aproximadamente 45 minutos). El resultado fue básicamente idéntico al que obtendría si copió y pegó una frase por vez en Google Translator. No es perfecto (la puntuación final no es exacta y no escribí en el archivo de texto línea por línea), pero muestra la prueba del concepto. Podría tener mejor puntuación si trabajó con Regex un poco más.

resultados (al Alemán para typoking):

sólo para demostrar un punto arrojó hago esto juntos :) Es asperezas , pero hay un montón de trabajo alrededor de texto y le duele tan bueno como Google de la exactitud de las traducciones , ya que utiliza la API de Google . Procesé toda SEC 2005 10-K de Apple con este código y el clic de un botón (nos llevó unos 45 minutos). El resultado fue sustancialmente idéntica a lo que se obtendría si copiar y pegar un conjunto en un momento en que Google Translator. No es perfecto (terminando puntuacion es incorrecta y yo no quería en el archivo de texto línea por línea) escribir, pero muestra prueba de concepto. Sería mejor puntuacion si trabajó con expresiones regulares un poco más.

+0

No estaba en desacuerdo contigo sobre Regex, simplemente no tenía tiempo para ponerlo ahí. Probé el poco código que me diste de esa otra pregunta, pero cuando no funcionaba cuando lo copié y lo pegué no investigué por qué, aunque estoy seguro de que era algo pequeño. – ubiquibacon

+0

@typo - sin preocupaciones. –

+0

La traducción es horrible :-) – Thomas

0

Se puede usar de Amazon Mechanical Turk https://www.mturk.com/

Se establece una tarifa para la traducción de una frase o párrafo, y la gente real va a hacer el trabajo. Además, puede automatizarlo con las API de Amazon.

0

Ésta es una posibilidad remota, pero aquí va:

Quizás this blog post que describe el uso de Second Life para traducir artículos sean útiles para usted también?

no estoy muy seguro de si Second Life's API le permite hacer la traducción en al forma automatizada sin embargo.

0

Utilizamos http://www.berlitz.co.uk/translation/ Los habíamos enviar un archivo de base de datos con el Inglés, y una lista de los idiomas en los que es necesario, y que usarían varias personas bilingües para ofrecer las traducciones. También utilizaron la voz en actores para proporcionar archivos WAV para nuestra interfaz telefónica.

Esto era obviamente no tan rápido como la traducción automática, y no libre, pero creo que este tipo de servicio es la única manera de estar seguro de que su traducción tiene sentido.

0

Google proporciona una herramienta útil, Google Translator Toolkit, que le permite subir archivos y traducirlos, cualquiera que sea la lengua Google Translate soportes, a la vez. Es gratis si desea utilizar las traducciones automáticas, pero no hay una opción para contratar a personas reales para traducir sus documentos para usted.

De Wikipedia:

Google Translator Toolkit es una aplicación web diseñada para permitir a los traductores para editar las traducciones qué Google traduce automáticamente generar tasas. Con el Kit de herramientas de Google Traductor, los traductores pueden organizar su trabajo y el uso compartido traducciones, glosarios y memorias de traducción. Ellos pueden subir y traducir documentos de Microsoft Word, OpenOffice.org, RTF, HTML, texto y artículos de Wikipedia.

Link

0

Hay un montón de diferentes APIs de traducción automática: Google, Microsoft, Yandex, IBM, PROMT, Systran, Baidu, YeeCloud, deepl, SDL, SAP.

Algunos de ellos admiten solicitudes por lotes (se traduce una matriz de texto a la vez). Yo traduciría frase por frase con el procesamiento adecuado de 403/429 errores (generalmente se usa para responder a superar la cuota)

te puede hacer referencia a nuestra reciente estudio de evaluación (noviembre de 2017): https://www.slideshare.net/KonstantinSavenkov/state-of-the-machine-translation-by-intento-november-2017-81574321

Cuestiones relacionadas