最近做了一些无用功

本来目的是为了解决中文地址翻译成英文地址的问题,结果我发现自己弄出来的程序还不如百度或者谷歌现有的翻译,所以算了吧。

以下是我那拿不上台面的思路

  • 输入地址后,提交到后台,后台使用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
...
//org_str是原始的分词数组
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();
//console.log(obj.org_str);
});
$(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分词学习的相关说明,但是没有仔细的研究。

所以把这个东西放弃了吧。