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

Mat*_*ngo 5 python nlp similarity cjk n-gram

我正在努力推算一个人的数据库.对于第一遍,我遵循基本的两步过程以避免对整个数据库进行O(n ^ 2)操作,如文献中所述.首先,我"阻止" - 遍历整个数据集,并根据名称中存在的n-gram AND首字母对每个记录进行分区.其次,使用Jaro-Winkler比较每个箱子的所有记录,以衡量他们代表同一个人的可能性.

我的问题 - 名称是Unicode.这些名称中的一些(尽管不是很多)是CJK(中日韩)语言.我不知道如何在这些语言中找到类似首字母的单词边界.我不知道n-gram分析是否对名称可以是2个字符的语言中的名称有效.我也不知道字符串编辑距离或其他相似性度量在此上下文中是否有效.

语言学家程序员或母语人士的任何想法?

jog*_*pan 8

有关日语的更多信息:

  1. 当把名字拆分成姓氏和名字时,像mecab这样的形态分析器(在@ Holden的回答中提到)基本上可以工作,但是准确度水平不会很高,因为他们只会得到正确的名字.他们的字典(mecab的统计'猜测'能力主要与POS标签和处理模糊字典条目有关,但如果专有名词不在字典中,mecab大部分时间会将其分成单个字符,这几乎是总是错的).为了测试这个,我在网上使用了一个随机的名字列表(这个名字包含113个人的名字),提取名字,从中移除空格并使用IPAdic测试mecab.它得到了约.21%的名字错了.

  2. '正确'日语名称,即日本人的名字,由姓氏组成(大部分时间为2,但有时为1或3,汉字)和给定名称(大部分时间为1或2,有时为3汉字,但是有时2-5平假名).没有中间名,也没有首字母的概念.您可以通过(1)使用全面的姓氏字典来改进mecab输出,您可以从Web资源构建,(2)假设输出错误,只要有2个以上的元素,然后使用自制的系列名称字典用于识别姓氏部分,如果失败,则使用基于字符数的默认分割规则.后者并不总是准确的.

  3. 当然外国名字也可以用日语表示.首先,有中文和韩文名称,通常使用汉字表示,即您使用的中文或韩文的分割规则可以或多或少地直接应用.西方以及阿拉伯或印度名称要么使用拉丁字符(可能是全宽),要么用片假名字符表示,通常(但不总是)使用空格或中间点·姓氏和给定名称之间.而对于日本人,中国人或韩国人的姓名,日语表示的顺序将始终是姓氏,然后给出名称,西方名称的顺序很难预测.

  4. 你甚至需要将名字分成家庭和给定的部分吗?出于重复数据删除/数据清理的目的,只有在某些可能的重复项以不同的顺序或可选的中间名首字母出现时才需要这样做.日语名称(也不是中文,也不是韩文名称)都不可能.唯一要记住的是,如果给你一个带有空格或中间点的片假名字符串,你可能会处理西方名称,在这种情况下,在空格/中间点处分割是有用的.

  5. 虽然拆分可能不是真正需要的,但您必须处理前面答案中未提及的许多其他问题:

    1. 外国名称的音译.根据数据库的构建方式,可能会出现西方名称的情况,一个条目中的"奥巴马",以及重复条目中的日语片假名表示 "オバマ".不幸的是,从拉丁语到片假名映射并不简单,因为片假名试图反映名称的发音,这可能会根据语言或来源以及发音者的口音而有所不同.例如,第一次听到"奥巴马"这个名字的人,可能很想把它称为'オバーマ'来强调中间的长元音.解决这个问题并非易事,并且永远不会完全准确,但如果您认为这对您的清洁问题很重要,那么让我们在一个单独的问题中解决它.

    2. 汉字变异.日语名称(以及一些中国人或韩国名字的日语表示)使用被认为是现代汉字的传统版本的汉字.例如,许多常见的姓氏包含泽,这是沢的一个版本.例如,姓氏Takazawa可以写成高沢或高泽.通常,只有一个是该名称的任何特定人员使用的正确变体,但在数据库条目中使用错误的变体并不罕见.因此,在比较名称之前,您应该将传统变体标准化为现代变体.此网页提供的映射肯定不全面,但可能足以满足您的需要.

    3. 拉丁字符和片假名字符都以全宽和半宽变体形式存在.在片假名中,前者和拉丁语中常用的是后者,但不能保证.在比较名称之前,您应该将所有Kakatana标准化为全宽,将所有拉丁文标准化为半宽.

    4. 也许不用说,但是有各种版本的空白字符,你还必须在比较名称之前进行规范化.此外,在纯粹的汉字序列中,我建议在比较之前删除所有空格.

    5. 如上所述,一些名字(特别是女性名字)是用平假名写的.在某些情况下,可能会发生这些相同的名字在片假名中.平假名和片假名之间的映射很简单.在进行任何比较之前,您应该考虑将所有假名(即平假名和片假名)归一化为共同表示(平假名或片假名).

    6. 也可能发生一些汉字名称使用假名表示.这是因为任何进行数据库输入的人可能都不知道名称的正确汉字(特别是使用名字,在听到姓名之后猜测正确的汉字,例如在电话上即使对于母语人士也是如此).不幸的是,汉字表示和假名表示之间的映射是非常困难和非常模糊的,例如真,诚和実可能是名字'Makoto'的汉字.任何具有该名称的人都会认为其中只有一个对自己是正确的,但如果您知道的唯一的事情是名称是"Makoto",则无法知道哪一个.但Kana是基于声音的,所以这三个版本在片假名中都是相同的マコト.像mecab这样的形态分析器中内置的字典提供了映射,但由于任何假名序列都有多个可能的汉字,反之亦然,实际上在数据清理过程中使用它会使你的算法复杂化很多.根据数据库的创建方式,这可能是也可能不是相关问题.

