翻译大量文本数据的最佳方法是什么?

时间:2010-03-15 15:07:03

标签: .net translation google-api bing-api

我有很多文字数据,希望将其翻译成不同的语言。

我知道的可能方式:

  • Google翻译API
  • Bing翻译API

问题是所有这些服务都对文本长度,呼叫次数等有限制,这使得它们在使用中不方便。

在这种情况下,您可以建议使用哪些服务/方式?

10 个答案:

答案 0 :(得分:4)

在将语言翻译与xmpp聊天服务器集成时,我必须解决同样的问题。我将我的有效负载(我需要翻译的文本)划分为较小的完整句子子集。我不记得确切的数字,但谷歌休息的翻译网址,我翻译了一组完整的句子,集合总共小于(或等于)1024个字符,所以一个大段落将导致多个翻译服务电话。 / p>

答案 1 :(得分:3)

将大文本分解为标记化字符串,然后通过循环将每个标记传递给翻译器。将翻译后的输出存储在一个数组中,一旦所有标记都被翻译并存储在数组中,将它们放回原处,您将拥有一个完全翻译的文档。

编辑:2010年4月25日

只是为了证明我把它扔在一起的一点:)它是粗糙的边缘,但它将处理整个文本,它与谷歌的翻译准确性一样好,因为它使用谷歌API。我使用此代码处理Apple的整个2005年SEC 10-K文件并单击一个按钮(大约需要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

编辑:2010年4月26日 请在你投票之前尝试一下,如果效果不好,我就不会发布。

答案 2 :(得分:2)

使用MyGengo。他们有一个免费的机器翻译API - 我不知道它的质量是什么,但你也可以付费插入人工翻译。

我与他们没有关联,也没有使用它们,但我听到了好消息。

答案 3 :(得分:1)

这很简单,方法很简单:

  • 使用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 translatedText = TranslateTextEnglishSpanish(“hello world”);

<强>结果:

translatedText ==“hola mundo”;

您需要的是获取所有语言参数并使用它们以获得所需的翻译。

您可以使用Live Http Headers addon for firefox获取价值。

答案 4 :(得分:1)

免责声明:虽然我肯定会将令牌化作为翻译手段的嫌疑人,但是如后所述,通过打字来分割句子可能会产生满足您要求的结果。

我建议他的代码可以通过将30多行字符串重写减少到他要求的in another question的1行正则表达式来改进,但是这个建议没有得到很好的回应。

这是在VB和CSharp

中使用google api for .net的实现

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 API。一世   加工Apple的整个2005 SEC 10-K   提交此代码并点击   一个按钮(约需45分钟)。   结果基本相同   如果你复制和你会得到什么   一次粘贴一句话   谷歌翻译器。它并不完美   (结束标点符号不准确   我没有写入文本文件   逐行),但它确实显示证据   的概念。它可能会更好   标点符号,如果您使用正则表达式   还有一些。

结果(德语为typoking):

  

Nur um zu beweisen einen Punkt warf   ich死了zusammen :) Es ist Ecken und   Kanten,aber es wird eine ganze Menge   文字umgehen und es tut so gut wie   GooglefürdieGenauigkeit 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   味道(dauerte约45分钟)。达斯   Ergebnis战争我wesentlichen identisch   zu dem,是Sieerhaltenwürden,wenn   Sie kopiertundingeffügtineineSatz   在谷歌翻译的einer Zeit中。   Es ist nicht perfekt(Endung   Interpunktion ist nicht korrekt und   ich wollte nicht in the Textdatei   ZeilefürZeile)schreiben,aber es   zeigt概念证明。 Eshätte   besser Satzzeichen,wenn Sie mit Regex   arbeitete einige mehr。

答案 5 :(得分:1)

Google提供了一个有用的工具Google Translator Toolkit,可让您一次上传文件并将其翻译为Google翻译支持的任何语言。 如果您想使用自动翻译,它是免费的,但可以选择聘请真人为您翻译文档。

来自维基百科:

  

Google Translator Toolkit是一个网络应用程序,旨在允许翻译人员编辑Google翻译自动生成的翻译。通过Google Translator Toolkit,翻译人员可以组织他们的工作并使用共享翻译,词汇表和翻译记忆库。他们可以上传和翻译Microsoft Word文档,OpenOffice.org,RTF,HTML,文本和维基百科文章。

Link

答案 6 :(得分:1)

有很多不同的机器翻译API:Google,Microsoft,Yandex,IBM,PROMT,Systran,百度,YeeCloud,DeepL,SDL,SAP。

其中一些支持批量请求(一次翻译文本数组)。我将逐句翻译,并正确处理403/429错误(通常用于响应超出的配额)

我可以向您推荐我们最近的评估研究(2017年11月):https://www.slideshare.net/KonstantinSavenkov/state-of-the-machine-translation-by-intento-november-2017-81574321

答案 7 :(得分:0)

你可以使用亚马逊的Mechanical Turk https://www.mturk.com/

您为翻译句子或段落设定了费用,而真正的人会完成这项工作。此外,您可以使用亚马逊的API自动执行此操作。

答案 8 :(得分:0)

这是一个很长的镜头,但在这里:

或许this blog post描述使用Second Life翻译文章对你也有帮助吗?

我不太确定Second Life's API是否允许您以自动方式进行翻译。

答案 9 :(得分:0)

我们使用http://www.berlitz.co.uk/translation/ 我们会向他们发送一个包含英语的数据库文件,以及我们需要的语言列表,他们会使用各种双语人员来提供翻译。他们还使用语音演员为我们的电话界面提供WAV文件。

这显然不如自动翻译快,而且不是免费的,但我认为这种服务是确保翻译有意义的唯一方法。