本来目的是为了解决中文地址翻译成英文地址的问题,结果我发现自己弄出来的程序还不如百度或者谷歌现有的翻译,所以算了吧。
以下是我那拿不上台面的思路
- 输入地址后,提交到后台,后台使用jieba分词,把地址分割;
- 然后前端可以用js控制,调整分词分组;
- 将调整好的分词,发送到后台,使用百度翻译API得到翻译的结果;
- 再把翻译后的结果逆序,就会得到英文的地址。
但是我得到了一些东西
在前端处理分词分组的时候,我用到了以下功能:
- 双击分词可以编辑,重装调整分词,在加入一个空格后,可以把词语分割;
- 拖动分词可以合并分词。
双击编辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| ...
this.setEditable = function(){ var obj = this; $("#add_str>span").dblclick(function () { var index = $(this).data("index"); var f = obj.org_str.splice(0, index + 1); f.pop(); var input = '<input type="text" value="' + $(this).html() + '" style="width: ' + ($(this).width() + 24) + 'px;" />'; $(this).after(input); var that = $($("#add_str>input")[0]); that.blur(function() { var re = that.val().split(' '); var nh = ""; $.each(re, function(k, v) { if(v == ""){ re.splice(k, 1); }else{ nh += '<span data-value="' + v + '" data-index="' + k + '" data-for="add" class="btn btn-primary">' + v + '</span>'; } }); f = f.concat(re); obj.org_str = f.concat(obj.org_str); that.after(nh); that.remove(); obj.setIndex(); obj.setDraggable(); obj.setEditable(); }); $(this).remove(); }); } ...
|
可能是我的办法就是笨了点,但是确实是实现了想要的功能。
设置可拖动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| ... this.setDraggable = function (){ var obj = this; $("#add_str>span").draggable({ axis: "x", opacity: 0.6, containment: "parent", revert: "invalid", stack: "span" }); $("#add_str>span").droppable({ drop: function(event, ui){ var that = ui.helper; var value = that.data("index") < $(this).data("index") ? that.html() + $(this).html() : $(this).html() + that.html(); $(this).html(value); $(this).attr("data-value", value); that.remove(); obj.setDraggable(); }, accept: function(d) { if(d.data("index") == $(this).prev().data("index") || d.data("index") == $(this).next().data("index")){ return true; }else{ return false; } } }); } ...
|
设置分词可拖动,拖动释放即合并。
有一个问题,拖动释放的时候,有一个可接收的元素,比如不能把第3个分词直接拖到了第7个分词,理论上是不允许合并的,合并后就不通顺了,第3个分词拖动的时候只有相邻的两个分词可以接收(合并)。
所以需要设置可接收释放的条件,如果不可接收分词就弹回原位置。
调用百度翻译接口
也把这个放上来吧,虽然没啥用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| ... def BaiduTranslate(request): appid = '来自百度后台' secretKey = '来自百度后台' q = str(request.POST.get('key')) httpClient = None; myurl = '/api/trans/vip/translate' fromLang = request.POST.get('from') toLang = request.POST.get('to') salt = random.randint(12306, 18060)
sign = appid+q+str(salt)+secretKey md5_data = hashlib.md5() md5_data.update(sign) sign = md5_data.hexdigest() myurl = myurl+'?appid='+appid+'&q='+urllib.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
try: httpClient = httplib.HTTPConnection('api.fanyi.baidu.com') httpClient.request('GET', myurl)
response = httpClient.getresponse() result = {'d': response.read()} except Exception, e: result = {'error': 1002, 'd': str(e)} finally: if httpClient: httpClient.close() md5data = {'o': appid+q+str(salt)+secretKey, 'r': sign} return HttpResponse(json.dumps(result)) ...
|
以上是百度官方给出的代码,我只是简单的修改了一下。
后记
其实jieba分词每次都不能很好的切割中文,几乎每次都需要手动去调整。这是一个很大的局限。
如果想要省事的话,最好是把这个系统做成可学习的。
也就是说,相同格式的地址,我只需要手动去调整前几次,然后系统会记住我的分词规律,以后会自动的把新的地址按我的规律去分割。
但是这样的话,就会需要大量的代码了吧。
网上找了些资料,有提到jieba分词学习的相关说明,但是没有仔细的研究。
所以把这个东西放弃了吧。