2016-07-26 35 views
4

我正在清理实体(人员,组织等)的“配置文件”的数据库,而配置文件的一个这样的部分是其本机中的个人的名称脚本(例如泰语),以UTF-8编码。在之前的数据结构中,我们没有捕获名称的字符集,所以现在我们有更多的记录无效值比手动审查。检测任意字符串的字符集/脚本

我需要在这一点上做的是,通过脚本,确定任何给定的名称是什么语言/脚本的样本数据集:

Name: "แผ่นดินต้น" 
Script: NULL 

Name: "አብርሃም" 
Script: NULL 

我需要

落得
Name: "แผ่นดินต้น" 
Script: Thai 

Name: "አብርሃም" 
Script: Amharic 

我不需要翻译名称,只需确定它们在哪个脚本中。是否有一种确定这种事情的确定技术?

+0

您可以https://metacpan.org/pod/Encode ::尝试猜测。它可能会告诉你它们中的很多是什么,然后你可以实际转换而不是删除。它不能猜到你可以删除。你可以添加一些你在数据库中的示例数据吗? – simbabque

+0

Ligua ::识别是针对语言,而不是针对编码。我相信这样做效果不好。 – simbabque

+0

@simbabque删除是完全不可能的,我们只能想出另一种方式来处理这些散户。不幸的是,我无法分享任何示例,但我将要处理的数据实际上并不比英语(可能)其他语言中的名称更复杂。 – Andy

回答

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上至少有一个模块可以做到这一点,但我现在找不到它。像这样的东西可能会被滥用,使查找更容易。

2

使用unicodedata2 Python模块描述herehere,您可以检查的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'