我如何分隔全名?

时间:2016-12-23 12:48:10

标签: ruby algorithm

在与中间部分比较之后,我选择正确的部分进行清理并保存,如果相等则

> #!/usr/bin/env ruby

require 'rubygems'
require 'levenshtein'
require 'csv'

# Extending String class for blank? method
class String
  def blank?
    self.strip.empty?
  end
end

# In
lines = CSV.read('entrada.csv')
lines.each do |line|
  id      = line[0].upcase.strip
  left    = line[1].upcase.strip
  right   = line[2].upcase.strip
  eduardo = line[2].upcase.split(' ','de')

  line[0] = id
  line[1] = left
  line[2] = right
  line[4] = eduardo[0]+eduardo[1]

  distance = Levenshtein.distance left, right

  line << 99 if (left.blank? or right.blank?)
  line << distance unless (left.blank? or right.blank?)
end

# Out
# counter = 0
CSV.open('salida.csv', 'w') do |csv|
  lines.each do |line|
    # counter = counter + 1 if line[3] <= 3
    csv << line
  end
end

# p counter

中间是正确的,我应该纠正

一些例子:

  • Eduardo | Abner | Herrera | Herrera - &gt; Eduardo Herrera

  • 天使|德|莱昂 - &gt; Angel De Leon

  • Maira |安吉丽娜|德|莱昂 - &gt; Maira De Leon
  • Marquilla |古铁雷斯| Petronilda | De |莱昂 - &gt; Marquilla Petronilda

2 个答案:

答案 0 :(得分:0)

第一项业务是提出一些规则。根据您的示例和Spanish naming customs,这是我的规则。

  • 一个名字有一个姓,父姓和可选的母姓。
  • 一个名字可以是多个单词。
  • 姓氏可以是由deye链接的多个单词。

因此['Marquilla', 'Gutierrez', 'Petronilda', 'De', 'Leon']应为{ forename: 'Marquilla', paternal_surname: 'Gutierrez', maternal_surname: 'Petronilda de Leon' }

为简化流程,我首先将任何复合姓氏加入一个字段。 ['Marquilla', 'Gutierrez', 'Petronilda', 'De', 'Leon']变为['Marquilla', 'Gutierrez', 'Petronilda De Leon']。请注意['Angel', 'De', 'Leon']之类的案例,在这种情况下,姓氏可能是De Leon

一旦完成,找出哪个部分变得更容易。

name = {}

if parts.length == 1
    error?
# The special case of only two parts: forename paternal_surname
elsif parts.length == 2
    name = {
        forename: parts[0],
        paternal_surname: parts[1]
    }
# forename paternal_surname maternal_surname
else
    # The forename can have multiple parts, so work from the
    # end and whatever's left is their forename.
    name[:maternal_surname] = parts.pop
    name[:paternal_surname] = parts.pop
    name[:forename] = parts.join(" ")
end

西班牙语命名中存在很多含糊不清的内容,因此这只能是对其实际名称的有根据的猜测。在了解有关数据集的更多信息时,您可能需要调整规则。例如,我非常确定de的处理并不那么简单。例如......

  

与PedroPérezMontilla结婚的一个LeocadiaBlancoÁlvarez可能会被称为Leocadia BlancodePérez或LeocadiaBlancoÁlvarezdePérez

在这种情况下,['Marquilla', 'Gutierrez', 'Petronilda', 'De', 'Leon']变为['Marquilla', 'Gutierrez', 'Petronilda', 'De Leon']{ forename: 'Marquilla', paternal_surname: 'Gutierrez', maternal_surname: 'Petronilda', married_to: 'Leon' }'Marquilla Gutierrez Petronilda与父母姓氏为Leon的人结婚。

祝你好运。

答案 1 :(得分:-1)

我会在数据库中添加更多列,例如last_name1last_name2last_name3等,并使它们成为可选项(不要对这些属性进行验证)。希望能回答你的问题!