那是什么语言?我如何识别未知文本
我在公寓里发现了一张用我看不懂的语言写的便利贴。从一个谜题开始,变成了一个识别我在网上遇到的任何文本的实用系统。
几年前,我发现一张便利贴贴在我桌子下面。是手写的,用的是一种我看不懂的文字——曲线优雅流转,看起来完全不像拉丁字母。我完全不知道是什么语言。我问了室友。没人知道。它在那里贴了几个月,这个贴在我工作区的小谜团。
最终我通过把照片上传到一个在线论坛解决了。是藏文。某个前租客留下了一个祝福。但这次经历在我心中种下了一颗种子:每当我遇到一种我不认识的语言时,我想要立即识别它。
如今我有一个相当可靠的系统来判断任何一段文字是什么语言,它从最简单的、大多数人都忽视的工具开始:Unicode 字符范围。
世界上每种文字都在 Unicode 代码点中有指定的区块。西里尔文字在 U+0400 到 U+04FF。阿拉伯文在 U+0600 到 U+06FF。韩文在 U+AC00 到 U+D7AF。如果你把一个陌生字符复制到 Unicode 查询工具中——有几个不错的——你可以立即看到它属于哪个文字区块。这大大缩小了范围。
一旦你知道文字,你通常可以猜测语言。西里尔文可能是俄语、乌克兰语、保加利亚语、塞尔维亚语或几十种其他语言。阿拉伯文可能是阿拉伯语、波斯语、乌尔都语或普什图语。下一步是寻找常见词。这就是语言代码变得有用的地方。
语言代码是由 ISO 639 标准定义的两位和三位字母标识符。"en" 是英语、"fr" 是法语、"ja" 是日语。浏览器在 lang 属性中使用它们。API 在 Accept-Language 头部中使用它们。知道它们可以帮助你更有效地使用翻译和检测工具。如果你告诉 Google 翻译用 "auto" 检测,它通常有效,但先指定文字会给它巨大的起点优势。
我记着一个最常被混淆的文字的心理地图。印地语和尼泊尔语都使用天城文。区别在于常见词和附加符号。泰语和老挝语在外行人看来相似但使用不同的声调标记。诀窍不在于学会每一种文字——那需要数年——而是学会如何用参考图表快速区分它们。
对于像我的桌面便条这样的实体文字,我使用视觉模式匹配和在线社区的组合。手机拍照、快速裁剪、发布到语言识别 subreddit。我通常在一小时内得到答案。
对于数字文本,我写了一个小的 bookmarklet,高亮页面上的所有文字区块,并显示每种检测到的语言的 ISO 639-1 代码。它不完美,但很快。当我打开一个用我不认识的语言写的页面时,在我决定是否要打开翻译器之前,我就能识别它。
那个藏文便条在我识别出来之后很久还贴在桌上。它不再是一个谜题,而成了一个纪念品。现在有人来问它上面写的是什么时,我可以告诉他们整个故事。