2010-03-15 41 views
9

Tôi có rất nhiều dữ liệu văn bản và muốn dịch nó sang các ngôn ngữ khác nhau.Cách tốt nhất để dịch một lượng lớn dữ liệu văn bản là gì?

cách có thể tôi biết:

  • Google Translate API
  • Bing Translate API

Vấn đề là tất cả những dịch vụ này có những hạn chế về độ dài văn bản, số lượng cuộc gọi vv mà làm cho chúng bất tiện trong sử dụng.

Dịch vụ/cách nào bạn có thể tư vấn để sử dụng trong trường hợp này?

+1

Không lập trình liên quan. Bỏ phiếu để chuyển sang Super User. –

+8

@David_Thornley Anh ấy yêu cầu một API dịch các văn bản lớn một cách có lập trình .. làm thế nào mà chương trình đó không liên quan? – Marcelo

+3

điều này chắc chắn là lập trình có liên quan –

Trả lời

4

Tôi phải giải quyết vấn đề tương tự khi tích hợp dịch ngôn ngữ với máy chủ trò chuyện xmpp. Tôi phân chia tải trọng của tôi (văn bản tôi cần dịch) thành các tập nhỏ hơn của các câu hoàn chỉnh. Tôi không thể nhớ chính xác số nhưng với googles dựa trên url dịch thuật, tôi đã dịch một tập hợp các câu hoàn chỉnh thu thập tổng cộng có ít hơn (hoặc bằng) 1024 ký tự, do đó, một đoạn lớn sẽ dẫn đến nhiều cuộc gọi dịch vụ dịch.

+0

vâng .. đó là sự thật .. nhưng trường hợp khi chúng tôi có dữ liệu định dạng html .. tách nội dung sẽ không xem xét nó như html hơn nữa nếu chúng ta chia nó tại> hoặc

3

Chia nhỏ văn bản lớn của bạn thành các chuỗi được mã hóa rồi chuyển từng mã thông báo thông qua trình dịch qua vòng lặp. Lưu trữ đầu ra đã dịch trong một mảng và một khi tất cả các mã thông báo được dịch và lưu trữ trong mảng sẽ đưa chúng trở lại với nhau và bạn sẽ có một tài liệu được dịch hoàn toàn.

EDIT: 4/25/2010

Chỉ cần để chứng minh một điểm tôi đã ném này lại với nhau :) Đó là thô xung quanh các cạnh, nhưng nó sẽ xử lý rất nhiều toàn bộ văn bản và nó cũng chẳng thua kém Google để dịch chính xác vì nó sử dụng API Google. Tôi đã xử lý toàn bộ bản lưu trữ SEC 10-K năm 2005 của Apple bằng mã này và nhấp vào một nút (mất khoảng 45 phút). Kết quả là về cơ bản giống với những gì bạn sẽ nhận được nếu bạn sao chép và dán một câu tại một thời điểm vào Google Translator. Nó không phải là hoàn hảo (kết thúc dấu chấm câu là không chính xác và tôi đã không viết vào dòng tập tin văn bản bằng dòng), nhưng nó cho thấy bằng chứng về khái niệm. Nó có thể có dấu chấm câu tốt hơn nếu bạn làm việc với Regex một số chi tiết.

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 

EDIT: 2010/04/26 Vui lòng thử nó trước khi bạn downvote, tôi sẽ không đăng nó nếu nó không làm việc tốt.

+1

phỏng đoán tốt. nhưng điều này sẽ dẫn đến, trong hầu hết các trường hợp, trong các kết quả rời rạc khó hiểu. Bản dịch rất nhạy cảm với ngữ cảnh. Biểu hiện của con người thông qua ngôn ngữ không phải là tokenizable và compilable. –

+0

