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