本来目的是为了解决中文地址翻译成英文地址的问题,结果我发现自己弄出来的程序还不如百度或者谷歌现有的翻译,所以算了吧。
以下是我那拿不上台面的思路
- 输入地址后,提交到后台,后台使用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分词学习的相关说明,但是没有仔细的研究。
所以把这个东西放弃了吧。