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

标签 python nlp similarity n-gram cjk

我正在努力对人员数据库进行重复数据删除。首先,我遵循一个基本的两步过程来避免对整个数据库执行O(n ^ 2)操作,如in the literature所述。首先,我“块”遍历整个数据集,并基于名称中存在的n-gram和首字母对每个记录进行分类。其次,使用Jaro-Winkler比较每个垃圾箱中的所有记录,以衡量它们代表同一个人的可能性。

我的问题-名称是Unicode。这些名称中的一些(尽管不是很多)使用CJK(中日韩)语言。我不知道如何find word boundaries这些语言的缩写。我不知道n-gram分析是否对名称可以为2个字符的语言的名称有效。我也不知道在这种情况下字符串编辑距离或其他相似性指标是否有效。

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

最佳答案

有关日语的更多信息:

  • 上,将名字分为姓氏和名字时,像mecab之类的形态分析仪(在@Holden的答案中提到)基本上可以工作,但是的准确性不会很高,因为它们只会得到那些词典中正确的名称(mecab的统计“猜测”功能主要与POS标签和不明确的词典条目有关,但是如果词典中没有专有名词,mecab在大多数情况下会将其拆分为单个字符,这几乎总是错误的)。为了对此进行测试,我在网络上使用了随机的名称列表(this one,其中包含113个人的名字),提取名称,删除其中的空格,并使用IPAdic测试了mecab。它大约。 21%的名称错误。
  • '适当的'日本名字,即日本人的名字,由一个姓氏(大多数情况下为2,但有时为1或3,汉字)和一个给定名称(大多数情况下为1或2,有时为3汉字,但有时改为2-5平假名)。没有中间名,也没有缩写的概念。 您可以通过(1)使用全面的姓氏词典来改善mecab 输出,您可以从网络资源中构建该词典,(2)假设每当有两个以上元素时输出都是错误的,然后自行使用-制作了姓氏字典来识别姓氏部分,如果失败了,请使用基于字符数的默认拆分规则。后者并不总是准确的。
  • 当然,外国名称也可以用日语表示。首先,有中文和韩文名称,通常使用汉字表示,即,无论您使用哪种中文或韩文分割规则,都可以或多或少地直接应用。西方名称以及阿拉伯或印度名称要么使用拉丁字符(虽然可能是全角),要么使用片假名字符表示,通常(但不总是)使用白色空格或中间点・家族名称之间的中间点・ 并命名。对于日本人,中国人或韩国人来说,日语代表的顺序始终是姓氏,然后再给定名字,西方名字的顺序很难预测。
  • 您是否还需要将名字分为家族和给定部分? 出于重复数据删除/数据清除的目的,仅当某些可能的重复项以不同顺序或带有可选的中间名首字母出现时才需要这样做。日文名称(与此同时,中文名称或韩文名称)均不能使用。唯一要记住的是,如果给您的片假名字符串中带有空格或中间点,那么您很可能会处理一个西方名称,在这种情况下,在空格/中间点处拆分非常有用。
  • 虽然实际上可能并不需要拆分,但是您必须注意以及先​​前答案中未提及的许多其他问题:
  • 外国名称的音译。根据数据库的构造方式,可能存在涉及西方名称的情况,在一个条目中说“Obama”,在重复条目中用日语片假名表示“オバマ”。不幸的是,从拉丁语到片假名的映射并不简单,因为片假名试图反射(reflect)该名称的发音,该名称可能随语言或出身以及发音者的口音而变化。例如。第一次听到“奥巴马”这个名字的人可能会想将其表示为“オバーマ”,以强调中间的长元音。解决这个问题并非易事,而且永远无法完美地完成工作,但是,如果您认为这对您的清洁问题很重要,那么让我们在一个单独的问题中加以解决。
  • 汉字变体。 日文名称(以及某些中文名称的日文表示形式或韩文名称)使用的汉字被视为现代汉字的传统版本。例如,许多常见的姓氏都包含泽,它是version的一个版本。例如,高泽的姓氏可以写为高沢或高泽。通常,只有一个是该名称的任何特定人员使用的正确变体,但是在数据库条目中使用错误的变体并不罕见。因此,在比较名称之前,您绝对应该将传统变体标准化为现代变体。 This web page提供的映射当然不全面,但可能足以满足您的目的。
  • 拉丁字符和片假名字符都以全角和半角变体的形式存在。在片假名中通常使用前者,而在拉丁语中使用后者,但不能保证。比较名称之前,应将所有Kakatana标准化为全角,将所有拉丁文标准化为半角。
  • 也许不用多说,但是有各种版本的空白字符,在比较名称之前还必须对其进行规范化。此外,在纯汉字序列中,我建议在比较之前删除所有空格。
  • 如前所述,一些名字(尤其是女性名字)是用平假名写的。在某些情况下,这些相同的名称可能用片假名写成。平假名和片假名之间的映射很容易。在进行任何比较之前,您应该考虑使用将所有假名(即平假名和片假名)标准化为通用表示(平假名或片假名)。
  • 也有可能使用假名表示某些汉字名称。这是因为无论谁输入数据库条目,都可能不知道该名称的正确汉字(尤其是名字,即使是母语人士,在电话中听到一个名字之后猜测正确的汉字也常常是不可能的)。不幸的是,汉字表示法和假名表示法之间的映射非常困难且高度模棱两可,例如,真,诚和実可能是汉字的首字母“Makoto”。这个名字的任何人都只会认为其中一个人对自己正确,但是如果您唯一知道的是名字“Makoto”,那么就不可能知道哪个人对自己正确。但是假名是基于声音的,因此在片假名中所有三个版本都是相同的。内置在形态分析器中的字典(例如mecab)可以提供映射,但是由于任何假名序列都有不止一种汉字,反之亦然,因此在数据清理过程中实际使用它会使您的算法复杂得多。取决于最初创建数据库的方式,这可能是相关的问题,也可能不是。

  • 特别编辑出版物作者的姓名:非日语书籍的日语翻译通常将作者姓名音译为片假名。例如。今天book recommendation list of the Asahi newspaper有30本书; 7名在片假名中有西方作家的名字。他们甚至还缩写了名字和中间名的首字母缩写,例如拉丁文和拉丁文。

    H・S・フリードマン and L・R・マーティン



    对应于

    H.S. Friedman (or Friedmann, or Fridman, or Fridmann?)





    L.R. Martin (or Matin, or Mahtin?)



    我想说这是处理非日语作者名字的最常见方式:
  • 缩写的首字母保留为拉丁语
  • 在片假名中给出了名称的未缩写部分(但在拉丁语和片假名之间没有唯一定义的一对一映射,如5.1中所述)。
  • 顺序被保留:首先,中间,姓。这是作者姓名的非常常见的约定,但是在类似于客户数据库的内容中可能有所不同。
  • 可以使用空格,中间点(如上)或标准ASCII点来分隔元素

  • 因此,只要您的项目与书籍的作者姓名有关,我相信以下对于非日语作者是正确的:
  • 同一作者可能以拉丁语(在非日语条目中)以及片假名表示形式(在日语条目中)出现。为了确定两个这样的条目引用的是同一位作者,您需要在片假名和拉丁语之间进行映射。这不是一个简单的问题,但也不是完全不可克服的(尽管它永远不会100%正确地工作)。我不确定是否有免费的好的解决方案。但是如果需要,让我们在一个单独的问题中解决这个问题(也许使用标签)。
  • 即使出于某种原因,我们可以假定在片假名中没有拉丁语重复项,但在片假名中仍存在多个变体的可能性很大(由于5.1)。但是,对于作者姓名(尤其是知名作者),可以安全地假设变体的数量相对有限。因此,一开始,标准化点和空白就足够了。
  • 分为名字和姓氏是很简单的(空格和点),并且在所有变体中,名字的顺序通常是相同的。
  • 通常不会使用日文汉字代表西方作者。有些人认为自己与日本关系密切,因此选择汉字作为自己的名字(这是一个选择问题,不仅仅是音译,因为汉字带有含义),但是这种情况如此罕见,以至于几乎不值得担心。

  • 现在,有关日本作者的内容,将按照主要答案的第2部分中的说明,以日文汉字表示。在他们的书籍的西方译本中,通常会以拉丁文给出他们的名字,并且会交换顺序。例如,

    村上春樹 (村上 = Murakami, the family name, 春樹 = Haruki, the given name)



    将表示为

    Haruki Murakami



    他的书的翻译。汉字和拉丁语之间的这种映射需要非常全面的字典和大量工作。另外,即使可以读汉字,也不能总是唯一地确定拉丁文的拼写。例如。日本最常用的姓氏之一伊藤可能用英文拼写为“Ito”和“Itoh”。甚至“Itou”和“Itoo”也不是没有可能。

    如果不需要日语-拉丁交叉匹配,则您将看到的汉字表示形式本身中的唯一一种变体是汉字变体(5.2)。但是要明确一点,即使存在汉字的传统和现代变体,对于任何给定的个人,只有其中一个是正确的。当电话接线员在数据库中输入姓名时,键入错误的汉字变体很容易发生,但是在作者姓名的数据库中这种情况相对较少,因为可以相对容易地验证作者的正确拼写。

    关于5.6(假名与汉字)的问题:
  • 有些人的名字没有汉字表示,只有平假名。由于平假名和片假名之间存在一对一的对应关系,因此这两种变体都有很大的机会出现在数据库中。我建议在比较之前将所有平假名转换为片假名(反之亦然)。
  • 但是,大多数人的名字都是用汉字写的。在书的封面上,将使用那些汉字,因此很可能还将在您的数据库中使用它们。有人输入假名而不是日文汉字的唯一原因是:(a)当他/她不知道正确的日文汉字时(可能不太可能,因为您可以轻松地搜索Amazon或其他可以找到的东西),(b)创建数据库时用于搜索目的。书籍目录的搜索引擎可能包含片假名版本,因为即使用户不知道正确的汉字,也可以使用户查找作者。因此,是否需要汉字-假名转换(这是一个难题),取决于数据的原始目的以及如何创建数据库。
  • 关于昵称:日常对话中有昵称,但是我怀疑您会在作者数据库中找到它们。我知道有些语言(例如波兰语)几乎都会使用昵称或小写字母(例如'Gosia'而不是'Małgorzata'),但我不会说日语就是这种情况。
  • 关于中文:我无法给出一个全面的答案,但至少不存在整个汉字-假名变异问题,因为中文仅使用汉字(以汉字为名)。但是,存在一个主要的汉字变体问题(尤其是在传统变体(在台湾使用)和简化变体(在大陆使用)之间)。
  • 关于韩语:据我所知,韩人通常可以用汉字(=汉字)书写名字,尽管他们大多数时候大部分其他语言都不使用汉字),但是显然名称的韩文版本。我不确定像您这样的清洁问题,汉贾-汉格尔(Hanja-Hangul)转换的要求程度如何。如果是这样,这将是一个非常困难的问题。
  • 关于区域变体:日文中的汉字字符本身没有区域变体(至少在现代没有)。任何给定作者的汉字将在整个日本以相同的方式书写。当然,某些姓氏在一个地区要比另一个地区更常见。如果您对名称本身(而不是其所指代的人)感兴趣,则将发挥区域变体(以及汉字的传统形式与现代形式之间的变体)的作用。
  • 关于python - 非英语语言(CJK等)的n-gram名称分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10034881/

    相关文章:

    python - 在编译时抑制语法错误

    ruby - 检测不同分辨率下的图像是否相等

    python - 如何从 anaconda 提示符安装 gensim?

    java - 词干的逆过程

    Python字符串匹配完全等于Postgresql相似度函数

    python - 使用 HTML 文件在 Appengine [PYTHON] 中发送 HTML 电子邮件

    python - 为什么打印结果与功能不同

    python - 通过列表中的索引获取元素比通过字典中的键获取元素更快

    java - 余弦相似度始终为 1.0

    python - 需要帮助创建适当的模型来预测两个句子之间的语义相似性