标签:搜狗 翻译 网页 String matcher transWord new nvps
在浏览器访问网页,特别是英文网页经常需要自己做翻译,特别是英文不好的盆友会非常头疼,我就是其中一员 哈。
传统的翻译软件需要手动粘贴到工具进行翻译,而且准确度不高,目前各大平台都推出了自己的在线翻译,有些平台提供了AI智能翻译,翻译的准确性有了很大的提供。
以搜狗AI平台为例就提供了中英文翻译的API,可以通过调用接口方式对中文或者英文进行互译。
下面就简单谈一下对网页进行翻译的思想。
1 HTML解析
1.1 HTML组成
Html语言是一种标记语言,类似于xml。元素通常是封装在<>中,一段标记是有<元素名称></元素名称>组成。
一般完整的HTML网页内容包括如下:
<!DOCTYPE html> <html lang="en"> <head prefix="og: http://ogp.me/ns#"> <meta name="generator" content="在线HTML"> <meta charset="utf-8"> <title>Freedgo Desing</title> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="canonical" href="https://www.freedgo.com/index.html"> <meta name="description" content="各种专业图表."> <meta name="keywords" content="在线图表编辑器"> <script> </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> </head> <body> <div id="container"/> <!-- Cookie --> <script src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.2.0/js.cookie.min.js"></script> <!-- build:js build/js/main.js --> <script src="/public/js/lang_select.js"></script> <script src="/public/js/toc.js"></script> <script src="/public/js/mobile_nav.js"></script> </body> <script> </script> </html> <script> </script> </body> </html>
1.2 如何分解HTML,获取需要翻译的文本
针对HTML元素,思路分析
- <A>: A里面的内容通常不需要翻译,暂不考虑alt, tip。
- <>B</>: B部分包装体里面的内容可以通过java 正则表达式对网页内容进行分组。分离出B的内容通过调用搜狗AI翻译API成中文,然后重新组织在标记<> 内。
可以通过java正则表达式处理:
private static Pattern descripitonPattern = Pattern.compile("(([<|</][^>]+>)?)([^>|<]+)?(([<|/][^>]+>)+)");
该表达式对html源码进行匹配获取group,其中group(3)获取到html标签中的内容,然后进行翻译获取对应的中文。在进行组合生成对应的翻译后的文件。
StringBuffer sb = new StringBuffer(); Matcher matcher = descripitonPattern.matcher(inputString); while (matcher.find()) { // sb.append(matcher.group(0)); sb.append(matcher.group(1)); String transWord = matcher.group(3); if (!StringUtil.isEmpty(transWord)) { transWord = transWord.trim(); try { sb.append(transferCn(transWord)); } catch (Exception e) { System.out.println("transWord = " + transWord); break; } } sb.append(matcher.group(4)); } return sb.toString();// 返回文本字符串
1.2 考虑一下特殊的标记
- <pre> 标签的一个常见应用就是用来表示计算机的源代码,这部分通常不需要做翻译
- <code>标签
- Script 体内容不需要做翻译(暂未实现)
- Style 体内容不需要做翻译(暂未实现)
2. 搜狗翻译API的使用
2.1 API调用方式
需要登录https://deepi.sogou.com
注册PID和Key
使用机器翻译->文本翻译可以实现中文到(英、日、韩、阿、俄、德、法、葡、意、西、捷、波、匈、荷、瑞、丹、芬、土、越) 的互译。
先封装用于翻译的基础方法,直接上代码如下:
public static String transferCn(String engTxt) throws IOException { PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(); manager.setMaxTotal(400); manager.setDefaultMaxPerRoute(30); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(manager) .build(); HttpPost httpPost = new HttpPost("http://fanyi.sogou.com:80/reventondc/api/sogouTranslate"); String pid = "xxxx"; String salt = new Long(System.currentTimeMillis()).toString(); String sign = DigestUtils.md5Hex(pid + engTxt + salt + "xxxx"); //in the case, the pid with the key counts sign will be this value // sign = "882e9c08aba3b673d055a6d1a14d0c9f"; List nvps = new ArrayList<>(); nvps.add(new BasicNameValuePair("from", "en")); nvps.add(new BasicNameValuePair("to", "zh-CHS")); nvps.add(new BasicNameValuePair("pid", pid)); nvps.add(new BasicNameValuePair("q", engTxt)); nvps.add(new BasicNameValuePair("salt", salt)); nvps.add(new BasicNameValuePair("sign", sign)); httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); HttpRequestBase requestBase = httpPost; requestBase.addHeader("content-type", "application/x-www-form-urlencoded"); requestBase.addHeader("accept", "application/json"); CloseableHttpResponse response = httpClient.execute(requestBase); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity, "UTF-8"); Map map = JsonUtils.toObject(result, Map.class); if (map.get("translation") != null) { return (String) map.get("translation"); } else { return ""; } // return result; }
标签:搜狗,翻译,网页,String,matcher,transWord,new,nvps 来源: https://www.cnblogs.com/csy2019/p/10910971.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。