我有很多文字数据,希望将其翻译成不同的语言。
我知道的可能方式:
问题是所有这些服务都对文本长度,呼叫次数等有限制,这使得它们在使用中不方便。
在这种情况下,您可以建议使用哪些服务/方式?
答案 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)
这很简单,方法很简单:
这是一个例子(第二个):
方式:强>
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,文本和维基百科文章。
答案 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)
答案 9 :(得分:0)
我们使用http://www.berlitz.co.uk/translation/ 我们会向他们发送一个包含英语的数据库文件,以及我们需要的语言列表,他们会使用各种双语人员来提供翻译。他们还使用语音演员为我们的电话界面提供WAV文件。
这显然不如自动翻译快,而且不是免费的,但我认为这种服务是确保翻译有意义的唯一方法。