背景
每逢佳节胖十斤,虽然清明节不是一个佳节,但对于城市繁忙工作的节奏,清明也算得上一个小长假。很多人在这个节日除了回乡扫墓之外,免不了聚餐吃喝,毕竟关于吃,咱们可从不将就。
在中国的有一些餐馆,菜单上不仅有个中文名,还有英文名,有很专业的翻译,也有让人笑Cry的翻译。配上几张图感受一下。
1、Husband and Wife Lung Slice
丈夫和妻子的肺切片?老外看到心里怕是WTF?
Python学习交流群:1004391443
2、Keeping the baby
这个餐厅难道有袭击儿童事件吗?先护送孩子离开?
本文主题
不慌,作为一名Python程序猿,岂会被这种问题难倒,接下来分享一款来之辽宁抚顺的Python爱好者编写的一个菜谱汉英译名查询程序。
翻译个夫妻肺片感受下。
是不是很想知道怎么做的?,分享代码如下(请忽略作者面向过程的写法,各路小伙伴可自行优化):
#!/usr/bin/python3.7# -*- coding: utf-8 -*-# Compiled by Tony96163'''简单的菜谱汉英译名查询程序菜谱语料文件menu_cn_en_dict.txt,采自北京市人民政府外事办公室《中文菜单英文译法(2007)》程序作者:Tony96163'''import jiebaimport logging #关闭jieba的debug日志输出jieba.setLogLevel(logging.INFO) def menu_translator(): #读取双语词典文件,返回双语词典及双语分词词典 def get_menu_dict(): bi_dict={} #双语词典 bi_pair_dict={} #双语分词词典 with open("H:/BaiduNetdiskDownload/python_for_all/menu_tr_demo/data/menu_cn_en_dict.txt","rt",encoding="utf-8-sig") as f: line=f.readlines() #按tab键切分文本为中文词,英文词两部分 w_pair=[wd.replace("\n","").split("\t") for wd in line] #按tab键切分文本为中文词,英文词两部分,并对中文词部分进行切分 #切词时务必使用lcut形式直接生成列表 w_seg_pair=[(jieba.lcut(wd.replace("\n","").split("\t")[0]),wd.replace("\n","").split("\t")[1]) for wd in line] #生成词典 for c_w, e_w in w_pair: bi_dict[c_w]=e_w for c_w_list,e_w in w_seg_pair: #将中文词列表以空格为联接方式,合成字符串 bi_pair_dict[" ".join(c_w_list)]=e_w return bi_dict,bi_pair_dict #获取用户输入 def get_user_input(): print("请输入要翻译的中文食品名\n若想退出,请输入空格、'q'或'退出'\n") return (input('中文食品名:')) #获取英译词 def get_transation(cn_word): #读双语词典及双语分词词典 menu_dict,menu_seg_dict=get_menu_dict() #直接输出有既定辞条的英译文 if cn_word in menu_dict.keys(): print(f"英文食品名:{menu_dict[cn_word]}") else: #判断用户输入词汇是否存在于汉语词汇分词列表当中,如果有,返回相应英译名,进行推荐 result=[] for key,value in menu_seg_dict.items(): #对中文词汇以空格进行切分,形成列表 if cn_word in key.split(): #将中文词汇列表重新拼接在一起,去除空格并返回,同时返回相应的英译文 result.append(("".join(key.split()),menu_seg_dict[key])) else: pass if result != []: print(f"\n很抱歉,语料库中尚不存在'{cn_word}'的单独辞条。") print(f"为您找到类似的{len(result)}个食品名,仅供参考:\n") for (key,value) in result: print(key+"\t"+value) #其他情况 else: print(f"\n很抱歉,'未能找到{cn_word}'的译文。") print('\n----------这是分界线----------\n') #获取用户输入 s=get_user_input() #设定程序退出条件 while s not in ' qQQ退出': #执行主函数 get_transation(s) #等待用户的下一轮输入 s=get_user_input() if __name__=='__main__': #启动程序 menu_translator()
最终效果
目前这款中英菜谱译名小程序功能还比较简单,需要完善,比如得做个靠谱的jieba自定义词库,正确切分菜名,赋码,最后借相似度实现未入库菜名智能推荐,最理想的是机器学习菜名组合,直接按组合译出新菜名。
后记
本文由ISO团队发布,创作内容包含Python、数据分析、机器学习等知识圈。