免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4566 | 回复: 3
打印 上一主题 下一主题

[分享] 使用有道API进行自动预翻译 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-27 10:32 |只看该作者 |倒序浏览
最近翻译了一些东西,发现如果每次有翻译提示,即使翻译的前言不搭后语,但如果将那些生词都提示出来了,也能帮助我尽快的掌握原文意思,进行翻译:

也可以将内容贴到有道词典中,获取翻译数据,但复制粘帖多了,就烦了,何不用Perl语言实现呢?

以下ID是我申请的,一个小时内不能用超过1000次,所有大家最好自己申请一个新的:

这是个模块,叫 Translate::Youdao

调用的时候:
  1. #!perl
  2. #
  3. use 5.014;
  4. use Translate::Youdao qw(translate_with_youdao);

  5. my $need_translate_str = 'You can find the answers to these exercises in ( Answers for Chapter 16 ) on page 345.';
  6. #$need_translate_str = 'We';
  7. say translate_with_youdao($need_translate_str);
复制代码
模块保存在 Translate/Youdao.pm 中:
Youdao.rar (1.1 KB, 下载次数: 17)

内容如下:
  1. package Translate::Youdao;

  2. use Exporter;
  3. our @ISA = qw(Exporter);
  4. our @EXPORT_OK = qw(translate_with_youdao);

  5. use 5.014;
  6. use YAML qw(Dump);
  7. use WebService::Simple;
  8. use utf8;

  9. my $service = WebService::Simple->new(
  10.   base_url        => 'http://fanyi.youdao.com/openapi.do',
  11.   param           => {
  12.     keyfrom => 'Songzan',
  13.     key     => '363993902',
  14.     type    => 'data',
  15.     doctype => 'json',
  16.     version => '1.1',
  17.   },
  18.   response_parser => 'JSON',
  19. );

  20. my $error_info = {
  21.   20 => 'text is long than 200 characters',
  22.   30 => 'could not process valid translate',
  23.   40 => 'Could not support this language',
  24.   50 => 'Invalid key',
  25. };

  26. #my $need_translate_str = 'We have used numerous methods throughout this book.';
  27. #$need_translate_str = 'We';
  28. #say translate_with_youdao($need_translate_str);

  29. sub translate {
  30.   my $need_translate_str = shift;
  31.   state $count = 0;
  32.   $count++;
  33.   say "call Youdao API $count times";
  34.   $need_translate_str =~ s/n't / not /g;
  35.   $need_translate_str =~ s/'ll / will /g;
  36.   $need_translate_str =~ s/'re / are /g;
  37.   $need_translate_str =~ s/t's/t is/g;
  38.   if ($need_translate_str =~ /(['"]).*?\1/) {
  39.     LOOP_REPLACE:
  40.     foreach (1 .. 5) {
  41.       $need_translate_str =~ s/['"]/(/;
  42.       my $time = $need_translate_str =~ s/['"]/)/;
  43.       last LOOP_REPLACE if ($time eq '');
  44.     }
  45.   }
  46.   my $res = $service->get( { q => $need_translate_str } );
  47.   my $json = $res->parse_response;
  48.   my $error_code = $json->{errorCode};
  49.   if ($error_code == 0) {
  50.     my $translation = $json->{translation};
  51.     # say ref($translation);
  52.     my @lines = @{$translation};
  53.     my $str = join ' ', @lines;
  54.     # sleep(4);
  55.     return $str;
  56.   }
  57.   else {
  58.     say 'Warning!' . $error_info->{$error_code};
  59.     return 0;
  60.   }
  61. }

  62. sub translate_with_youdao {
  63.   my $en_str = shift;
  64.   if (length($en_str) < 199) {
  65.     return translate($en_str);
  66.   }
  67.   my @str_list = split /\h?\.\h/, $en_str;
  68.   my @cn_str_list = ();
  69.   foreach my $str (@str_list) {
  70.     if (length($str) < 199) {
  71.       # push @all_lines, "$line_number:$file";
  72.       push @cn_str_list, translate($str);
  73.     }
  74.     else {
  75.       my @sub_str_list = split /\h?[,\?]\h/, $str;
  76.       my @sub_cn_str_list = ();
  77.       foreach my $sub_str (@sub_str_list) {
  78.         if (length($sub_str) > 199) {
  79.           say "Length exceed 200 characters:";
  80.           say "<$sub_str>";
  81.           next;
  82.         }
  83.         push @sub_cn_str_list, translate($sub_str);
  84.       }
  85.       push @cn_str_list, @sub_cn_str_list;
  86.     }
  87.   }
  88.   my $cn_str = join ' ', @cn_str_list;
  89.   return $cn_str;
  90. }

  91. 1;
复制代码

评分

参与人数 1可用积分 +6 收起 理由
兰花仙子 + 6 鼓励原创

查看全部评分

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
2 [报告]
发表于 2013-03-27 11:32 |只看该作者
支持楼主 {:3_200:}

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
3 [报告]
发表于 2013-03-27 11:43 |只看该作者
学习了

论坛徽章:
0
4 [报告]
发表于 2013-10-29 07:48 |只看该作者
支持!学习!谢谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP