googlei18n / myanmar-tools
使用马尔可夫模型(机器学习)的Zawgyi和Unicode字体检测器
Requires
- php: >=7.0
- ext-intl: *
Requires (Dev)
- phpunit/phpunit: ^6
This package is not auto-updated.
Last update: 2024-09-19 01:33:08 UTC
README
本项目包括处理缅甸使用的字体编码的工具,目前支持广泛使用的Zawgyi-One字体编码。有关缅甸字体编码的更多信息,请阅读Unicode缅甸FAQ。
非官方演示
功能
- 检测字符串是否为Zawgyi或Unicode。
- 支持C++, Java, JavaScript(Node.js和浏览器),PHP,Ruby,Dart和C#
- 将字符串从Zawgyi转换为Unicode或从Unicode转换为Zawgyi
- 支持Java和JavaScript
在没有通过缅甸工具支持的语言中,也可以通过ICU进行转换;请参阅下面的“Zawgyi到Unicode转换”。
这不是一个官方的Google产品,但我们希望您会发现Myanmar Tools对更好地支持缅甸语言有用。
为什么是Myanmar Tools?
Myanmar Tools使用机器学习模型,在检测Zawgyi与Unicode时提供非常准确的结果。使用手工编码规则进行检测的检测器容易将其他语言(如Shan和Mon)的内容错误地标记为Zawgyi。
Myanmar Tools和CLDR Zawgyi转换规则被Google、Facebook等公司使用,为缅甸用户提供了良好的体验。
使用Zawgyi检测器
查看特定语言的文档
根据您的编程语言,典型的用例可能如下所示
if (zawgyiDetector.getZawgyiProbability(input) > THRESHOLD) { // Convert to Unicode, etc. }
方法getZawgyiProbability
返回一个介于0和1之间的数字,表示字符串是Zawgyi的概率,前提是它是Zawgyi或Unicode。对于足够长的字符串,检测器应该返回一个非常接近0或1的数字,但对于只有几个字符的字符串,数字可能更接近中间。考虑到这一点,使用以下启发式方法设置THRESHOLD
- 如果低估Zawgyi是坏事(例如,当人类需要评估结果时),设置一个低阈值,如
0.05
。这个阈值确保不到1%的Zawgyi字符串将未被检测到。 - 如果高估Zawgyi是坏事(例如,转换将自动进行),设置一个高阈值,如
0.95
。这个阈值确保不到1%的Unicode字符串将被错误标记。
此外,请注意,您可能需要根据您的输入数据中的字符串分布调整您的阈值。例如,如果您的输入数据偏向Unicode,为了减少误报,您可能希望设置比您的输入数据偏向Zawgyi更高的Zawgyi阈值。最终,选择阈值的最佳方法是获取一组代表检测器将要处理的数据的标记字符串,计算它们的分数,并将阈值调整到您所需的精确度和召回率比率。
如果字符串包含非缅甸词缀,它将获得与删除词缀相同的Zawgyi概率。即,getZawgyiProbability("hello <burmese> world")
== getZawgyiProbability("<burmese>")
。
某些字符串在U和Z中是相同的;如果字符串主要由辅音组成,而元音的变音符号很少,这种情况就会发生。检测器可能会为这样的字符串返回任何值。如果用户对此情况感到担忧,他们可以简单地运行字符串通过转换器,并检查转换器的输出是否等于转换器的输入。
模型训练
Zawgyi检测器使用的模型已在互联网上多个网站的数据上进行过训练。数据是通过使用Corpus Crawler工具获得的。
要重新训练模型,首先在本地运行Corpus Crawler。例如
$ mkdir ~/corpuscrawler_output && cd ~/corpuscrawler_output $ corpuscrawler --language my --output . & $ corpuscrawler --language my-t-d0-zawgyi --output . & $ corpuscrawler --language shn --output . & $ corpuscrawler --language mnw --output . & $ corpuscrawler --language kar --output . & $ corpuscrawler --language pi-Mymr --output . &
这需要很长时间,可能是几天。你让它运行的时间越长,你的模型就越好。请注意,至少,你必须确保你已经获得了Unicode和Zawgyi的数据;目录应包含上述命令中列出的六种语言的文件。
一旦你有可用数据,通过在目录中运行以下命令来训练模型
$ make train CORPUS=$HOME/corpuscrawler_output
Zawgyi到Unicode转换
一旦确定了一段文本是Unicode还是Zawgyi,通常很有用将其从一种编码转换为另一种编码。
此软件包支持Java和JavaScript的转换。规则与在通用区域数据仓库(CLDR)中发布的转写规则相同。因此,在其他语言中,转换功能可在ICU中使用。版本58+已内置该功能,转换ID为"Zawgyi-my"
- Java: ICU4J Transliterator
- C++: ICU4C Transliterator
许多其他语言,包括Python、Ruby和PHP,都有ICU4C的包装库,这意味着你也可以在这些语言中使用Zawgyi转换器。请参阅示例目录以获取使用ICU Transliterator的示例。
贡献新的编程语言支持
我们将愉快地考虑添加其他编程语言客户端的pull请求。要添加对新编程语言的支持,以下是一些建议
- 在
clients
下面添加一个新目录。这将是你的新包的根目录。 - 使用你语言的传统构建系统。
- 将你的语言添加到顶级Makefile中的
copy-resources
和test
规则。 - 至少,你的包应自动消耗
zawgyiUnicodeModel.dat
并针对compatibility.tsv
进行测试。 - 转换器的实现应使用提供资源对Z<->U方向进行兼容性测试。
- 请参阅其他客户端以获取示例。大多数客户端只有几百行代码。
- 完成后,将你的客户端添加到.travis.yml文件中。