中文简繁体互转时的语义识别AI

中文简繁体互转时,使用直译很简单,Delphi中使用LCMapStringW这个API。

但是如果要追求完美,考虑两岸用词习惯,就需要考虑“语义”,有两种情况:

(1)字还是基本是那个字,只是写法不同。如:

  • 周期 - 週期

  • 周杰伦 - 周傑倫

(2)字都变了。如:

  • 文件 - 檔案
  • 程序 - 程式

周和週:◎ “周”作姓、朝代时,繁体也为“周”,与简体同形。◎ 圈子、周围、周到、星期的“周”繁体为“週”。◎ 周chou(賙),接济。

语义就要涉及上下文分析,有点AI在里面,就不那么容易了。

微软Word和金山WPS的“中文简繁体”转换都不是简单的直译,有加AI。

百度的在线翻译也有加AI。(不过“下周期末考试”和“这周期末考试”翻译结果不同,可能训练素材不全)

调用百度翻译API,需要先去这里申请开通:http://api.fanyi.baidu.com/

Delphi中调用百度翻译API,如下:

function TranslateWordByHttp(AFromLanguage,AToLanguage:PacroCultureInfo;AText:WideString):WideString;
var
  vParam:TStringList;
  vMS:TMemoryStream;
  S:Ansistring;
  WS:WideString;
  vHTTP:TIdHTTP;
  MD5: TIdHashMessageDigest5;
  vResult:TJSONObject;
  vR:TJSONArray;
begin
  Result:='';
  vParam:=TStringList.Create;
  vMS:=TMemoryStream.Create;
  vHTTP:=TIdHttp.Create(nil);
  try
    vParam.Values['appid']:=C_appid;
    vParam.Values['from']:=AFromLanguage^.BaiDu_Abbreviate;
    vParam.Values['to']:=AToLanguage^.BaiDu_Abbreviate;
    vParam.Values['q']:=AText;
    vParam.Values['salt']:=InttoStr(Random(32768));
    //vParam.Values['dict']:='1';

    //拼接appid+q+salt+密钥:
    //S:=vParam.Values['appid']+S+vParam.Values['salt']+C_secret;
    S:=C_appid;
    vMS.Write(S[1],Length(S));
    //按要求,必须UTF8,Delphi下S必须定义为AnsiString
    S:=UTF8Encode(AText);
    vMS.Write(S[1],Length(S));
    S:=vParam.Values['salt'];
    vMS.Write(S[1],Length(S));
    S:=C_secret;
    vMS.Write(S[1],Length(S));

    MD5 := TIdHashMessageDigest5.Create;
    vMS.Position:=0;
    //不能用HashStringAsHex,因为它定义的string其实是widestring,utf8隐含会又被转成unicode
    vParam.Values['sign']:=MD5.HashStreamAsHex(vMS).ToLower();
    MD5.Free;

    vMS.Clear;
    vHTTP.Request.ContentType:='application/x-www-form-urlencoded';
    vHTTP.Post('http://api.fanyi.baidu.com/api/trans/vip/translate',vParam,vMS);
    Setlength(S,vMS.Size);
    Move(vMS.Memory^,S[1],vMS.Size);
    //不需要转码
    //WS:=UTF8Decode(S);
    //得到内容字串:
    //'{"from":"zh","to":"cht","trans_result":[{"src":"\u8d44\u672c\u4e3b\u4e49","dst":"\u8cc7\u672c\u4e3b\u7fa9"}]}'
    vResult:=TJSONObject(TJSONObject.ParseJSONValue(S));
    try
      if vResult.Values['error_code']=nil then
      begin
        vR:=TJSONArray(vResult.Values['trans_result']);
        if vR.Count>0 then
        begin
          //不需要转码
          //WS:=UTF8Decode(S);
          result:=TJSONString(TJSONObject(vR.Items[0]).Values['dst']).Value;
        end;
      end;
    finally
      vResult.Free;
    end;
  finally
    vHttp.Free;
    vMS.Free;
    vParam.Free;
  end;
end;

我测试了结果是OK的,有加入AI功能。

本来想网上找一个词汇对照库,没有找到合适的。

ZhConversion.php内容大概是这样的:

'𪎈' => '䴬',
'𪎉' => '麲',
'𪎊' => '麨',
'𪎋' => '䴴',
'𪎌' => '麳',
'𪚏' => '𪘀',
'𪚐' => '𪘯',
'' => '棡',
'0多只' => '0多隻',
'0天后' => '0天後',
'0只' => '0隻',
'0余' => '0餘',
'1天后' => '1天後',
'1只' => '1隻',
'2天后' => '2天後',
'2只' => '2隻',
'3天后' => '3天後',
'3只' => '3隻',
'4天后' => '4天後',
'4只' => '4隻',
'5天后' => '5天後',
'5只' => '5隻',
'6天后' => '6天後',
'6只' => '6隻',
'7天后' => '7天後',
'7只' => '7隻',
'8天后' => '8天後',
'8只' => '8隻',
'9天后' => '9天後',
'9只' => '9隻',
'〇只' => '〇隻',
'〇余' => '〇餘',
'一干二净' => '一乾二淨',

查找了一下“周期”这个词,没有。放弃。

《简体繁体字对照表全3.csv》内容大概是这样的:

[转换方向]	[添加或修改]	[转换为]	[词性]
简繁双向	计算机	電腦	名词
简繁双向	0出现 	0出現	名词
简繁双向	0出現 	0出現	名词
简繁双向	0出線 	0出線	名词
简繁双向	0出线 	0出線	名词
简繁双向	0只支持 	0只支持	名词
简繁双向	0只支援 	0只支援	名词
简繁双向	0周后 	0周後	名词
简繁双向	0天后 	0天後	名词
简繁双向	0只 	0隻	名词
简繁双向	0余 	0餘	名词
简繁双向	0出 	0齣	名词
简繁双向	1只支持 	1只支持	名词
简繁双向	1只支援 	1只支援	名词
简繁双向	1周后 	1周後	名词
简繁双向	1天后 	1天後	名词
简繁双向	1只 	1隻	名词
简繁双向	1余 	1餘	名词
简繁双向	2只支持 	2只支持	名词
简繁双向	2只支援 	2只支援	名词
简繁双向	2周后 	2周後	名词

也用“周期”查了一下,没有。“1周后”也没翻译成“1週後”,放弃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值