2010-03-15 17 views
9

Ho molti dati di testo e voglio tradurlo in diverse lingue.Qual è il modo migliore per tradurre una grande quantità di dati di testo?

possibili modi lo so:

  • Google Translate API
  • Bing Translate API

Il problema è che tutti questi servizi hanno limitazioni sulla lunghezza del testo, numero di chiamate, ecc che rende loro inconveniente in uso.

Quali servizi/modi si può consigliare di utilizzare in questo caso?

+1

Non programmazione relativa. Votazione per passare a Super User. –

+8

@David_Thornley Chiede un'API per tradurre in modo programmatico testi di grandi dimensioni .. come è possibile che la programmazione non sia correlata? – Marcelo

+3

questo è sicuramente programmazione correlata –

risposta

4

Ho dovuto risolvere lo stesso problema durante l'integrazione della traduzione della lingua con un server di chat xmpp. Ho partizionato il mio carico utile (il testo che dovevo tradurre) in sottoinsiemi più piccoli di frasi complete. Non riesco a ricordare il numero esatto ma con l'url di traduzione basato sul resto di google, ho tradotto una serie di frasi completate che collettivamente avevano un numero inferiore a (o uguale a) 1024 caratteri, quindi un ampio paragrafo risulterebbe in più chiamate di servizi di traduzione.

+0

sì .. è vero .. ma che succede quando abbiamo dati formattati in html .. suddividere il contenuto non lo considererà come html ulteriormente se lo dividiamo in> o

3

Rompi il tuo grande testo in stringhe con token, quindi passa ogni token attraverso il traduttore tramite un ciclo. Memorizza l'output tradotto in un array e una volta che tutti i token sono stati tradotti e memorizzati nell'array, rimettili insieme e avrai un documento completamente tradotto.

EDIT: 4/25/2010

solo per dimostrare un punto ho buttato questo insieme :) E 'proprio tutto perfettino, ma in grado di gestire un sacco intero testo e lo fa altrettanto buono come Google per l'accuratezza della traduzione perché utilizza l'API di Google. Ho elaborato l'intero file SEC 10-K 2005 di Apple con questo codice e il clic di un pulsante (sono durati circa 45 minuti). Il risultato era sostanzialmente identico a quello che avresti ottenuto se avessi copiato e incollato una frase alla volta in Google Translator. Non è perfetto (terminare la punteggiatura non è preciso e non ho scritto il file di testo riga per riga), ma mostra una dimostrazione di concetto. Potrebbe avere una migliore punteggiatura se hai lavorato ancora con Regex.

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: 2010/04/26 Si prega di provare prima di downvote, non avrei scritto se non ha funzionato bene.

+1

bella ipotesi. ma ciò si tradurrà, nella maggior parte dei casi, in risultati sconnessi incomprensibili. La traduzione è molto sensibile al contesto. L'espressione umana attraverso il linguaggio non è comprensibile e compilabile. –

+0

Hai ragione che la lingua è molto sensibile al contesto, ma puoi ovviare a questo problema. Non hai nemmeno bisogno di cercare affini perfetti nelle lingue, basando i tuoi simboli di stringa su qualcosa che è simile a entrambi i linguaggi come la punteggiatura. Parlo inglese e pessimo tedesco e so che questo funzionerà per un traduttore dall'inglese al tedesco o dal tedesco all'inglese perché i periodi nelle frasi sono nello stesso posto. Potresti semplicemente usare REGEX, sarebbe semplice e fantastico. – ubiquibacon

+0

Ok, sostituisci le 30 linee di stringa munging con la regex a una riga che ti ho dato e vedi come funziona ;-) –

1

E 'piuttosto semplice, ci sono pochi modi:

  • Usa API e tradurre i dati in blocchi (che corrisponde ai limiti).
  • Scrivere la propria libreria semplice per utilizzare HttpWebRequest e POST alcuni dati ad esso.

Ecco un esempio (di seconda):

Metodo:

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 ""; 
} 

metodo di chiamata:

String translatedText = TranslateTextEnglishSpanish ("ciao mondo") ;

Risultato:

translatedText == "hola mundo";

Ciò che serve è ottenere tutti i parametri di lingua e utilizzarli per ottenere le traduzioni necessarie.

È possibile ottenere valori in miglia utilizzando Live Http Headers addon for firefox.

2

Utilizzare MyGengo. Hanno una API gratuita per la traduzione automatica - non so come sia la qualità, ma puoi anche inserire traduzioni umane a pagamento.

Non sono affiliato con loro né li ho usati, ma ho sentito cose buone.

1

Declinazione di responsabilità: Mentre trovo decisamente tokenizing come mezzo di sospetto di traduzione, la suddivisione in frasi come illustrata in seguito dal battitura può produrre risultati che soddisfano le vostre esigenze.

