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

Rough Unicode -> Language Code without CLDR?

本文关键字:没有 CLDR 语言 代码 Unicode      更新时间:2023-09-26

我正在编写一个字典应用程序。如果用户键入 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 字符串语言代码吗?

但就我而言

  • 查找大型字符映射数据库似乎会花费大量存储空间和内存
  • 调用 API 的速度太慢,此外还需要网络连接
  • 不需要非常准确。 只有大约 80% 的正确率是可以接受
  • 简单快捷是主要要求
  • 只覆盖 UCS2 BMP 字符是可以的。

有什么提示吗?

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

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

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

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

如果语言数量相对较少(或者您关心的数量相当少),则可以对每种语言使用 Bloom 过滤器。布隆过滤器允许您执行非常便宜的成员资格测试(可能会有误报),而无需将所有成员(在本例中为代码点)存储在内存中。然后,通过根据每种语言的预构造筛选器检查代码点来生成结果集。它是可调整的 - 如果收到太多误报,则可以使用更大大小的筛选器,但会牺牲内存。

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

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

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

您想考虑多少种语言?