具体编辑出版物作者姓名:非日本书籍的日语翻译通常将作者名称音译为片假名.例如,朝日报图书推荐清单今天有30本书; 7在片假名中有西方作者的名字.他们甚至缩写了名字和中间名字缩写,它们保留在拉丁语中,例如

H·S·フリードマン和L·R·マーティン

对应于

HS弗里德曼(或弗里德曼,或弗里德曼,或弗里德曼?)

LR Martin(或马丁,还是Mahtin?)

我想说这是处理非日本作者书名的最常见方式:

  1. 缩写保留为拉丁语
  2. 名称的未缩写部分在片假名中给出(但是拉丁语和片假名之间没有唯一定义的一对一映射,如5.1中所述)
  3. 订单保留:第一,中,姓.对于作者姓名来说,这是一个非常常见的约定,但在类似客户数据库的情况下可能会有所不同.
  4. 使用空格或中间点(如上所述)或标准ASCII点来分隔元素

因此,只要您的项目与作者的书籍名称相关,我相信以下内容对于非日本作者来说是准确的:

  • 同一作者可能出现在拉丁语(非日语词条)中以及片假名表示(在日语词条中).为了能够确定两个这样的条目引用同一作者,您需要在Katakana和Latin之间进行映射.这是一个非常重要的问题,但也不是完全不可克服的(虽然它永远不会100%正确地工作).我不确定是否可以免费获得一个好的解决方案; 但如果需要,让我们在一个单独的问题(可能带有标签)中解决这个问题.

  • 即使由于某种原因我们可以假设没有片假名的拉丁文副本,但是片假名中存在多个变体的可能性很大(由于5.1).但是,对于作者姓名(特别是着名作者),可以安全地假设变异量相对有限.因此,首先,将点和空格标准化可能就足够了.

  • 分割成姓和名字是微不足道的(空白和点),并且所有变体的名称顺序通常是相同的.

  • 西方作者通常不会使用汉字来表示.有一些人认为自己与日本的关系如此密切,以至于他们选择汉字作为自己的名字(这是一个选择问题,而不仅仅是音译,因为汉字有意义),但这种情况很少见,几乎不值得担心.

