문제

텍스트 데이터가 많고 다른 언어로 번역하고 싶습니다.

내가 아는 가능한 방법 :

  • 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 파일을 제공했습니다.

이것은 분명히 자동 번역만큼 빠르지 않았으며 무료는 아니지만 이런 종류의 서비스가 번역이 의미가 있는지 확인하는 유일한 방법이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top