10/24
实验一:百度机器翻译SDK实验
一、实验要求
任务一:下载配置百度翻译Java相关库及环境(占10%)。
任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。
任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。
任务四:完成百度翻译GUI相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。
实验总结:(占10%)
二、实验步骤
任务一:
- 访问百度翻译开放平台官网 百度翻译开放平台,注册账号并创建应用,以获得APP ID和密钥(Secret Key)。
- 从百度翻译开放平台提供的页面下载Java SDK,通常包括几个Java类文件,如HttpGet.java等。
任务二:
文本翻译-通用版
- 1. 多语言支持:支持200多种语言的互译,能够满足跨语言交流的需求。
- 2. 自动语种检测:用户传入待翻译内容时,可以指定源语言,同时支持语种自动检测。
- 3. 术语干预:允许用户对翻译中的特定术语进行干预,以确保翻译的准确性。
- 4. 技术实力:依托互联网数据资源和自然语言处理技术,提供业界领先的机器翻译服务。
- 5. 翻译质量:在2019年国际机器翻译评测(WMT19)中,百度翻译获得中英翻译第一名。
文本翻译-词典版
- 1. 词典资源:在通用版的基础上,翻译结果附带百万量级的中英词典资源和语音合成资源,特别适合教育类应用开发者。
- 2. 专业词典版:提供全国科学技术名词审定委员会规范名词术语库,涵盖中英科学技术名词近百万条,具有专业权威性。
- 3. 教育应用:在外语教学及学习场景中,通过实时句子翻译、单词释义、语音合成等功能,帮助师生沟通、外教课后点评,辅助阅读和写作,全面提升学习效率与质量。
任务三:
package com.example.ruanjian;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Scanner;
import static com.example.ruanjian.Sample.HTTP_CLIENT;
import static com.example.ruanjian.Sample.getAccessToken;
/**
* 功能:
* 作者:
* 日期: 2024/11/1 15:29
*/
public class testTrans {
public static void drawMenu() throws
JSONException, IOException {
System.out.println("选择翻译类型:");
System.out.println("1.英译汉. ");
System.out.println("2.汉译英. ");
System.out.println("3.退出程序. ");
System.out.print("请输入选项:");
transEnToCh();
}
public static void transEnToCh()
throws JSONException, IOException {
Scanner scanner = new Scanner(System.in);
switch (scanner.nextInt()){
case 1:
fromEnToCh();
break;
case 2:
fromChToEn();
break;
case 3:
System.out.println("退出程序");
System.exit(0);
break;
default:
System.out.println("输入错误,请重新输入!");
break;
}
}
public static void fromEnToCh()
throws IOException, JSONException {
Scanner scanner = new
Scanner(System.in);
System.out.println("请输入英文句子:");
String sentence =
scanner.nextLine();
apiTrans(sentence,1);
}
public static void fromChToEn()
throws IOException, JSONException {
Scanner scanner = new
Scanner(System.in);
System.out.println("请输入中文句子:");
String sentence =
scanner.nextLine();
apiTrans(sentence,2);
}
public static void apiTrans(String
sentence,Integer choice) throws IOException, JSONException {
String accessToken = getAccessToken();
String query = new String();
switch (choice){
case 1:
query = String.format("{\"q\":\"%s\",
\"from\":\"en\", \"to\":\"zh\"}",
sentence);
break;
case 2:
query = String.format("{\"q\":\"%s\",
\"from\":\"zh\", \"to\":\"en\"}",
sentence);
break;
default:
break;
}
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType,
query); //封装请求
Request request = new
Request.Builder() //发送请求
.url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token="
+ accessToken)
.post(body)
.addHeader("Content-Type", "application/json")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
dealJson(response.body().string());
}
public static void dealJson(String
json) throws JSONException {
JSONObject jsonObject = new
JSONObject(json);
try {
// 获取result对象
JSONObject result =
jsonObject.getJSONObject("result");
// 获取trans_result数组
JSONArray transResultArray =
result.getJSONArray("trans_result");
// 由于我们只需要第一个翻译结果,所以取数组的第一个元素
JSONObject transResult =
transResultArray.getJSONObject(0);
// 提取dst和src
String dst =
transResult.getString("dst");
// 打印结果
System.out.println("翻译结果: " + dst); // 输出: 你好,世界
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[]
args) throws JSONException, IOException {
while (true){
drawMenu();
}
}
}
任务四:
package com.example.ruanjian;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import static com.example.ruanjian.Sample.HTTP_CLIENT;
import static com.example.ruanjian.Sample.getAccessToken;
public class BaiduTranslateGUI {
public static void main(String[]
args) {
// 创建 JFrame 实例
JFrame frame = new
JFrame("Baidu Translate");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setLayout(new
BorderLayout(10, 10)); // 设置布局管理器和组件间的间隙
// 创建面板,用于放置组件
JPanel panel = new JPanel(new
GridBagLayout());
GridBagConstraints gbc = new
GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(10, 10,
10, 10); // 设置组件的外边距
// 创建输入文本框
JTextField inputTextField = new
JTextField();
inputTextField.setPreferredSize(new Dimension(380, 50));
gbc.gridx = 1;
gbc.gridy = 0;
panel.add(new JLabel("Text
to Translate:"), gbc);
gbc.gridx = 2;
gbc.gridy = 0;
panel.add(inputTextField, gbc);
// 创建下拉菜单选择源语言
JComboBox<String>
fromLanguageComboBox = new JComboBox<>(new String[]{"English",
"Spanish", "French","Chinese"});
gbc.gridx = 1;
gbc.gridy = 1;
panel.add(new
JLabel("From:"), gbc);
gbc.gridx = 2;
gbc.gridy = 1;
panel.add(fromLanguageComboBox,
gbc);
// 创建下拉菜单选择目标语言
JComboBox<String>
toLanguageComboBox = new JComboBox<>(new String[]{"Chinese",
"Japanese", "German","English"});
gbc.gridx = 1;
gbc.gridy = 2;
panel.add(new
JLabel("To:"), gbc);
gbc.gridx = 2;
gbc.gridy = 2;
panel.add(toLanguageComboBox,
gbc);
// 创建翻译按钮
JButton translateButton = new
JButton("Translate");
translateButton.setPreferredSize(new Dimension(100, 30));
gbc.gridx = 2;
gbc.gridy = 3;
gbc.gridwidth = 2; // 让按钮跨越两列
gbc.fill = GridBagConstraints.CENTER;
panel.add(translateButton, gbc);
// 为按钮添加事件监听器
translateButton.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent e) {
// 这里可以添加调用百度翻译API的代码
String sentence =
inputTextField.getText();
String from =
fromLanguageComboBox.getSelectedItem().toString();
String to =
toLanguageComboBox.getSelectedItem().toString();
String result = null;
try {
result = translate(sentence,
from, to);
} catch (IOException ex)
{
throw new
RuntimeException(ex);
} catch (JSONException
ex) {
throw new
RuntimeException(ex);
}
// 假设翻译结果是固定的,实际应用中应替换为API调用结果
JOptionPane.showMessageDialog(frame,
result);
}
});
// 设置窗口的标题栏颜色
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
// 将面板添加到框架中
frame.add(panel, BorderLayout.CENTER);
// 显示窗口
frame.setVisible(true);
}
public static String translate(String
sentence, String from, String to) throws IOException, JSONException {
switch (from) {
case "Chinese":
from = "zh";
break;
case "English":
from = "en";
break;
case "Spanish":
from = "spa";
break;
case "French":
from = "fra";
break;
default:
break;
}
switch (to) {
case "Chinese":
to = "zh";
break;
case "Japanese":
to = "jp";
break;
case "German":
to = "de";
break;
case "English":
to = "en";
break;
default:
break;
}
String query = String.format("{\"q\":\"%s\",
\"from\":\"%s\", \"to\":\"%s\"}",
sentence, from, to);
String result = apiTrans(query);
return result;
}
public static String apiTrans(String
query) throws IOException, JSONException {
String accessToken = getAccessToken();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType,
query); //封装请求
Request request = new
Request.Builder() //发送请求
.url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token="
+ accessToken)
.post(body)
.addHeader("Content-Type", "application/json")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
String result = dealJson(response.body().string());
return result;
}
public static String dealJson(String
json) throws JSONException {
JSONObject jsonObject = new
JSONObject(json);
try {
// 获取result对象
JSONObject result =
jsonObject.getJSONObject("result");
// 获取trans_result数组
JSONArray transResultArray =
result.getJSONArray("trans_result");
// 由于我们只需要第一个翻译结果,所以取数组的第一个元素
JSONObject transResult =
transResultArray.getJSONObject(0);
// 提取dst和src
String dst =
transResult.getString("dst");
return dst;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
三、实验总结
在本次实验中,我们完成了对百度机器翻译SDK的全面学习和实践。以下是实验的总结:
成功下载并配置了百度翻译Java相关库及环境,为后续的开发工作打下了坚实的基础。通过这一过程,我们熟悉了如何集成第三方服务到本地开发环境中,这对于未来的软件开发工作具有重要意义。
完成了百度翻译API的调用代码,并成功实现了中文到英文以及英文到中文的翻译功能。在编码和测试过程中,我们不仅提升了编程技能,还学会了如何调试和优化API调用,确保翻译结果的准确性和效率。