Я имею много текстовых данных и хочу перевести его на различные языки.
Возможными путями я знаю:
Проблема состоит в том, что все эти сервисы имеют ограничения на текстовую длину, количество вызовов и т.д., которое делает их неудобными используемый.
Какие сервисы / пути Вы могли совет использовать в этом случае?
Мне пришлось решить ту же проблему при интеграции языкового перевода с сервером чата xmpp. Я разделил свою полезную нагрузку (текст, который мне нужно было перевести) на более мелкие подмножества полных предложений. Я не могу вспомнить точное число, но с URL-адресом перевода на основе googles rest я перевел набор завершенных предложений, которые в совокупности имели в общей сложности менее (или равных) 1024 символа, поэтому большой абзац приведет к многократным вызовам службы перевода.
Разбейте большой текст на токенизированные строки затем пропустите каждый токен через переводчик через цикл. Сохраните переведенный вывод в массиве, и как только все токены будут переведены и сохранены в массиве, соедините их вместе, и вы получите полностью переведенный документ.
РЕДАКТИРОВАТЬ: 25.04.2010
Чтобы доказать свою точку зрения, я собрал это вместе :) Он грубоват, но он обрабатывает ВСЕ тексты и делает так же хорошо, как Google для перевода точность, потому что он использует Google API. Я обработал всю документацию Apple SEC 10-K 2005 года с помощью этого кода и нажатием одной кнопки (заняло около 45 минут). Результат был в основном идентичен тому, что вы получили бы, если бы копировали и вставляли по одному предложению за раз в Переводчик Google. Он не идеален (конечная пунктуация не точна, и я не писал в текстовый файл построчно), но он действительно показывает доказательство концепции. Он мог бы иметь лучшую пунктуацию, если бы вы еще немного поработали с 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
РЕДАКТИРОВАТЬ: 26 апреля 2010 г. Пожалуйста, попробуйте его перед тем, как проголосовать против, я бы не опубликовал его, если бы он не сработал.
Это довольно просто, есть несколько способов:
Вот пример (второго):
Метод:
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 "";
}
Вызов метода:
String translatedText = TranslateTextEnglishSpanish ("hello world");
Результат:
TranslatedText == " hola mundo ";
Вам нужно просто получить параметры всех языков и использовать их для получения нужных вам переводов.
Вы можете получить тысячи значений с помощью надстройки Live Http Headers для firefox .
Отказ от ответственности: хотя я определенно считаю токенизацию подозрительным средством перевода, разбиение на предложения, как позже проиллюстрировано с помощью опечаток, может привести к результатам, которые соответствуют вашим требованиям.
Я предположил, что его код можно улучшить, сократив более 30 строк перестановки строк до однострочного регулярного выражения, которое он просил в другом вопросе , но это предложение не было получено должным образом.
Вот реализация, использующая google api для .net в VB и 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
Ввод (украден непосредственно из опечатки)
Просто для того, чтобы докажите, что я скинул этот вместе :) Он грубый по краям, но он обрабатывает ВСЕЙ участок текста и работает так же хорошо, как {{1 }} Google за точность перевода , потому что он использует Google API. Я обработал всю документацию Apple SEC 10-K за 2005 г. с помощью этого кода и нажатием одной кнопки (заняло около 45 минут). Результат был в основном таким. идентично тому, что вы получили бы, если бы скопировали и вставили по одному предложению за раз в Google Translator. Это не идеально (конечная пунктуация не точна , и я не писал в текстовый файл строка за строкой), но это действительно доказательство {{1} } концепции. Было бы лучше использовать пунктуацию, если бы вы еще немного поработали с регулярным выражением .
Результаты (на немецкий за опечатку):
Nur um zu beweisen einen Punkt warf ich dies zusammen :) Es ist Ecken und Kanten, aber es wird eine ganze Menge {{ 1}} Text umgehen und es tut so gut wie Google für die Genauigkeit der Übersetzungen, weil es die Google-API verwendet.Ich verarbeitet Apple's gesamte 2005 SEC 10-K Filing bei diesem Code und dem Klicken einer Taste (dauerte ca. 45 Minuten). Das Ergebnis war im wesentlichen identifyisch zu dem - это Sie erhalten würden, wenn Sie kopiert und eingefügt einem Satz в einer Zeit, в переводчике Google. {1}} Es ist nicht perfekt (Endung Interpunktion ist nicht korrekt und ich wollte nicht in die Textdatei Zeile für Zeile) schreiben, aber es zeigt доказательство концепции. Es hätte besser Satzzeichen, wenn Sie mit Regex arbeitete einige mehr.
Вы можете использовать Amazon Mechanical Turk https://www.mturk.com/
Вы устанавливаете плату за перевод предложения или абзаца, и реальные люди будут делать эту работу. Кроме того, вы можете автоматизировать это с помощью API Amazon.
Используйте MyGengo. У них есть бесплатный API для машинного перевода - я не знаю, каково качество, но вы также можете подключить человеческий перевод за плату.
Я не связан с ними и не использовал их, но я слышал хорошие вещи.
Это долгий шанс, но вот он:
Возможно, эта запись в блоге, описывающая использование Second Life для перевода статей, будет вам полезна?
Я не слишком уверен, что API Second Life позволяет вам делать перевод автоматизированным способом.