Python 非英语语言中的n-gram名称分析(CJK等)

Python 非英语语言中的n-gram名称分析(CJK等),python,nlp,similarity,n-gram,cjk,japanese,Python,Nlp,Similarity,N Gram,Cjk,Japanese,我正在对人的数据库进行重复数据消除。对于第一个过程,我将遵循一个基本的两步过程,以避免对整个数据库执行O(n^2)操作,如下所述。首先,我“block”-迭代整个数据集,并根据名称中的n-gram和首字母缩写对每个记录进行装箱。其次,使用Jaro Winkler对每个箱子的所有记录进行比较,以测量它们代表同一个人的可能性 我的问题-名称是Unicode。这些名字中有一些(虽然不是很多)是用CJK(中国-日本-韩国)语言写的。我不知道如何在这些语言中找到像首字母这样的东西。我不知道n-gram分析

我正在对人的数据库进行重复数据消除。对于第一个过程,我将遵循一个基本的两步过程,以避免对整个数据库执行O(n^2)操作,如下所述。首先,我“block”-迭代整个数据集,并根据名称中的n-gram和首字母缩写对每个记录进行装箱。其次,使用Jaro Winkler对每个箱子的所有记录进行比较,以测量它们代表同一个人的可能性

我的问题-名称是Unicode。这些名字中有一些(虽然不是很多)是用CJK(中国-日本-韩国)语言写的。我不知道如何在这些语言中找到像首字母这样的东西。我不知道n-gram分析是否对名称为2个字符的语言中的名称有效。我也不知道字符串编辑距离或其他相似性度量在这种情况下是否有效


语言学家程序员或母语人士有什么想法吗?

因此,用日语进行搜索时,进行双字模式匹配是一种常见的技巧,但有更好的方法可以用来确定单词边界。在我过去参与的一个项目中,我们对日本品牌名称和其他一些文本进行了比较好的处理。我想你可以通过在日本名字列表上训练它来获得更好的表现。遗憾的是,它是用C编写的,但我们最终通过JNI在Java中使用了它,您可以在python代码中执行类似的操作。

对于中文,大多数名称由3个字符组成:第一个字符是姓氏(!),其他两个字符是个人名称,如
毛泽东=姓毛泽东和姓毛泽东。 还有一些两个字符的名字,第一个字符是姓,第二个字符是人名。 4个字符的名称很少见,但拆分通常为2-2个字符


鉴于此,对中文姓名进行n-gram分析并没有多大意义——你只是在研究最常见的中文姓氏/人名。

关于日语的更多信息:

  • 当涉及到将姓名分为姓和名时,,像mecab(在@Holden的回答中提到)这样的形态学分析器基本上可以工作,但是的准确度不会很高,因为他们只会正确地得到字典中的那些名字(mecab的统计“猜测”功能主要与POS标记和处理歧义词典条目有关,但如果词典中没有专有名词,mecab大多数时候会将其拆分为单个字符,这几乎总是错误的)。为了测试这一点,我在web上使用了随机名称列表(,其中包含113个人名),提取人名,删除其中的空白,并使用IPAdic测试mecab。大约21%的人名出错

  • “专有”日文名,即日本人的名字,包括一个姓(大多数时候是2,但有时是1或3,汉字)和一个名(大多数时候是1或2,有时是3个汉字,但有时是2-5个平假名)。没有中间名,也没有首字母缩写的概念。您可以改进mecab的输出,方法是:(1)使用全面的姓氏词典,您可以从web资源中构建该词典,(2)假设有2个以上的元素时输出错误,然后使用自制的姓氏词典识别姓氏部分,如果失败,则使用基于字符数的默认拆分规则。后者并不总是准确的

  • 当然,外国名字也可以用日语表示。首先,有中文和韩国人的名字,它们通常用汉字表示,也就是说,你使用的中文或韩国人的任何分割规则都可以或多或少地直接应用。西方名字以及阿拉伯文或印度名字都可以用表示ng>拉丁字符(可能是全宽字符),或片假名字符,通常(但不总是)使用空白或中间点・在姓氏和名字之间。而对于日本人、中国人或韩国人的名字,日语中的顺序总是姓,然后是名字,西方名字的顺序很难预测

  • 您是否需要将姓名拆分为系列和给定部分?为了消除重复数据/清理数据,仅当某些可能的重复项以不同的顺序出现或带有可选的中间首字母缩写时,才需要这样做。日文姓名(中文姓名或韩文姓名)中不可能这样做.唯一需要记住的是,如果给你一个带有空格或中间点的片假名字符串,你很可能在处理一个西方名字,在这种情况下,在空格/中间点拆分是有用的

  • 虽然实际上可能不需要拆分,但您必须注意前面答案中未提及的许多其他问题:

  • 外国名称的音译。根据数据库的构建方式,可能存在涉及西方名称的情况,例如一个条目中的“Obama”,以及日语片假名表示法オバマ' 在重复条目中。不幸的是,从拉丁语到片假名的映射并不简单,因为片假名试图反映名称的发音,这可能因语言或来源以及发音者的口音而异。例如,第一次听到“Obama”这个名字的人可能会被诱惑重新命名将其命名为'オバーマ' 要强调中间元音的元音。解决这个问题并不微不足道,而且永远也不会精确地工作,但是如果你认为这对你的清洗问题很重要,我们就用另外一个问题来解决。
  • 汉字变体。