多くのテキスト データがあり、それを別の言語に翻訳したいと考えています。
私が知っている可能な方法:
問題は、これらのサービスはすべて、テキストの長さや通話回数などに制限があり、使い勝手が悪いことです。
この場合、どのサービス/方法を使用するようアドバイスできますか?
多くのテキスト データがあり、それを別の言語に翻訳したいと考えています。
私が知っている可能な方法:
問題は、これらのサービスはすべて、テキストの長さや通話回数などに制限があり、使い勝手が悪いことです。
この場合、どのサービス/方法を使用するようアドバイスできますか?
大きなテキストをトークン化された文字列に分割し、各トークンをループ経由でトランスレーターに渡します。翻訳された出力を配列に保存し、すべてのトークンが翻訳されて配列に保存されたら、それらを元に戻すと、完全に翻訳されたドキュメントができあがります。
要点を証明するために、私はこれをまとめました :) 端が荒いですが、大量のテキストを処理し、Google API を使用しているため、翻訳精度は Google と同じくらい優れています。このコードと 1 つのボタンをクリックするだけで、Apple の 2005 SEC 10-K ファイリング全体を処理できました (約 45 分かかりました)。
結果は、一度に 1 つの文をコピーして Google 翻訳に貼り付けた場合と基本的に同じでした。これは完全ではありません (末尾の句読点は正確ではなく、テキスト ファイルに 1 行ずつ書き込んでいません) が、概念実証を示しています。正規表現をもう少し使用すると、句読点が改善される可能性があります。
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
http://www.berlitz.co.uk/translation/を使用しました。
英語のコンテンツと必要な言語のリストを含むデータベースファイルを送信し、さまざまなバイリンガルの人々を使用して翻訳を提供しました。彼らはまた、私たちの電話インターフェースにWAVファイルを提供するために声優を使用しました。
これは明らかに自動翻訳ほど速くはなく、無料でもありませんでしたが、この種のサービスがあなたの翻訳が理にかなっていることを確認する唯一の方法だと思います。
MyGengoを使用します。機械翻訳用の無料 API があります。品質がどのようなものかはわかりませんが、有料で人力翻訳をプラグインすることもできます。
私はそれらと提携していませんし、使用したこともありませんが、良いことを聞いています。
免責事項: トークン化は翻訳の手段として間違いなく疑わしいと思いますが、後で ubiquibacon で示すように文を分割すると、要件を満たす結果が得られる場合があります。
30 行以上の文字列変更を、彼が別の質問で要求した 1 行の正規表現に減らすことで、彼のコードを改善できると提案しましたが、その提案はあまり受け入れられませんでした。
これは、 VB.NET と C# でGoogle API for .NETを使用した実装です。
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;
}
}
}
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 と同じくらい優れています。このコードと 1 つのボタンをクリックするだけで、Apple の 2005 SEC 10-K ファイリング全体を処理できました (約 45 分かかりました)。結果は基本的に、一度に 1 つの文をコピーして Google 翻訳に貼り付けた場合と同じでした。これは完全ではありません (句読点の末尾は正確ではなく、テキスト ファイルに 1 行ずつ書き込んでいませんでした) が、概念の証明を示しています。正規表現をもう少し使用すると、句読点が改善される可能性があります。
この記事を読んでいると、どうすればよいかわかりません:) 本質的にエッケンとカンテンが必要であり、テキストが非常に複雑であり、テキストが非常に複雑であり、Google が Google API バージョンを使用しているためです。Ich verarbeitet Apple's gesamte 2005 SEC 10-K Filing bei diesem Code und dem Klicken einer Taste (dauerte ca. 45 Minuten). Das Ergebnis war im wesentlichen identisch zu dem, was Sie erhalten würden, wenn Sie kopiert und eingefügt einem Satz in einer Zeit, in einer Zeit, in Google Translator. Es ist nicht perfekt (Endung Interpunktion ist nicht korrekt und ich wollte nicht in die Textdatei Zeile für Zeile) schreiben, aber es zeigt Poof of Concept. さらに詳しくは、Sie mit Regex arbeitete einige mehr を参照してください。
それは非常に簡単で、いくつかの方法があります。
これが例です(2番目のもの):
方法:
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 translatorText = TranslateTextEnglishSpanish("hello world");
結果:
翻訳されたテキスト == "ホラムンド";
必要な翻訳を取得するには、すべての言語のパラメーターを取得し、それらを使用するだけです。
Firefox の Live Http Headers アドオンを使用して、thous の値を取得できます。