粗糙的Unicode - >没有CLDR的语言代码?

时间:2013-02-01 08:52:31

标签: javascript python unicode cldr

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

e.g。

字 - 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 - can I detect unicode string language code?

但在我的情况下

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

任何提示?

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

2 个答案:

答案 0 :(得分:2)

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

由于共享符号的数量,可靠地确定字形的父语言肯定更复杂。如果您只需要80%的准确率,则可以调整某些语言的范围,以便在简化范围时有意包含/遗漏某些字符。

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

答案 1 :(得分:1)

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

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

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

进行更多阅读,如果您只需要BMP(65,536个代码点),您可以为每种语言存储一个直接位。或者是用于语言X代码点的2D bitarray

您想考虑多少种语言?