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

StackOverflow https://stackoverflow.com/questions/2448097

Вопрос

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

Возможные способы, которые я знаю:

  • Google Переводчик API
  • API-интерфейс перевода Bing

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

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

Это было полезно?

Решение

Мне пришлось решить ту же проблему при интеграции языкового перевода с чат-сервером xmpp.Я разделил свою полезную нагрузку (текст, который мне нужно было перевести) на более мелкие подмножества полных предложений.Я не могу вспомнить точное число, но с помощью URL-адреса перевода на основе отдыха Google я перевел набор завершенных предложений, общая длина которых меньше (или равна) 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.04.2010 Попробуйте, прежде чем вы погрузитесь, я бы не опубликовал его, если бы не сработало.

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

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

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

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

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

Метод:

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 TranslationText = TranslateTextEnglishSpanish("Привет, мир");

Результат:

переведенныйТекст == "Hola mundo";

Что вам нужно, так это просто получить все параметры языков и использовать их для получения нужных вам переводов.

Вы можете получить тысячи значений, используя Дополнение Live Http Headers для Firefox.

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

Я предположил, что его код можно улучшить, сократив более 30 строк обработки строк до регулярного выражения в одну строку, которое он просил. в другом вопросе но это предложение не было встречено хорошо.

Вот реализация с использованием Google API для .net в VB и CSharp

Программа.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;
        }
    }
}

Модуль1.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

Ввод (украдён непосредственно при наборе текста)

Просто чтобы доказать свою точку зрения, я сбросил это вместе :) Это грубо по краям, но он будет обрабатывать много текста, и это так же хорошо, как Google для точности перевода, потому что он использует API Google.Я обработал всю подачу заявки Apple SEC 10-K с этим кодом и нажатию кнопки одной кнопки (заняло около 45 минут).Результат был в основном идентичен тем, что вы получили бы, если бы вы скопировали и вставили одно предложение за раз в Google Translator.Это не идеально (окончание пунктуации не является точным, и я не писал в строке текстового файла), но показывает доказательство концепции.Это может иметь лучшую пунктуацию, если бы вы работали с Regex еще немного.

Результаты (на немецкий для набора текста):

Nurm zu beweisen einen punkt warf ich умирает Zusammen :) Es Ist Ecken und Kanten, Aber es Wird Eine Ganze Text Umgehen und tut, так что Google wie für die genauigkeit der übersetzungen, weil es die google-verwendet.Ich Verarbeitet Apple Gesamte 2005 Sec 10-K Задача BEI Diesem Code und Dem Klicken Einer Taste (Dauerte Ca.45 минут).Das Ergebnis War Im Wesentlichen Identisch Zu Dem, был Sie Erhalten Würden, Wenn Sie Kopiert und Eingefügt Einem Satz в Einer Zeit, в Google Translator.Es ist nicht perfekt (endung Interpuncktion ist nicht korrekt und ich wollte nicht in die textdatei Zeile für Zeile) Schreiben, Aber es Zeigt Proof of Concept.Es Hätte Besser Satzzeichen, Wenn Sie Mit Regex Arbeitete Einige Mehr.

Google предоставляет полезный инструмент, Google Translator Toolkit, который позволяет сразу загружать файлы и переводить их на любой язык, поддерживаемый Google Translate.Если вы хотите использовать автоматические переводы, это бесплатно, но есть возможность нанять реальных людей для перевода ваших документов.

Из Википедии:

Google Translator Toolkit — это веб-приложение, позволяющее переводчикам редактировать переводы, автоматически генерируемые Google Translate.С помощью Google Translator Toolkit переводчики могут организовать свою работу и использовать общие переводы, глоссарии и память переводов.Они могут загружать и переводить документы Microsoft Word, OpenOffice.org, RTF, HTML, текст и статьи Википедии.

Связь

Существует множество различных API машинного перевода:Google, Microsoft, Яндекс, IBM, ПРОМТ, Систран, Baidu, YeeCloud, DeepL, SDL, SAP.

Некоторые из них поддерживают пакетные запросы (одновременный перевод массива текста).Я бы перевел предложение за предложением с правильной обработкой ошибок 403/429 (обычно используется для ответа за превышение квоты)

Могу отослать вас к нашему недавнему оценочному исследованию (ноябрь 2017 г.): https://www.slideshare.net/KonstantinSavenkov/state-of-the-machine-translation-by-intento-november-2017-81574321

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

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

Это долгий путь, но вот он:

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

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

Мы использовали http://www.berlitz.co.uk/translation/Мы посылали им файл базы данных с английским языком и список необходимых нам языков, и они привлекали разных двуязычных людей для выполнения переводов.Они также использовали актеров озвучки для предоставления файлов WAV для нашего телефонного интерфейса.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top