Bạn nói đúng là ngôn ngữ rất nhạy cảm với ngữ cảnh, nhưng bạn có thể giải quyết vấn đề này. Bạn thậm chí không cần phải tìm kiếm các cognates hoàn hảo trong các ngôn ngữ, chỉ dựa trên các chuỗi ký tự của bạn ra khỏi một cái gì đó tương tự như cả hai ngôn ngữ như dấu chấm câu. Tôi nói tiếng Anh và tiếng Đức xấu và tôi biết rằng điều này sẽ làm việc cho một phiên dịch tiếng Anh sang tiếng Đức hoặc tiếng Đức sang tiếng Anh bởi vì các dấu chấm câu trong cùng một chỗ. Bạn chỉ có thể sử dụng REGEX, nó sẽ đơn giản và tuyệt vời. – ubiquibacon

+0

Ok, thay thế 30 dòng xâu chuỗi đó bằng một dòng regex tôi đã cho ya và xem cách thức hoạt động ;-) –

1

Nó khá đơn giản, có vài cách:

  • Sử dụng API và dịch dữ liệu trong khối (mà phù hợp với những hạn chế).
  • Viết thư viện đơn giản của riêng bạn để sử dụng HttpWebRequest và POST một số dữ liệu cho nó.

Dưới đây là một ví dụ (của một giây):

Phương pháp:

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 ""; 
} 

Phương pháp Call:

Chuỗi translatedText = TranslateTextEnglishSpanish ("hello world") ;

Kết quả:

translatedText == "hola mundo";

Bạn cần gì để nhận tất cả thông số ngôn ngữ và sử dụng chúng để nhận bản dịch bạn cần.

Bạn có thể nhận giá trị Nghìn bằng cách sử dụng Live Http Headers addon for firefox.

2

Sử dụng MyGengo. Họ có một API miễn phí cho dịch máy - Tôi không biết chất lượng là như thế nào, nhưng bạn cũng có thể cắm bản dịch của con người với một khoản phí.

Tôi không liên kết với họ cũng như không sử dụng chúng, nhưng tôi đã nghe những điều tốt đẹp.

1

Tuyên bố từ chối trách nhiệm: Mặc dù tôi chắc chắn tìm thấy mã thông báo là phương tiện nghi ngờ dịch, chia nhỏ các câu như minh họa sau bằng cách gõ có thể tạo ra kết quả đáp ứng yêu cầu của bạn.

Tôi đã đề xuất rằng mã của anh ấy có thể được cải thiện bằng cách giảm 30 dòng xâu chuỗi thành chuỗi 1 dòng mà anh ta yêu cầu in another question nhưng đề xuất không được nhận rõ.

Đây là một thực hiện sử dụng google api for .net trong VB và 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; 
     } 
    } 
} 

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 

Input (bị đánh cắp trực tiếp từ typoking)

để chứng minh một điểm tôi đã ném này với nhau :) Đó là thô xung quanh các cạnh , nhưng nó sẽ xử lý một lô WHOLE của văn bản và nó chỉ tốt như Google cho độ chính xác bản dịch vì nó sử dụng API Google. Tôi đã xử lý toàn bộ số tài khoản SEC 10-K của Apple với mã này và nhấp vào nút một lần (mất khoảng 45 phút). Kết quả về cơ bản giống hệt với những gì bạn sẽ nhận được nếu bạn sao chép và dán một câu vào một thời điểm vào Google Translator. Nó không hoàn hảo (dấu câu kết thúc không chính xác và tôi không viết vào tệp văn bản từng dòng), nhưng nó hiển thị bằng chứng của khái niệm. Có thể có dấu chấm câu tốt hơn nếu bạn đã làm việc với Regex một số thông tin khác.

Kết quả (sang tiếng Đức cho typoking):

