我正在努力清理实体(人员,组织等)的“配置文件”数据库,配置文件的一部分是其本机脚本中的个人名称(例如泰语),编码为UTF-8。在之前的数据结构中,我们没有捕获名称的字符集,因此现在我们有更多的记录包含无效值而不是手动审核。
此时我需要做的是,通过脚本,确定任何给定名称所使用的语言/脚本。使用以下示例数据集:
Name: "แผ่นดินต้น"
Script: NULL
Name: "አብርሃም"
Script: NULL
我最终需要
Name: "แผ่นดินต้น"
Script: Thai
Name: "አብርሃም"
Script: Amharic
我不需要翻译名称,只需确定他们所处的脚本。是否有一种既定的技术可以解决这类问题?
答案 0 :(得分:2)
您可以在Perl中使用charnames
来确定给定字符的名称。
use strict;
use warnings;
use charnames '';
use feature 'say';
use utf8;
say charnames::viacode(ord 'Բ');
__END__
ARMENIAN CAPITAL LETTER BEN
这样,您可以将所有字符串拆分为字符,然后为每种类型的字符组构建计数哈希。从中找出组有点棘手,但这是一个开始。一旦你完成了一个字符串,计数最高的组就应该获胜。这样,您就不会有标点符号或数字妨碍。
找到一些已经具有unicode范围名称并且易于查找的内容可能更为明智。我知道CPAN上至少有一个模块可以做到这一点,但我现在找不到它。可以滥用这样的东西来使查找更容易。
答案 1 :(得分:2)
使用here和here所述的unicodedata2
Python模块,您可以检查每个字符的Unicode脚本,如下所示:
#!/usr/bin/env python2
#coding: utf-8
import unicodedata2
import collections
def scripts(name):
scripts = [unicodedata2.script(char) for char in name]
scripts = collections.Counter(scripts)
scripts = scripts.most_common()
scripts = ', '.join(script for script,_ in scripts)
return scripts
assert scripts(u'Rob') == 'Latin'
assert scripts(u'Robᵩ') == 'Latin, Greek'
assert scripts(u'Aarón') == 'Latin'
assert scripts(u'แผ่นดินต้น') == 'Thai'
assert scripts(u'አብርሃም') == 'Ethiopic'