Как лучше всего переводить большие объемы текстовых данных? - PullRequest
9 голосов
/ 15 марта 2010

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

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

  • Google Translate API
  • API Bing Translate

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

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

Ответы [ 10 ]

4 голосов
/ 15 марта 2010

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

3 голосов
/ 25 апреля 2010

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

РЕДАКТИРОВАТЬ: 4/25/2010

Просто для того, чтобы доказать свою мысль, я бросил это вместе :) Он грубый по краям, но он будет обрабатывать ВЕСЬ много текста, и он так же хорош, как Google для точности перевода, потому что он использует Google API. Я обработал всю заявку Apple SEC 10-K 2005 года с этим кодом и нажатием одной кнопки (это заняло около 45 минут). Результат был в основном идентичен тому, что вы получили бы, если бы вы копировали и вставляли по одному предложению за раз в Google Translator. Это не идеально (окончательная пунктуация не точна, и я не записывал в текстовый файл построчно), но это действительно доказательство концепции. Может быть лучше пунктуация, если вы поработаете с 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 Пожалуйста, попробуйте, прежде чем понизить голосование, я бы не опубликовал его, если бы он не работал хорошо.

2 голосов
/ 26 апреля 2010

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

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

1 голос
/ 09 ноября 2017

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

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

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

1 голос
/ 20 июля 2015

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

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

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

Link

1 голос
/ 28 апреля 2010

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

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

Вот реализация, использующая 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

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

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

Результаты (на немецком языке для опечатывания):

Nur um zu beweisen einen Punkt warf ich dies zusammen :) Es ist Ecken und Kanten, aber es wird eine ganze Menge Текст Umgehen Und Tut So Gut Wie Google für die Genauigkeit der Übersetzungen, weil es die Google-API verwendet. Ич верарбейтет Apple's gesamte 2005 SEC 10-K Filing bei Diesem Code и DEM Klicken Einer Вкус (dauerte около 45 минут). десять кубометров Ergebnis war im wesentlichen Identifisch zu dem, был Sie erhalten würden, Венн Sie kopiert und eingefügt einem Satz в эйнер цейт, в гугл переводчик. 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, Вен С Мит Регекс arbeitete einige mehr.

1 голос
/ 26 апреля 2010

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

  • Используйте 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 ("привет мир");

Результат:

translationText == "hola mundo";

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

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

0 голосов
/ 14 сентября 2010

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

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

0 голосов
/ 29 апреля 2010

Это длинный выстрел, но здесь он идет:

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

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

0 голосов
/ 29 апреля 2010

Вы можете использовать механический турок Амазонки https://www.mturk.com/

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

...