1

我正在写一个字典应用程序。如果用户键入 Unicode 字符,我想检查该字符是哪种语言。

例如

字 - returns ['zh', 'ja', 'ko'] 
العربية - returns ['ar']
a - returns ['en', 'fr', 'de'] //and many more
й - returns ['ru', 'be', 'bg', 'uk']

我搜了一下发现可以用CLDR https://stackoverflow.com/a/6445024/41948

或 Google API Python - 我可以检测 unicode 字符串语言代码吗?

但就我而言

  • 查找大型charmap db 似乎需要大量存储和内存
  • 调用 API 太慢,而且需要网络连接
  • 不需要非常准确。只有大约 80% 的正确率是可以接受的
  • 简单快速是主要要求
  • 只覆盖 UCS2 BMP 字符是可以的。

有小费吗?

我需要在 Python 和 Javascript 中使用它。谢谢!

4

2 回答 2

3

将字形缩小到语言家族就足够了吗?如果是这样,您可以基于 BMP 的映射创建一组范围(语言 -> 代码范围),例如http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane或脚本部分中显示的范围Unicode 图表页面 - http://www.unicode.org/charts/

由于共享符号的数量,可靠地确定字形的父语言肯定更加复杂。如果您只需要 80% 的准确度,您可能会调整某些语言的范围,以便在简化范围的情况下有意包含/省略某些字符。

编辑:我重新阅读了您引用 CLDR 的问题以及关于代码 - > 语言映射的第一个答案。我认为这绝对是不可能的,但如果计算成本有点高,反过来似乎也是可行的。通过巧妙的数据结构,您可以识别语言系列,然后从那里深入到实际的语言范围,减少通过不相关语言 -> 范围对的遍历。

于 2013-02-01T09:27:23.907 回答
1

如果语言的数量相对较少(或者您关心的数量相当少),您可以为每种语言使用 Bloom 过滤器。布隆过滤器让您可以进行非常便宜的成员资格测试(可能会出现误报),而无需将所有成员(在本例中为代码点)存储在内存中。然后,通过针对每种语言的预构建过滤器检查代码点来构建结果集。它是可调的——如果你得到太多误报,你可以使用更大尺寸的过滤器,但会消耗内存。

有 Python 和 Javascript 的布隆过滤器实现。(嘿 - 我见过做这个的人!http://www.jasondavies.com/bloomfilter/

布隆过滤器:http ://en.m.wikipedia.org/wiki/Bloom_filter

多读一点,如果您只需要 BMP(65,536 个代码点),您可以为每种语言存储一个直接位集。或用于语言 X 代码点的 2D位数组。

你想考虑多少种语言?

于 2013-02-01T09:25:27.770 回答