Chỉ cần để chứng minh một điểm ném Tôi làm điều này cùng nhau :) Đó là cạnh thô , nhưng có rất nhiều công việc xung quanh văn bản và nó đau quá tốt như Google về tính chính xác của bản dịch vì nó sử dụng API của Google . Tôi xử lý toàn bộ 2005 SEC 10-K nộp đơn của Apple với mã này và bấm vào một nút (mất khoảng 45 phút). Các kết quả là giống hệt nhau đáng kể với những gì bạn sẽ nhận được nếu bạn sao chép và dán một bộ trong một thời gian khi Google Translator. Nó không hoàn hảo (kết thúc chấm câu là không chính xác và Tôi không muốn trong file văn bản từng dòng) viết, nhưng nó cho thấy bằng chứng của khái niệm. Nó sẽ chấm câu tốt hơn nếu bạn làm việc với regex một số chi tiết.

+0

Tôi đã không đồng ý với bạn về Regex, tôi chỉ không có thời gian để đặt nó trong đó. Tôi đã thử đoạn mã bạn đưa cho tôi từ câu hỏi khác nhưng khi nó không hoạt động khi tôi sao chép và dán nó, tôi đã không điều tra tại sao, mặc dù tôi chắc chắn nó là một cái gì đó nhỏ. – ubiquibacon

+0

@typo - không phải lo lắng. –

+0

Bản dịch thật kinh khủng :-) – Thomas

0

Bạn có thể sử dụng Mechanical Turk của Amazon https://www.mturk.com/

Bạn đặt một khoản phí cho dịch một câu hoặc đoạn văn, và những người thực sự sẽ làm việc. Thêm vào đó bạn có thể tự động hoá nó với các API của Amazon.

0

Đây là một shot dài, nhưng ở đây nó đi:

lẽ this blog post trong đó mô tả sử dụng Second Life để dịch bài viết hữu ích cho bạn không?

Tôi không quá chắc chắn nếu Second Life's API Cho phép bạn thực hiện dịch trong lúc cách tự động mặc dù.

0

Chúng tôi sử dụng http://www.berlitz.co.uk/translation/ Chúng tôi muốn gửi cho họ một tập tin cơ sở dữ liệu với tiếng Anh, và một danh sách các ngôn ngữ chúng tôi yêu cầu, và họ muốn sử dụng người song ngữ khác nhau để cung cấp các bản dịch. Họ cũng sử dụng diễn viên lồng tiếng để cung cấp các file WAV cho giao diện điện thoại của chúng tôi.

này rõ ràng là không nhanh như bản dịch tự động, và không được tự do, nhưng tôi nghĩ rằng loại hình dịch vụ này là cách duy nhất để chắc chắn rằng bản dịch của mình có ý nghĩa.

0

Google Cung cấp một công cụ hữu ích, Google Translator Toolkit, cho phép bạn tải lên các tập tin và dịch chúng, để bất cứ ngôn ngữ Google Translate hỗ trợ, cùng một lúc. Nó hoàn toàn miễn phí nếu bạn muốn sử dụng bản dịch tự động nhưng có một tùy chọn để thuê người thực để dịch văn bản cho bạn.

Từ Wikipedia:

Google Translator Toolkit là một ứng dụng web được thiết kế để cho phép dịch giả để chỉnh sửa các bản dịch đã Google Translate tự động tạo ra giá. Với Google Translator Toolkit, dịch giả có thể tổ chức công việc của họ và sử dụng dịch chia sẻ, chú giải và bộ nhớ dịch. Họ có thể tải lên và dịch các tài liệu Microsoft Word, OpenOffice.org, RTF, HTML, văn bản, và các bài viết Wikipedia.

Link

0

Có một nhiều API Máy dịch khác nhau: Google, Microsoft, Yandex, IBM, Promt, Systran, Baidu, YeeCloud, DeepL, SDL, SAP.

Một số người trong số họ hỗ trợ yêu cầu hàng loạt (dịch một mảng văn bản cùng một lúc). Tôi sẽ dịch từng câu với chế biến đúng 403/429 lỗi (thường được sử dụng để đáp ứng cho vượt quá giới hạn)

tôi có thể giới thiệu bạn đến nghiên cứu đánh giá gần đây của chúng tôi (November 2017): https://www.slideshare.net/KonstantinSavenkov/state-of-the-machine-translation-by-intento-november-2017-81574321

Các vấn đề liên quan