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

.net 翻译大量文本数据的最佳方式是什么?,.net,translation,google-api,bing-api,.net,Translation,Google Api,Bing Api,我有很多文本数据,想把它翻译成不同的语言 我知道的可能方式: 谷歌翻译API 必应翻译API 问题是,所有这些服务在文本长度、通话次数等方面都有限制,这给它们的使用带来了不便 在这种情况下,您可以建议使用哪些服务/方法?在将语言翻译与xmpp聊天服务器集成时,我必须解决同样的问题。我将我需要翻译的文本划分为完整句子的较小子集。我记不起确切的数字,但通过谷歌基于rest的翻译url,我翻译了一组完整的句子,总共少于或等于1024个字符,因此,一个大段落将导致多个翻译服务调用。将大文本分解为标记化字

我有很多文本数据,想把它翻译成不同的语言

我知道的可能方式:

谷歌翻译API 必应翻译API 问题是,所有这些服务在文本长度、通话次数等方面都有限制,这给它们的使用带来了不便


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

在将语言翻译与xmpp聊天服务器集成时,我必须解决同样的问题。我将我需要翻译的文本划分为完整句子的较小子集。我记不起确切的数字,但通过谷歌基于rest的翻译url,我翻译了一组完整的句子,总共少于或等于1024个字符,因此,一个大段落将导致多个翻译服务调用。

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

编辑:4/25/2010

为了证明这一点,我把它放在了一起:它的边缘很粗糙,但它可以处理大量的文本,而且它在翻译准确性方面与谷歌一样好,因为它使用谷歌API。我用这个代码处理了苹果公司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
编辑:4/26/2010
请在否决投票前尝试一下,如果效果不好,我不会发布它。

非常简单,有几种方法:

使用API并在符合限制的块中翻译数据。 编写自己的简单库来使用HttpWebRequest并向其中发布一些数据。 下面是第二个示例:

方法:

方法调用:

String translatedText=translatextenglishspanishhello-world

结果:

translatedText==hola mundo

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

您可以使用获得千个值。

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


我与它们没有关系,也没有使用过它们,但我听到了一些好消息。

免责声明:虽然我肯定认为标记化是一种值得怀疑的翻译手段,但如稍后打字所示,拆分句子可能会产生满足您要求的结果

我建议他的代码可以通过将30多行的字符串咀嚼减少到他要求的1行正则表达式来改进,但是这个建议没有得到很好的接受

下面是一个在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;
        }
    }
}
模块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
直接从打字中窃取的输入

为了证明这一点,我扔了这个 一起:这是一个粗糙的世界 边缘,但它会处理很多 它的性能和 谷歌的翻译准确性 因为它使用谷歌API。我 处理了苹果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
输入德语的结果:

我的朋友们都很开心 我死了祖萨曼:是埃肯和 坎顿,我想这是我的梦想 文中有一段很长的时间 谷歌公司 Übersetzungen,weil es die Google API 维尔温特。我喜欢苹果的 gesamte 2005第10-K节提交文件 diesem代码和dem Klicken einer 品尝达乌尔特约45分钟。达斯 厄尔盖布尼斯战争 你是埃尔哈顿·瓦尔登吗 你是科皮耶特和埃因格特吗 在einer Zeit中,在Google Translator中。 这是我的工作 解释是不正确的 我不知道怎么写 Zeile für Zeile schreiben,aber es zeigt概念证明。埃斯·赫特 贝塞尔·萨齐琴,你是雷格克斯吗 阿尔贝特·埃尼格·梅尔


你可以用亚马逊的机械土耳其人


你为翻译一个句子或段落设定了一笔费用,而真正的人会做这项工作。此外,您还可以使用Amazon的API实现自动化。

这是一个很长的目标,但它就是这样 :

也许哪种描述使用SecondLife翻译文章的方式对你也有帮助

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

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


这显然不如自动翻译快,也不是免费的,但我认为这种服务是确保你的翻译有意义的唯一途径

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

来自维基百科:

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


有很多不同的机器翻译API:谷歌、微软、Yandex、IBM、PROMT、Systran、百度、YeeCloud、DeepL、SDL、SAP

其中一些支持一次翻译文本数组的批处理请求。我会逐句翻译,正确处理403/429个错误,这些错误通常用于回复超出配额的错误


我可以请您参考我们最近于2017年11月进行的评估研究:

与编程无关。投票决定转为超级用户。@David_Thornley他要求一个API以编程方式翻译大文本。。这与编程无关吗?这绝对是编程related@MarceloRamires:第一句话是我有很多文本数据,想把它们翻译成不同的语言。这与我需要设置一种以自动方式翻译文本的方法不同。@David_Thornley:这个问题包含多个句子。猜得好。但在大多数情况下,这将导致无法理解的脱节结果。翻译是非常上下文敏感的。通过语言的人类表达是不可标记化和可编译的。你是对的,语言是非常上下文敏感的,但你可以解决这个问题。你甚至不需要在两种语言中寻找完美的同源词,只需要根据类似于两种语言的东西(如标点符号)来创建字符串标记。我会说英语和蹩脚的德语,我知道这对英译德或德译英的译者来说很有用,因为句子中的句点在同一个地方。你可以只使用正则表达式,这将是简单和可怕的-是的,我还指出,在我的评论中,改进的正则表达式会有所帮助,我只是没有时间研究我不知道的函数,所以我使用了我知道的:此外,它是有效的,这是重要的部分。如果他愿意,他可以改进它。好吧,如果你满足于提供一个不符合标准的答案,而你却得到了一个更好的选择,我想这是你的责任。但我能做的是通过向你展示另一种回答问题的方式来帮助你-我不是不同意你关于正则表达式的观点,我只是没有时间把它放进去。我确实试过了你在另一个问题上给我的代码,但当我复制和粘贴它时,它不起作用,我没有调查原因,尽管我确信它很小。翻译很可怕:-@Thomas-是的,我怀疑是的。这就是我试图阻止这种做法的目的,但在看到peeps发布了不符合标准的建议和代码后,我打算展示一种干净的方式来做肮脏的事情。是的。。那是真的。。但是,当我们有html格式的数据时会发生什么情况呢。。分割内容不会把它看成HTML,如果我们把它拆分为“>”或“字符”。有什么帮助吗?很有效!我已经成功上传了一本有153k单词的荷兰语书,并将其翻译成英语。现在已经不存在了