uroman
uroman是一个通用罗马化转写器。它可以将任何文字系统的文本转换为标准拉丁字母。
例如(希腊语):Νεπάλ → Nepal
例如(印地语):नेपाल → nepaal
例如(乌尔都语):نیپال → nypal
例如(中文):三万一 → 31000
- uroman使得在不需要复杂的中间音标表示的情况下,能够对来自不同文字系统的文本应用字符串相似度度量。
- uroman可以将各种文字系统中的数字转换为西方阿拉伯数字。
- uroman使用多对多字符映射、上下文和用户提供的语言代码(可选),即uroman不只是简单地一对一替换字符。
- uroman要求所有输入都使用UTF-8编码。
最新Python版本:1.3.1.1(2024年6月27日发布)
最后一个Perl版本:1.2.8(2021年4月23日发布)
作者:Ulf Hermjakob,南加州大学信息科学研究所
快速链接(本文档内):uroman命令行界面,导入uroman,旧版Perl版本,更新历史,可逆性,局限性
(新)Python版本
安装
python3 -m pip install uroman
命令行界面(CLI)
示例
python3 -m uroman "Игорь Стравинский"
python3 -m uroman Игорь -l ukr
python3 -m uroman Ντέιβις Καπ -l ell
python3 -m uroman "\u03C0\u03B9" -d
python3 -m uroman -l hin -i mini-test/hin.txt
python3 -m uroman -l fas -i mini-test/fas.txt -o mini-test/fas-rom.jsonl -f edges
python3 -m uroman < mini-test/multi-script.txt > mini-test/multi-script.uroman.txt
python3 -m uroman -h
注意:对单个字符串使用_uroman_命令行界面可能对简单测试有用,但在大规模使用时效率低下,因为每次都需要加载数据资源。对整个文件进行罗马化或在Python内部使用_uroman_(如下所示)会更有效率。
注意:_mini-test_目录包含在本版本中。使用命令 python3 -m uroman x --verbose
可以找到它。
您可以将输出的mini-test/multi-script.uroman.txt与参考输出mini-test/multi-script.uroman-ref.txt进行比较。
uroman.py 参数结构要点
直接输入(零个或多个) | 如上面的'Игорь Стравинский'和'Ντέιβις'。 |
-l --lcode | 语言代码,根据ISO-639-3标准,例如-l ukr表示乌克兰语,-l hin表示印地语,-l fas表示波斯语 |
-i --input_filename | 替代选项:stdin 注意:如果同时给出直接输入和input_filename,直接输入的罗马化结果将写入stderr。 |
-o | 替代选项:stdout |
-f --rom_format | 输出格式选项:
|
-d --decode_unicode | 解码Unicode转义序列,如将'\u03C0\u03B9'解码为'πι',然后再罗马化为'pi'。这对于JSON等输入格式很有用。 |
-h --help | 使用此选项查看包含所有选项的完整参数结构。 |
在Python内部使用_uroman_
示例
import uroman as ur
uroman = ur.Uroman() # 加载uroman数据(大约需要一秒左右)
print(uroman.romanize_string('Игорь Стравинский'))
print(uroman.romanize_string('Игорь', lcode='ukr'))
uroman.romanize_file(input_filename='mini-test/multi-script.txt',
output_filename='mini-test/multi-script.uroman.jsonl',
rom_format=ur.RomFormat.LATTICE)
方法
uroman = ur.Uroman(data_dir)
这个构造方法加载不同语言罗马化所需的数据。 这个构造方法调用可能需要大约一秒(实际时间)来加载所有罗马化数据,但对于多次后续罗马化调用来说,只需要执行一次。
data_dir | 数据目录(可选,默认:标准uroman数据目录) |
uroman.romanize_string(s, lcode, rom_format)
这个方法接受一个字符串s,并根据rom_format返回其罗马化形式:一个字符串(默认)或一个边缘列表。
s | 要被罗马化的字符串,例如 "ایران" |
lcode | 语言代码,可选,3个字母的代码,如英语的'eng'(ISO-639-3) |
rom_format | 输出格式选项:
|
uroman.romanize_file(input_filename, output_filename, lcode)
此方法将文件 input_filename 罗马化到 output_filename。
input_filename | 默认:标准输入 (当input_filename值为 None 时) |
output_filename | 默认:标准输出 (当output_filename值为 None 时) |
lcode | 语言代码(可选),3个字母的代码,如英语的'eng'(ISO-639-3) |
旧版Perl版本
GitHub上包含旧版Perl版本,但PyPI上不包含。
使用方法
$ uroman.pl [-l <lang-code>] [--chart] [--no-cache] < STDIN
其中可选的 <lang-code> 是3个字母的语言代码,例如 ara, bel, bul, deu, ell, eng, fas,
grc, ell, eng, heb, kaz, kir, lav, lit, mkd, mkd2, oss, pnt, pus, rus, srp, srp2, tur, uig, ukr, yid。
--chart 指定图表输出(JSON格式)以表示替代的罗马化。
--no-cache 禁用缓存。
示例
注:目录 text 和 test 位于GitHub上 uroman 的根目录下。
uroman.pl < text/zho.txt
uroman.pl -l tur < text/tur.txt
uroman.pl -l heb --chart < text/heb.txt
uroman.pl < test/multi-script.txt > test/multi-script.uroman-perl.txt
将输入识别为阿拉伯语、白俄罗斯语、保加利亚语、英语、德语、古希腊语、现代希腊语、本都希腊语、希伯来语、哈萨克语、吉尔吉斯语、拉脱维亚语、立陶宛语、马其顿语、奥塞梯语、波斯语、俄语、塞尔维亚语、土耳其语、乌克兰语、维吾尔语或意第绪语将改善这些语言的罗马化,因为这些语言中的一些字母与使用相同文字的其他语言(阿拉伯语与波斯语、俄语与乌克兰语、希伯来语与意第绪语)具有不同的音值。 此版本对其他语言无影响。
参考文献
Ulf Hermjakob, Jonathan May, and Kevin Knight. 2018. Out-of-the-box universal romanization tool uroman. In Proceedings of the 56th Annual Meeting of Association for Computational Linguistics, Demo Track. ACL-2018 Best Demo Paper Award. ACL文集中的论文 | 海报 | BibTex
变更历史
版本1.3.1的变更
- 增加了Python版本。
- 初步专门支持科普特语(埃及);显著改进了对泰语的支持;改进了对高棉语、藏语和几种印度语言的支持,包括更好的最终schwa删除。
- 中文分数和百分比。
- 各种小改进。
版本1.2.8的变更
- 更新至Unicode 13.0(2021年),支持几种新的脚本(UnicodeData.txt增大10%)。
- 改进了对格鲁吉亚语的支持。
- 保留各种符号(而不是映射到符号的名称)。
- 各种小改进。
版本1.2.7的变更
- 改进了对普什图语的支持。
版本1.2.6的变更
- 改进了对乌克兰语、俄语和奥甘文(古爱尔兰文字)的支持。
- 增加了对英语盲文的支持。
- 为马其顿语和塞尔维亚语(mkd2/srp2)添加了替代罗马化,反映了这些语言的许多母语使用者在用拉丁字母书写文本时采用的随意风格,例如使用非重音单字母(如"s")而不是语音动机的字母组合(如"sh")。
- 当一行以"::lcode xyz "开头时,新的uroman版本将为该行切换到该语言。这用于新的参考测试文件。
- 各种小改进。
版本1.2.5的变更
- 改进了对亚美尼亚语和八种使用西里尔字母的语言的支持。 -- 对于经常同时使用西里尔字母和拉丁字母书写的塞尔维亚语和马其顿语,uroman将把两种官方版本映射到相同的罗马化文本,例如"Ниш"和"Niš"都将被映射为"Nish"(正确反映了这个城市名称的发音)。 对于塞尔维亚语和马其顿语,随意写作者经常使用不带变音符号的简化拉丁形式,例如使用"s"来表示不仅是西里尔字母的"с"和拉丁字母的"s",还包括"ш"或"š",即使这会混淆"s"和"sh"等对。可以通过使用替代uroman语言代码"srp2"和"mkd2"来模拟随意罗马化,这些代码将"Ниш"和"Niš"都罗马化为"Nis",以反映随意的拉丁拼写。
- 各种小改进。
版本1.2.4的变更
- 修复了在缓存模式下为每个空行生成两个空行的错误。
版本1.2的变更
- 基于(1)基于令牌的缓存和(2)ASCII字符串的快捷罗马化(保持原样)对默认单最佳(非图表)输出进行运行时改进。对中等和大型文本的孟加拉语和维吾尔语处理速度提高了10倍。
- 对波斯语、阿姆哈拉语、俄语、希伯来语及相关语言进行渐进改进。
- 为英语的"罗马化"提供更丰富的格架结构(更多选择),以更好地匹配其他语言的罗马化。 仅在指定--chart选项时更改输出。默认单最佳输出不变,ASCII字符始终为输入字符串。
1.1版本的变更(重大升级)
- 提供图表输出(JSON格式)以表示替代罗马化。
- 第一个字符的位置定义为"行:1,起始:0,结束:0"。
- 希伯来语和希腊语罗马化的渐进改进;中文数字改进。
- 改进的网页界面(现在)位于https://uhermjakob.github.io/uroman.html
- 当鼠标悬停在文本段上时,以红色显示相应的原文和罗马化文本。
- 当鼠标悬停在带有虚线下划线的罗马化文本上时,显示替代罗马化。
- 增加从右向左书写脚本检测,改进从右向左书写脚本文本的显示(逐行确定)。
- 页面上支持一些用户计算机上通常未预装的脚本(缅甸语、古埃及语、克林贡语)。
1.0版本的变更(重大升级)
- 将主要内部数据结构从字符串升级为格架。
- 主要改进了南亚和东南亚语言的元音化。
- 更一致地将元音'r'视为元音(不添加额外元音)。
- 重复符号(日语/中文/泰语/高棉语/老挝语)映射为上标2。
- 日语片假名中点现在映射为ASCII空格。
- 藏语音节间标记现在映射为中点(U+00B7)。
- 修正了一些关于中文数字分析的问题。
- 更多外语变音符号和标点符号被删除或映射为ASCII。
- 删除零宽字符,除了行/句首的字节顺序标记。
- 空格标准化为ASCII空格。
- 修复了在某些情况下将符号(如匕首或项目符号)映射为其文字描述的错误。
- 使用新的uroman可视化diff工具对比测试了之前版本的uroman。
- 速度提高了近一个数量级。
0.7版本的变更(小升级)
- 为阿拉伯文脚本语言(包括维吾尔语)添加了uroman-quick.pl脚本。 速度更快,预缓存阿拉伯字符到拉丁字符的映射,简单的贪婪处理。 不会转换非阿拉伯文区块的材料,如维吾尔语文本中(不太常见的)西里尔字母或汉字。
0.6版本的变更(小升级)
- 增加了对乌兹别克语中使用的两个字母字符的支持: (1) 字符"ʻ"("修饰符字母转逗号",修饰前面的"g"和"u"字母) (2) 字符"ʼ"("修饰符字母撇号",乌兹别克语用来标记声门塞音)。 两者现在都映射为"'"(普通ASCII撇号)。
- 增加了对维吾尔语元音字符(如"ې"(阿拉伯e)和"ۆ"(阿拉伯oe))的支持, 即使它们前面没有"ئ"(带上加点的yeh)。
- 增加了对阿拉伯语分号"؛"的支持,以及阿拉伯语连字形式的短语,如"ﷺ" ("sallallahou alayhe wasallam" = "愿真主赐福他及其家人并赐平安")
- 增加了对阿拉伯字母呈现形式(首/中/尾/独立)的稳健性。 但强烈建议在调用uroman之前将任何呈现形式的阿拉伯字母标准化为非呈现形式。
- 添加了强制刷新指令($|=1;)。
0.5版本的变更(小升级)
- 改进了维吾尔语(请确保使用语言选项:-l uig)
0.4版本的变更(小升级)
- 改进了泰语(元音/辅音重排的特殊情况,例如对"sara o";去掉了一些送气音'h')
- 对阿拉伯语做了小改动(添加了"alef+fathatan" = "an")
0.3版本的新特性
- 覆盖普通话(中文)
- 改进了众多语言的罗马化
- 保留大小写(例如来自拉丁、西里尔、希腊文字)
- 将本地数字映射为西方数字
- 对南亚语言处理更快
其他特性
- 网页界面(旧版Perl):https://uhermjakob.github.io/uroman.html
- 在本地可计算时提供元音化,例如对许多南亚语言和藏语。
可逆性
- 罗马化标准倾向于可逆映射。例如,作为独立元音,希腊字母ι(iota)和υ(upsilon)分别罗马化为i和y,尽管它们在现代希腊语中发音相同。
- 然而,uroman_并不总是完全可逆的。例如,由于_uroman_将字母映射到ASCII字符,罗马化后的文本不包含任何变音符号,因此法语单词_ou("或者")及其同音词_où_("哪里")都映射为罗马化的_ou_。
局限性
- uroman的当前版本有一些局限性,我们计划在未来版本中解决其中一些问题。 对于日语,uroman目前按预期罗马化平假名和片假名,但汉字被解释为汉字并按此罗马化。 对于埃及象形文字,目前只对单音标音字符和数字进行罗马化。 对于线性B文字,只对音节字符进行罗马化。 对于一些其他灭绝的文字系统如楔形文字,不提供罗马化。
- 罗马化器不是完整的音译器。例如,此版本的 uroman不会对缺乏明确元音化的文本进行元音化,如 阿拉伯语和希伯来语的正常文本(无变音符号/点)。
致谢
该工具的早期版本部分基于国家情报总监办公室(ODNI)和情报高级研究计划活动(IARPA)通过合同#FA8650-17-C-9116提供的支持,以及空军研究实验室(AFRL)根据协议编号FA8750-19-1-1000赞助的研究。本文所含观点和结论均为作者个人意见,不应被解释为必然代表ODNI、IARPA、空军实验室、DARPA或美国政府的官方政策,无论明示或暗示。美国政府有权复制和分发本文内容用于政府用途,即使其中包含任何版权声明。