【问题标题】:How to separate forename and surnames in R?如何区分R中的名字和姓氏?
【发布时间】:2021-03-30 16:14:14
【问题描述】:

我有一份巴西姓名列表,我需要区分名字和姓氏。问题是许多巴西人只有一个名字,而其他人有两个名字。考虑到这种特殊性,有没有办法区分这些名称?

编辑:大多数男人的姓氏有两个词,女人可以有两个(单身时)或三个词(已婚时)。数据框识别性别但不识别婚姻状况。也就是说,当genderMale=0 时,我想将名称的组成部分分为:名字、后两个名字和后三个名字。

数据框示例:

fullName;                           genderMale;
Antonio Oliveira Souza              1
Carlos Antonio Oliveira Souza       1
Maria Oliveira Silva                0 
Maria Oliveira Souza Silva          0
Antonia Maria Oliveira Souza Silva  0

数据框必须如下所示:

  fullName;                          genderMale;  firstName;  lastTwoNames;     lastThreeNames;
  Antonio Oliveira Souza             1            Antonio     Oliveira Souza    NA
  Carlos Antonio Oliveira Souza      1            Carlos      Oliveira Souza    NA
  Maria Oliveira Silva               0            Maria       Oliveira Silva    Maria Oliveira Souza
  Maria Oliveira Souza Silva         0            Maria       Souza Silva       Oliveira Souza Silva
  Antonia Maria Oliveira Souza Silva 0            Antonia     Souza Silva       Oliveira Souza Silva

提前致谢。

【问题讨论】:

  • 是否有规则可以让我们确定名字的结束位置和姓氏的开始位置?如果没有,那将是棘手的......
  • 恐怕不行。巴西人基本上知道如何在看到名字和姓氏时识别它。我知道的唯一规则是姓氏中的字数:大多数男人的姓氏有两个字,女人可以有两个(单身时)或三个字(结婚时)。数据框识别性别但不识别婚姻状况。

标签: r parsing text


【解决方案1】:

您的问题的解决方案将分为两部分:

  1. 将全名分成其组成部分
  2. 将每个组件分类为“名字”或“姓氏”

第一部分很简单,正如@MattKaye 所建议的那样,tidyr::separate 是一个显而易见的选择。

第二部分是three-pipe problem。您关于“巴西人基本上知道如何在看到名字和姓氏时识别它”的评论证实了我的怀疑,即不会有一个可以处理所有情况的单线算法解决方案。这是一个分类问题。而且任何解决方案都不太可能 100% 准确。

可能会有一些低垂的果实可以采摘。例如,

  • 如果全名有两个或多个组成部分,则第一个元素必须是名字,最后一个组成部分必须是姓氏。 (假设没有数据错误。)
  • 如果全名包含三个组成部分,那么它可能是一个名字后跟一个两个元素的姓氏
  • 是否有可能总是是名字或总是是姓氏的名字?然后我们可以将该元素(以及每个前面/后面的元素)分类为名字/姓氏。

分类器不是我的专业领域。您是否有可用作训练数据的大型独立数据集?如果是这样,也许神经网络是一种可能性。

底线是,如果没有确定性(一组)规则来应用,您的工作就会被淘汰。至少,如果我们要提出一些含糊不清的建议,您将不得不向我们提供更多信息。

【讨论】:

  • 非常感谢。我将更新我的问题以使其更简单,也许我可以解决一些问题。
  • @BenBolker:是的,应该。谢谢你。我会改正的。
【解决方案2】:

来自tidyrseparate 执行此操作。您需要使用正则表达式根据倒数第二个空格(或其他一些规则,因为我对巴西名字的了解有限)进行分隔,但我会看这里:https://tidyr.tidyverse.org/reference/separate.html

【讨论】:

  • 我认为这(还)没有解决@Limey 的观点,即如何知道应该在哪里进行分离。由于separate 在字符串(正则表达式,例如" ")或固定位置(数字,不容易预先确定)上运行,我认为仅此一项可能不是最好的方法。无论如何,当他们证明问题的解决方案时,答案通常会更好。
  • 是的,通常我会同意,但如果没有更多的知识和背景,我不确定我是否能够提出要使用的规则或正则表达式。除此之外,使用mutate 或使用几个自定义函数可能是有意义的,但我会等待来自@savioecon 的更多信息
猜你喜欢
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2013-10-22
  • 1970-01-01
  • 2015-12-21
相关资源
最近更新 更多