많은 양의 텍스트 데이터를 번역하는 가장 좋은 방법은 무엇입니까?
-
20-09-2019 - |
문제
텍스트 데이터가 많고 다른 언어로 번역하고 싶습니다.
내가 아는 가능한 방법 :
- Google 번역 API
- Bing은 API를 번역합니다
문제는 이러한 모든 서비스가 텍스트 길이, 통화 수 등에 제한이 있다는 것입니다.
이 경우 어떤 서비스 / 방법을 사용할 수 있습니까?
해결책
언어 번역을 XMPP 채팅 서버와 통합 할 때 동일한 문제를 해결해야했습니다. 나는 페이로드 (번역에 필요한 텍스트)를 완전한 문장의 작은 하위 집합으로 분할했습니다. 정확한 숫자를 기억할 수는 없지만 Googles REST 기반 번역 URL을 사용하면 총체적으로 총 1024 자 (또는 동일)가있는 완성 된 문장 세트를 번역 했으므로 많은 단락으로 여러 번역 서비스 호출이 발생합니다.
다른 팁
큰 텍스트를 토큰 화 된 문자열로 나눈 다음 루프를 통해 번역기를 통해 각 토큰을 전달하십시오. 번역 된 출력을 배열에 저장하면 모든 토큰이 배열에 번역되고 저장되면 다시 합치면 완전히 번역 된 문서가 있습니다.
편집 : 4/25/2010
요점을 증명하기 위해 나는 이것을 함께 던졌다 :) 가장자리 주위에 거칠다. 그러나 그것은 많은 텍스트를 처리 할 것이며 Google API를 사용하기 때문에 번역 정확도를 위해 Google만큼 좋다. 이 코드와 하나의 버튼을 클릭하여 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
편집 : 4/26/2010 다운 보트 전에 시도해보십시오. 잘 작동하지 않으면 게시하지 않았을 것입니다.
사용 Mygengo. 그들은 기계 번역을위한 무료 API를 가지고 있습니다. 품질이 어떤지 잘 모르겠지만, 인간 번역을 유료로 연결할 수도 있습니다.
나는 그들과 제휴하지도 않고 사용하지 않았지만 좋은 것을 들었습니다.
매우 간단하고 몇 가지 방법이 있습니다.
- 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 translatedText = TranslateTextEnglishSpanish ( "Hello World");
결과:
TranslatedText == "Hola Mundo";
필요한 것은 모든 언어 매개 변수를 얻고 필요한 번역을 얻기 위해 사용하는 것입니다.
당신은 사용한 값을 얻을 수 있습니다 Firefox 용 Live HTTP 헤더 애드온.
면책 조항 : 나는 번역 용의자의 수단으로 토큰 화를 확실히 발견하지만, 나중에 유사한 것으로 설명 된 문장을 분할하면 요구 사항을 채우는 결과가 생성 될 수 있습니다.
나는 그의 코드가 그가 요청한 1 라인 regex로 30 줄 이상의 문자열을 줄임으로써 개선 될 수 있다고 제안했다. 또 다른 질문에서 그러나 제안은 잘받지 못했습니다.
다음은 사용을 사용하는 구현입니다 .NET 용 Google API 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
입력 (타이킹에서 직접 도난 당함)
요점을 증명하기 위해 나는 이것을 함께 던졌다 :) 가장자리 주위에 거칠다. 그러나 그것은 많은 텍스트를 처리 할 것이며 Google API를 사용하기 때문에 번역 정확도를 위해 Google만큼 좋다. 이 코드와 하나의 버튼을 클릭하여 Apple의 2005 SEC 10-K 제출을 처리했습니다 (약 45 분). 결과는 기본적으로 한 번에 한 문장을 Google Translator에 복사하고 붙여 넣으면 얻을 수있는 것과 동일했습니다. 완벽하지는 않지만 (문장 부호 종료는 정확하지 않으며 텍스트 파일에 라인별로 쓰지 않았습니다) 개념 증명을 보여줍니다. Regex와 함께 일했다면 더 나은 구두점이있을 수 있습니다.
결과 (타이핑을위한 독일어) :
NUR UM ZU BEWISEN EINEN PUNKT WARF ICH DIES Zusammen DIES :) ES IST Ecken und Kanten, Aber es wird eine ganze menze 텍스트 Umgehen un es tut so googe wie googe für die genauigkeit der übersetzungen, weil es google-api verwendet. ich verarbeitet Apple의 Gesamte 2005 Sec 10-K 제출 베이 diesem 코드 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, einer zeit의 Google 번역기. est ist nicht perfekt (endung interpunktion ist nicht korrekt und ich wollte nicht die textdatei zeile für zeile) Schreiben, Aber es Zeigt 개념 증명. Es Hätte Besser Satzzeichen, Wenn Sie Mit Regex Arbeitete Einige Mehr.
Google은 유용한 도구를 제공합니다. Google Translator Toolkit
, 파일을 업로드하고 번역 할 수 있습니다. Google 번역이 지원하는 언어로 한 번에 번역 할 수 있습니다. 자동 번역을 사용하려면 무료이지만 실제 사람을 고용하여 문서를 번역 할 수있는 옵션이 있습니다.
Wikipedia에서 :
Google Translator Toolkit은 번역가가 Google 번역이 자동으로 생성하는 번역을 편집 할 수 있도록 설계된 웹 응용 프로그램입니다. Google Translator Toolkit을 통해 번역가는 작업을 구성하고 공유 번역, 용어집 및 번역 기억을 사용할 수 있습니다. Microsoft Word 문서, OpenOffice.org, RTF, HTML, Text 및 Wikipedia 기사를 업로드하고 번역 할 수 있습니다.
Google, Microsoft, Yandex, IBM, Promt, Systran, Baidu, Yeecloud, Deepl, SDL, SAP와 같은 다양한 기계 번역 API가 많이 있습니다.
그들 중 일부는 배치 요청을 지원합니다 (한 번에 텍스트 배열을 번역). 403/429 오류의 적절한 처리로 문장별로 문장을 번역합니다 (일반적으로 할당량을 초과하는 데 사용)
최근 평가 연구 (2017 년 11 월)를 언급 할 수 있습니다. https://www.slideshare.net/konstantinsavenkov/state-of-the-machine-translation-by-intento-nember-2017-81574321
아마존의 기계식 터크를 사용할 수 있습니다https://www.mturk.com/
문장이나 단락을 번역하는 데 수수료를 내고 실제 사람들이 그 일을 할 것입니다. 또한 Amazon의 API로 자동화 할 수 있습니다.
이것은 긴 샷이지만 여기서 간다 :
아마도 이 블로그 게시물 기사를 번역하기 위해 Second Life를 사용하여 도움이되는 것은 무엇입니까?
나는 너무 확실하지 않습니다 Second Life의 API 그래도 자동화 된 방식으로 번역을 할 수 있습니다.
우리는 사용했었다 http://www.berlitz.co.uk/translation/우리는 그들에게 영어와 함께 데이터베이스 파일과 우리가 필요한 언어 목록을 보내고 다양한 이중 언어를 사용하여 번역을 제공 할 것입니다. 또한 음성 액트를 사용하여 전화 인터페이스에 WAV 파일을 제공했습니다.
이것은 분명히 자동 번역만큼 빠르지 않았으며 무료는 아니지만 이런 종류의 서비스가 번역이 의미가 있는지 확인하는 유일한 방법이라고 생각합니다.