Ho suggerito che il suo codice potrebbe essere migliorato riducendo le oltre 30 linee di stringa munging alla linea 1 regex che ha richiesto per in another question ma il suggerimento non è stato ben ricevuto.

Ecco un'implementazione utilizzando google api for .net in VB e 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 

ingresso (rubata direttamente dal typoking)

Giusto per dimostrare un punto ho gettato questo insieme :) È approssimativo attorno ai bordi , ma gestirà un lotto intero di testo e funziona come Google per la precisione di traduzione perché utilizza l'API di Google. I ha elaborato l'intero file 2005 SEC 10-K di Apple con questo codice e il clic di un pulsante (è durato circa 45 minuti). Il risultato era sostanzialmente identico a che cosa otterresti se copi e incollato una frase alla volta in Google Translator. Non è perfetto (la punteggiatura finale non è precisa e non ho scritto sul file di testo riga per riga), ma mostra la prova di concetto. Potrebbe essere meglio la punteggiatura se hai lavorato con Regex ancora.

Risultati (a Tedesco per typoking):

solo per provare un punto gettato faccio questo insieme :) E 'spigoli , ma c'è un sacco di lavoro in tutto il testo e fa male così buono come Google per l'accuratezza delle traduzioni perché utilizza l'API di Google . Ho elaborato intero 2005 SEC 10-K deposito di Apple con questo codice e il clic di un pulsante (ci vogliono circa 45 minuti). Il risultato è stato sostanzialmente identico a quello che si otterrebbe se si copiato e incollato un set in un momento in cui Google Translator. non è perfetto (finendo la punteggiatura non è corretto e non volevo nel file di testo linea per linea) scrivere, ma mostra proof of concept. Sarebbe meglio punteggiatura se hai lavorato con regex ancora un po '.

+0

Non ero in disaccordo con te su Regex, non ho avuto il tempo di inserirla. Ho provato il bit di codice che mi hai dato da quell'altra domanda, ma quando non funzionava quando l'ho copiato e incollato non ho studiato il motivo, anche se sono sicuro che fosse qualcosa di piccolo. – ubiquibacon

+0

@typo - nessun problema. –

+0

La traduzione è orribile :-) – Thomas

0

Si potrebbe utilizzare di Amazon Mechanical Turk https://www.mturk.com/

Si imposta una tassa per tradurre una frase o un paragrafo, e persone reali farà il lavoro. Inoltre è possibile automatizzare con le API di Amazon.

0

Questo è un colpo lungo, ma qui va:

Forse this blog post che descrive usando Second Life di tradurre articoli essere utili anche per te?

io non sono troppo sicuro se Second Life's API ti permette di fare la traduzione in in modo automatizzato però.

0

Abbiamo usato http://www.berlitz.co.uk/translation/ Ci piacerebbe inviare loro un file di database con l'inglese, e un elenco delle lingue che abbiamo richiesto, e avevano usato varie persone bilingui per fornire le traduzioni. Hanno anche usato voce-attori per fornire i file WAV per la nostra interfaccia telefonica.

Questo è stato, ovviamente, non veloce come traduzione automatica, e non libero, ma penso che questo tipo di servizio è l'unico modo per essere sicuri che la vostra traduzione ha un senso.

0

Google fornisce uno strumento utile, Google Translator Toolkit, che consente di caricare i file e tradurle, a seconda di quale lingua Google Translate supporti, in una sola volta. E 'gratis se si desidera utilizzare le traduzioni automatiche, ma c'è la possibilità di assumere persone reali di tradurre i documenti per voi.

Da Wikipedia:

Google Translator Toolkit è un'applicazione web progettata per consentire ai traduttori di modificare le traduzioni ha Google Translate generare automaticamente i tassi. Con il Toolkit Google Translator, i traduttori possono organizzare il proprio lavoro e utilizzare traduzioni condivisi, glossari e memorie di traduzione. Si possono caricare e tradurre documenti di Microsoft Word, OpenOffice.org, RTF, HTML, testo e articoli di Wikipedia.

Link

0

Ci sono un sacco di diverse API di traduzione automatica di ricerca: Google, Microsoft, Yandex, IBM, PROMT, Systran, Baidu, YeeCloud, DeepL, SDL, SAP.

Alcuni di essi supportano richieste batch (traduzione di una matrice di testo contemporaneamente). Vorrei tradurre frase per frase con una corretta lavorazione di 403/429 errori (di solito usato per rispondere a quota superato)

io può fare riferimento al nostro studio di valutazione recente (novembre 2017): https://www.slideshare.net/KonstantinSavenkov/state-of-the-machine-translation-by-intento-november-2017-81574321

Problemi correlati