Что лучший способ состоит в том, чтобы перевести большой объем текстовых данных?

Я имею много текстовых данных и хочу перевести его на различные языки.

Возможными путями я знаю:

  • Google переводит API
  • Bing переводит API

Проблема состоит в том, что все эти сервисы имеют ограничения на текстовую длину, количество вызовов и т.д., которое делает их неудобными используемый.

Какие сервисы / пути Вы могли совет использовать в этом случае?

9
задан sashaeve 15 March 2010 в 15:07
поделиться

7 ответов

Мне пришлось решить ту же проблему при интеграции языкового перевода с сервером чата xmpp. Я разделил свою полезную нагрузку (текст, который мне нужно было перевести) на более мелкие подмножества полных предложений. Я не могу вспомнить точное число, но с URL-адресом перевода на основе googles rest я перевел набор завершенных предложений, которые в совокупности имели в общей сложности менее (или равных) 1024 символа, поэтому большой абзац приведет к многократным вызовам службы перевода.

4
ответ дан 4 December 2019 в 15:13
поделиться

Разбейте большой текст на токенизированные строки затем пропустите каждый токен через переводчик через цикл. Сохраните переведенный вывод в массиве, и как только все токены будут переведены и сохранены в массиве, соедините их вместе, и вы получите полностью переведенный документ.

РЕДАКТИРОВАТЬ: 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 г. Пожалуйста, попробуйте его перед тем, как проголосовать против, я бы не опубликовал его, если бы он не сработал.

3
ответ дан 4 December 2019 в 15:13
поделиться

Это довольно просто, есть несколько способов:

  • Использовать API и переводить данные по частям (что соответствует ограничениям).
  • Напишите свою собственную простую библиотеку для использования HttpWebRequest и отправьте в нее данные POST.

Вот пример (второго):

Метод:

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 .

1
ответ дан 4 December 2019 в 15:13
поделиться

Отказ от ответственности: хотя я определенно считаю токенизацию подозрительным средством перевода, разбиение на предложения, как позже проиллюстрировано с помощью опечаток, может привести к результатам, которые соответствуют вашим требованиям.

Я предположил, что его код можно улучшить, сократив более 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.

1
ответ дан 4 December 2019 в 15:13
поделиться

Вы можете использовать Amazon Mechanical Turk https://www.mturk.com/

Вы устанавливаете плату за перевод предложения или абзаца, и реальные люди будут делать эту работу. Кроме того, вы можете автоматизировать это с помощью API Amazon.

0
ответ дан 4 December 2019 в 15:13
поделиться

Используйте MyGengo. У них есть бесплатный API для машинного перевода - я не знаю, каково качество, но вы также можете подключить человеческий перевод за плату.

Я не связан с ними и не использовал их, но я слышал хорошие вещи.

2
ответ дан 4 December 2019 в 15:13
поделиться

Это долгий шанс, но вот он:

Возможно, эта запись в блоге, описывающая использование Second Life для перевода статей, будет вам полезна?

Я не слишком уверен, что API Second Life позволяет вам делать перевод автоматизированным способом.

0
ответ дан 4 December 2019 в 15:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: