8

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

我知道的可能方式:

问题是所有这些服务在文本长度、调用次数等方面都有限制,这使得它们使用起来很不方便。

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

4

8 回答 8

2

在将语言翻译与XMPP聊天服务器集成时,我必须解决同样的问题。我将我的有效载荷(我需要翻译的文本)划分为更小的完整句子子集。

我不记得确切的数字了,但是使用 Google 的基于REST的翻译 URL,我翻译了一组完整的句子,它们的总字符数少于(或等于)1024 个字符,因此一个大段落会导致多个翻译服务电话。

于 2010-03-15T15:16:48.513 回答
1

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

只是为了证明一点,我把它放在一起:) 它的边缘很粗糙,但它可以处理大量的文本,而且它的翻译准确性和谷歌一样好,因为它使用谷歌 API。我使用此代码处理了 Apple 的整个 2005 年 SEC 10-K 文件并单击一个按钮(大约需要 45 分钟)。

结果与一次将一个句子复制并粘贴到谷歌翻译中得到的结果基本相同。它并不完美(结束标点不准确,我没有逐行写入文本文件),但它确实显示了概念证明。如果您更多地使用 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-04-24T20:23:47.130 回答
0

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

我不隶属于他们,也没有使用过他们,但我听说过好东西。

于 2010-04-26T14:04:57.953 回答
0

免责声明:虽然我确实发现标记化作为一种​​翻译手段是可疑的,但如后来ubiquibacon 所示,拆分句子可能会产生满足您要求的结果。

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

这是在 VB.NET 和 C# 中使用Google API for .NET的实现。

文件程序.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

输入(直接从 ubiquibacon 窃取)

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

结果(给德国人打错字):

Nur um zu beweisen einen Punkt warf ich dies zusammen 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 identisch zu dem, 是 Sie erhalten würden, wenn Sie kopiert und eingefügt einem Satz in einer Zeit, in Google Translator。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。

于 2010-04-27T21:08:09.837 回答
0

我们使用了 http://www.berlitz.co.uk/translation/

我们会向他们发送一个包含英语内容的数据库文件,以及我们需要的语言列表,他们会使用各种双语人员来提供翻译。他们还使用配音演员为我们的电话接口提供WAV文件。

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

于 2010-09-14T07:57:02.850 回答
0

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

来自维基百科:

谷歌翻译工具包是一个网络应用程序,旨在让翻译人员编辑谷歌翻译自动生成的翻译。借助 Google 翻译工具包,翻译人员可以组织他们的工作并使用共享的翻译、词汇表和翻译记忆库。他们可以上传和翻译 Microsoft Word 文档、OpenOffice.org、RTF、HTML、文本和 Wikipedia 文章。

关联

于 2015-07-19T22:47:50.497 回答
0

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

其中一些支持批处理请求(一次翻译一组文本)。我会逐句翻译,适当处理 403/429 错误(通常用于响应超出配额)。

我可以向您推荐我们最近的评估研究(2017 年 11 月):机器翻译状态

于 2017-11-09T14:23:41.387 回答
-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 translateText = TranslateTextEnglishSpanish("hello world");

结果:

翻译文本 == "你好世界";

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

您可以使用 Firefox 的Live Http Headers 插件获得 thous 值。

于 2010-04-26T09:44:28.823 回答