现在关于日本作者,这些将在主要答案的第2部分中描述的汉字中表示.在他们的书籍的西方翻译中,他们的名字通常用拉丁文给出,订单将被交换.例如,

村上春树(村上=村上,姓,春树=春树,给定名字)

将表示为

村上春树

关于他的书的翻译.汉字和拉丁语之间的这种映射需要一个非常全面的字典和相当多的工作.此外,拉丁语中的拼写并不总是唯一确定的,即使读取汉字也可以.例如,最常见的日本姓氏之一,伊藤,可能拼写为"Ito"以及英语中的"Itoh".甚至'Itou'和'Itoo'也不是不可能的.

如果不需要日语 - 拉丁语交叉匹配,您将看到的汉字表示中唯一的变体是汉字变体(5.2).但要明确的是,即使存在汉字的传统和现代变体,其中只有一个对任何特定的个体都是正确的.当电话操作员将名字输入数据库时​​,很容易输入错误的汉字变体,但在作者姓名的数据库中,这将是相对罕见的,因为可以相对容易地验证作者的正确拼写.

关于5.6(Kana vs. Kanji)的问题:

  1. 有些人的名字没有汉字表示,只有平假名表示.由于平假名和片假名之间存在一对一的对应关系,因此两种变体很可能出现在数据库中.我建议在比较之前将所有平假名转换为片假名(反之亦然).

  2. 但是,大多数人的名字都是用汉字写的.在书的封面上,将使用这些汉字,因此很可能它们也将在您的数据库中使用.有人可能输入假名而不是汉字的唯一原因是:(a)当他/她不知道正确的汉字时(可能不太可能,因为你可以轻松搜索亚马逊或其他什么来查找),(b)当数据库被制作时用于搜索目的.图书目录的搜索引擎可能包括片假名版本,因为即使他们不知道正确的汉字,用户也可以找到作者.因此,您是否需要Kanji-Kana转换(这是一个难题)取决于数据的原始目的以及数据库的创建方式.

  3. 关于昵称:在日常会话中使用昵称,但我怀疑你会在作者数据库中找到它们.我意识到有些语言(例如波兰语)以几乎常规的方式使用绰号或缩写(例如'Gosia'而不是'Małgorzata'),但我不会说日语就是这种情况.

  4. 关于中文:我无法给出全面的答案,但至少整个汉字 - 假名变异问题不存在,因为中文只使用汉字(简称汉字).然而,存在一个主要的汉字变异问题(特别是在传统变体(在台湾使用)和简化变体(在大陆使用)之间).

  5. 关于韩语:据我所知,韩国人通常能够在Hanja(=汉字)中写下自己的名字,虽然他们大多数时间都没有使用汉字大部分其他语言,但显然有一个韩文版的名称也是如此.我不确定像你这样的清洁问题需要Hanja-Hangul转换的程度.如果是,那将是一个非常困难的问题.

  6. 关于区域变体:日语中没有汉字汉字的区域变体(至少在现代不是这样).任何特定作者的汉字都将以相同的方式在日本各地写作.当然,有些家族名称在一个地区比另一个地区更频繁.如果您对名称本身(而不是他们所指的人)感兴趣,区域变体(以及汉字的传统形式和现代形式之间的差异)将发挥作用.


Hol*_*den 1

因此,进行二元语法风格匹配是在日语中进行搜索的常见技巧,但是您可以使用更好的方法来确定单词边界。在我过去从事的一个项目中,我们使用mecab对于日本品牌名称和其他一些文本取得了相当好的结果。我想你可以通过在日本名字列表上训练它来获得更好的性能。遗憾的是它是用 C 语言编写的,但我们最终还是通过 JNI 在 Java 中使用了它,您可以在 Python 代码中执行类似的操作。