Qual é a melhor maneira de traduzir uma grande quantidade de dados de texto?
-
20-09-2019 - |
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?
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.
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.