Pergunta

Eu tenho muitos dados de texto e quero traduzi -los em diferentes idiomas.

Possíveis maneiras que eu conheço:

  • API do Google Translate
  • Bing traduze API

O problema é que todos esses serviços têm limitações no comprimento do texto, número de chamadas etc., o que os torna inconvenientes em uso.

Quais serviços / maneiras que você poderia aconselhar a usar neste caso?

Foi útil?

Solução

Eu tive que resolver o mesmo problema ao integrar a tradução de idiomas com um servidor de bate -papo XMPP. Eu participei da minha carga útil (o texto que eu precisava traduzir) em subconjuntos menores de frases completas. Não me lembro do número exato, mas com o URL de tradução baseado no GOOGLES REST, traduzi um conjunto de frases concluídas que coletivly tinham um total de menos de (ou igual a) 1024 caracteres; portanto, um grande parágrafo resultaria em várias chamadas de serviço de tradução.

Outras dicas

Divida seu grande texto em cordas tokenizadas e depois passe cada token pelo tradutor por meio de um loop. Armazene a saída traduzida em uma matriz e, uma vez que todos os tokens forem traduzidos e armazenados na matriz, junte -os novamente e você terá um documento completamente traduzido.

Edit: 25/04/2010

Apenas para provar um ponto, joguei isso juntos :) é difícil nas bordas, mas lidará com muito texto e é tão bom quanto o Google para precisão de tradução porque usa a API do Google. Processei todo o arquivamento da Apple 2005 Sec 10-K com este código e o clique de um botão (levou cerca de 45 minutos). O resultado foi basicamente idêntico ao que você obteria se copiasse e colasse uma frase de cada vez no Translator do Google. Não é perfeito (o final da pontuação não é preciso e eu não escrevi na linha de arquivo de texto por linha), mas mostra prova de conceito. Pode ter melhor pontuação se você trabalhou com Regex um pouco mais.

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: 26/04/2010, por favor, tente antes de você fazer votos, eu não teria postado se não funcionasse bem.

Usar MyGengo. Eles têm uma API gratuita para tradução para a máquina - não sei como é a qualidade, mas você também pode conectar a tradução humana por uma taxa.

Não sou afiliado a eles nem os usei, mas ouvi coisas boas.

É bem simples, existem poucas maneiras:

  • Use a API e traduza dados em pedaços (que correspondem às limitações).
  • Escreva sua própria biblioteca simples para usar o httpwebrequest e publique alguns dados nela.

Aqui está um exemplo (do segundo):

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

Chamada de método:

String TradlatedText = TradleTextEnglishSpanish ("Hello World");

Resultado:

TradlateText == "Hola Mundo";

O que você precisa é obter todos os parâmetros de idiomas e usá -los para obter traduções necessárias.

Você pode obter valores thous usando Cabeçalhos HTTP vivos Addon para Firefox.

Isenção de responsabilidade: Enquanto eu definitivamente acho o tokenizador como um meio de suspeito de tradução, dividindo -se em frases como ilustrado posteriormente, tipando pode produzir resultados que preenchem seus requisitos.

Sugeri que o código dele pudesse ser melhorado, reduzindo as mais de 30 linhas de alpinismo para a regex de 1 linha que ele pediu em outra pergunta Mas a sugestão não foi bem recebida.

Aqui está uma implementação usando API do Google para .NET em 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;
        }
    }
}

Módulo1.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

Entrada (roubada diretamente de digitar)

Apenas para provar um ponto, joguei isso juntos :) é difícil nas bordas, mas lidará com muito texto e é tão bom quanto o Google para precisão de tradução porque usa a API do Google. Processei todo o arquivamento da Apple 2005 Sec 10-K com este código e o clique de um botão (levou cerca de 45 minutos). O resultado foi basicamente idêntico ao que você obteria se copiasse e colasse uma frase de cada vez no Translator do Google. Não é perfeito (o final da pontuação não é preciso e eu não escrevi na linha de arquivo de texto por linha), mas mostra prova de conceito. Pode ter melhor pontuação se você trabalhou com Regex um pouco mais.

Resultados (para alemão para digitar):

Nur um zu beweisen einen punkt warf ich morre zusammen :) es ist ecken und kanten, aber es wird eine ganze menge texto umgehen und est tut so gut wie google für die genauigkeit der übersetzungen, weil es die google-api verwendet. Icharbeitet gesamte da Apple 2005 seg 10-k arquivamento BEI Diesem Código e Dem Klingle Einer Taste (dauerte ca. 45 Minuten). Das ergebnis war im westlichen Identisch zu dem, era Sie erhalten würden, wenn sie kopiert und eingefügt einem satz em Einer Zeit, no Google Translator. Es It Nicht Perfekt (Endung Interpunktion It Nicht Korrekt e Wollte Nicht em Die Textdatei Zeile für zeile) Schreiben, Abers es Zeigt Proof of Concept. Es Hätte Besser Satzzeichen, Wenn Sie Mit Regex Arbeitete Einige Mehr.

O Google fornece uma ferramenta útil, Google Translator Toolkit, que permite que você envie arquivos e traduz -os, para qualquer idioma que o Google Translate suportado, de uma só vez. É gratuito se você deseja usar as traduções automatizadas, mas há uma opção para contratar pessoas reais para traduzir seus documentos para você.

Da Wikipedia:

O Google Translator Toolkit é um aplicativo da Web projetado para permitir que os tradutores editem as traduções que o Google Translate gera automaticamente. Com o Google Translator Toolkit, os tradutores podem organizar seu trabalho e usar traduções compartilhadas, glossários e memórias de tradução. Eles podem fazer upload e traduzir documentos do Microsoft Word, OpenOffice.org, RTF, HTML, Text e Wikipedia.

Link

Existem muitas APIs diferentes de tradução de máquinas: Google, Microsoft, Yandex, IBM, Promt, Systran, Baidu, Yeecloud, Deepl, SDL, SAP.

Alguns deles suportam solicitações de lote (traduzindo uma variedade de texto de uma só vez). Eu traduzi a frase por frase com o processamento adequado de erros 403/429 (geralmente usado para responder para cota excedida)

Posso encaminhá -lo ao nosso recente estudo de avaliação (novembro de 2017): https://www.slideshare.net/konstantinsavenkov/state-of-the-machine-translation-by-intento-novembro-2017-81574321

Você poderia usar o turco mecânico da Amazonhttps://www.mturk.com/

Você define uma taxa para traduzir uma frase ou parágrafo, e as pessoas reais farão o trabalho. Além disso, você pode automatizá -lo com as APIs da Amazon.

Este é um tiro no escuro, mas aqui vai:

Talvez esta postagem do blog que descreve o uso do Second Life para traduzir artigos também é útil para você?

Não tenho muita certeza se API da Second Life Permite que você faça a tradução de uma maneira automatizada.

Nós costumavamos http://www.berlitz.co.uk/translation/Enviamos a eles um arquivo de banco de dados com o inglês e uma lista dos idiomas que precisamos, e eles usariam várias pessoas bilíngues para fornecer as traduções. Eles também usaram dubladores para fornecer arquivos WAV para nossa interface telefônica.

Obviamente, isso não foi tão rápido quanto a tradução automatizada, e não é gratuita, mas acho que esse tipo de serviço é a única maneira de garantir que sua tradução faça sentido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top