我有很多文本数据,想将其翻译成不同的语言。

我知道的可能的方法:

  • 谷歌翻译API
  • 必应翻译 API

问题是所有这些服务都对文本长度、通话次数等有限制。这使得它们在使用时不方便。

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

有帮助吗?

解决方案

在将语言翻译与 xmpp 聊天服务器集成时,我必须解决同样的问题。我将我的有效负载(我需要翻译的文本)划分为完整句子的较小子集。我记不清确切的数字,但使用谷歌基于休息的翻译网址,我翻译了一组完整的句子,这些句子总共少于(或等于)1024 个字符,因此大段落将导致多次翻译服务调用。

其他提示

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

编辑:2010年4月25日

只是为了证明一点,我把它放在一起:)它的边缘很粗糙,但它可以处理大量文本,并且它在翻译准确性方面与谷歌一样好,因为它使用谷歌 API。我使用此代码并单击一个按钮处理了 Apple 的整个 2005 年 SEC 10-K 文件(大约需要 45 分钟)。结果与您一次复制一个句子并将其粘贴到谷歌翻译中所得到的结果基本相同。它并不完美(结尾标点符号不准确,我没有逐行写入文本文件),但它确实显示了概念证明。如果您更多地使用正则表达式,它可能会有更好的标点符号。

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日,请在您降低投票之前先尝试一下,如果它不起作用,我不会发布它。

使用 我的Gengo. 。他们有一个免费的机器翻译 API——我不知道质量如何,但你也可以付费插入人工翻译。

我与他们没有任何关系,也没有使用过它们,但我听说过一些好消息。

很简单,有以下几种方法:

  • 使用 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 "";
}

方法调用:

字符串已翻译文本 = TranslateTextEnglishSpanish("hello world");

结果:

翻译文本==“hola mundo”;

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

您可以使用以下方法获得数千个值 Firefox 的实时 Http 标头插件.

免责声明:虽然我确实发现标记化作为一种​​翻译手段值得怀疑,但稍后通过打字说明的句子分割可能会产生满足您要求的结果。

我建议可以通过将 30 多行字符串修改减少到他要求的 1 行正则表达式来改进他的代码 在另一个问题中 但这一建议并没有得到很好的回应。

这是一个使用的实现 .net 的谷歌 API 在 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一样出色,因为它使用了Google API,因此它的翻译精度也一样。我使用此代码处理了Apple的整个2005 SEC 10-K文件,并单击一个按钮(大约需要45分钟)。结果基本上与如果您一次复制并粘贴一句话为Google Translator,您将获得的结果相同。它不是完美的(结束标点符号不准确,我没有按线路写入文本文件),但它确实显示了概念证明。如果您与Regex一起工作,它可能会有更好的标点符号。

结果(德语打字):

nur um zu beweisen einen punkt warf iCh dies zusammen :) es est ecken und Kanten,Abrer es wird eine ganze Menge umgehen umgehen un umgehen un tut so Google google four die genauigkeit der genauigkeit der d d d d d d d d d d d d d d d d d d d dübersetzungen,weil es google-die google-papi verwendet。ICH VERARBEITET APPLE的GESAMTE 2005 SEC 10-K归档BEI Diesem Code und dem dem klicken einer味道(dauerte ca.45分钟)。Das Ergebnis战争Im Wesentlichen Identisch Zu Dem是SieErhaltenWürden,Wenn Sie Kopiert undEingefügtEinem einem Satz在Google Translator的Einer Zeit。ES IST NICHT PERVEKT(Endung Interpunktion Ist Nicht Korrekt und iCh Wollte nicht in Die Textdatei ZeilefürZeile)Schreiben,Aber es Zeigt概念证明。EshätteBesserSatzzeichen,Wenn Sie Mit Regex Arbeitete Einige Mehr。

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

来自维基百科:

谷歌翻译工具包是一个网络应用程序,旨在允许译者编辑谷歌翻译自动生成的翻译。借助 Google 翻译工具包,译者可以组织自己的工作并使用共享翻译、术语表和翻译记忆库。他们可以上传和翻译 Microsoft Word 文档、OpenOffice.org、RTF、HTML、文本和维基百科文章。

关联

有很多不同的机器翻译 API:谷歌、微软、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

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

您为翻译句子或段落设定费用,然后由真人来完成这项工作。另外,您还可以使用 Amazon 的 API 使其自动化。

这是一个漫长的过程,但它是这样的:

也许 这篇博文 其中描述使用“第二人生”翻译文章对您也有帮助吗?

我不太确定是否 第二人生的 API 不过,允许您以自动方式进行翻译。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top