{"id":17967954,"url":"https://github.com/rimochan/not_translator","last_synced_at":"2025-03-25T08:31:34.673Z","repository":{"id":47122170,"uuid":"466332846","full_name":"RimoChan/not_translator","owner":"RimoChan","description":"【not translator】不会翻译机！","archived":false,"fork":false,"pushed_at":"2022-03-05T15:36:58.000Z","size":1250,"stargazers_count":118,"open_issues_count":4,"forks_count":3,"subscribers_count":3,"default_branch":"slave","last_synced_at":"2025-03-19T23:53:25.881Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RimoChan.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-05T02:57:26.000Z","updated_at":"2025-03-17T11:01:48.000Z","dependencies_parsed_at":"2022-07-20T18:32:23.259Z","dependency_job_id":null,"html_url":"https://github.com/RimoChan/not_translator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimoChan%2Fnot_translator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimoChan%2Fnot_translator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimoChan%2Fnot_translator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RimoChan%2Fnot_translator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RimoChan","download_url":"https://codeload.github.com/RimoChan/not_translator/tar.gz/refs/heads/slave","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245426306,"owners_count":20613328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-29T14:10:12.894Z","updated_at":"2025-03-25T08:31:33.979Z","avatar_url":"https://github.com/RimoChan.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 【not translator】不会翻译机！\n\n英语太难了，孩子学不会，怎么办？\n\n还好，聪明的莉沫酱发明了不会翻译机！它可以把世界上所有的语言都翻译成中文！\n\n- 优点\n    + 不依赖第三方库，可以轻松移植到网页和手机上\n    + 无需网络，防止资本主义的走狗偷窥你的隐私\n    + 速度快，推理时间复杂度好像是`O(n)`的\u003csub\u003e(我也不确定)\u003c/sub\u003e\n    + 体积小，节省硬盘空间\n\n- 缺点\n    + 是音译\n\n\n## 使用效果\n\n我们先来翻译国家的名字吧！\n\n```\nAmerica \n```\n```\n啊吗啦咖\n```\n\n看起来效果不错，我翻译的比美利坚好嘛！\n\n\u003cbr/\u003e\n\n再试试俄国/德国/波兰——\n\n```\nRussia, Deutsch and Poland.\n```\n```\n啦下, 多一起 俺得 伯懒得.\n```\n\n发音非常标准！\n\n\u003cbr/\u003e\n\n好，接下来我们来翻译一些名言，先从长颈鹿开始，因为「长颈鹿是无情的动物」——\n```\nGiraffes are heartless creatures.\n```\n```\n樵夫丝 二 哈特啦丝 苛礼条丝.\n```\n\n\u003cbr/\u003e\n\n还有「信任他人很好，但是不信任更好」——\n```\nIt is good to trust others, but, not to do so is much better.\n```\n```\n一得 乙巳 歌舞得 度 得啦丝特 俄饿死, 八得, 娜得 度 度 所 乙巳 吗七 八得.\n```\n\n\n## 原理\n\n其实原理非常简单。因为中文是拼音拼出来的，而英文是音标拼出来的，所以只要找到它们之间的对应关系，就可以把英文翻译成中文啦。\n\n### 机器学习\n\n举个例子，兰斯(lance)，英语读作`/ˈɫæns/`，中文读作`lansi`。那很显然，我们只要把`ɫ`变成`l`，`æ`变成`a`，`s`变成`si`，就好了嘛！\n\n但是这个规则往往不是那么靠谱，比如`s`显然不能都变成`si`，至少是`s`在结尾的时候才能变成`si`。以及前面的什么情况下`ɫ`变成`l`，`æ`变成`a`，也不是很好确定，所以我想，可以用机器学习来解决这个问题。\n\n于是我收集了1300个英文人名，以及它们对应的音译，让机器从其中学习转换的规则。\n\n我们学习的目标是得到一串转换规则，每个规则即`str.replace(a, b)`中的两个参数。\n\n代价函数是读音经过转换后与目标的编辑距离。\n\n那么，显然有一个非常简单的思路——就随机从英文读音中挑一个子串`a`，随机从中文读音中挑一个子串`b`，然后所有读音全部`s = s.replace(a, b)`。如果这样使代价降低了，就把这个规则保存下来，如果没有降低，就把replace操作回滚。\n\n这样理论上是可行的，但是实际效果很差，因为收敛太慢了。\n\n接下来我把它适当地改进一下: \n\n还记得我们现在的每个人名都是一个对\u003csub\u003e(pair)\u003c/sub\u003e，对吧。那现在我们让每个人名随机从它自己中挑出子串`a`和`b`，如果它自己`replace(a, b)`会让它自己的代价降低，它就会把`(a, b)`提交给议会。\n\n每个人都提交之后，议会将最多的`(a, b)`作为这一轮的规则，把所有读音全部`s = s.replace(a, b)`。如果代价降低了，就把这个规则保存下来，如果没有降低，就把replace操作回滚，同时，直到下一个规则通过之前，不再考虑这一轮所用的规则。\n\n嗯对，就这么简单。然后把这个代码放在宿舍里跑半天，你就可以得到一组不错的规则了。\n\n\n### 动态规划\n\n接下来，我们根据得到的规则把音标变成拼音了之后，如何把拼音还原回汉字呢？\n\n只需要用一个简单的`O(n)`DP——\n\n我们的目标是把一组拼音尽可能地变成汉字，也就是说，我们的目标是尽可能把拼音一字不剩地用完。\n\n因此我们以当进行到第`i`个位置时，无法被消耗掉的拼音为代价，可以写出这样的转移方程——\n\n```\n代价[i] = min([代价[j] + f(s[j:i]) for j in range(i-k, i)])\n```\n\n其中函数`f`定义为，如果子串`s`是一个合法的拼音，返回`0`，否则返回`len(s)`。`k`为最长的拼音的长度，如果长度超过`k`，那么`s[j:i]`显然不合法。\n\n好，就是这样，最后把方程跑过一遍，就可以把拼音还原回汉字了。\n\n\n## 使用方法\n\n首先你需要有一个Python3.7以上版本，然后把这个仓库clone回去，再`from not_translator import translate`，就行了。\n\n\u003csub\u003e好累啊我先休息一会，等下发pip包吧\u003c/sub\u003e\n\n接口是这样的——\n\n```python\ndef translate(s: str) -\u003e str: ...\n```\n\n## 结束\n\n好，我回去睡觉了，大家88！\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frimochan%2Fnot_translator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frimochan%2Fnot_translator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frimochan%2Fnot_translator/lists"}