2016-12-23 4 views
-2

Я взять правую часть и очистить его после того, как она comparate со средней частью и сэкономить, если равныКак я могу отделить полное имя?

> #!/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 

Середина корректный Rigth я должен исправить

Некоторые примеры:

  • Eduardo | Абнер | Эррера | Herrera -> Eduardo Herrera

  • Angel | De | Леон -> Angel De Leon

  • Maira | Анжелина | de | Леон -> Майра де Леон
  • Marquilla | Гутьеррес | Petronilda | De | Leon -> Marquilla Petronilda
+2

_Sidenote: _ Я понятия не имею, о чем вы просите, но я твердо верю, что расстояние Левенштейна не имеет ничего общего с вашей задачей. – mudasobwa

+0

да, например, на испанском языке у нас есть полное имя, включая фамильное имя от мужа, поэтому я должен отделить первое имя и фамилию и, в том числе, замуж, например (Елена де Эррера) –

+1

Не могли бы вы дать четкие примеры входы и выходы? Как «Майкл Джордж Шверн» -> '{сначала:« Майкл », середина:« Джордж », последний:« Шверн »}. – Schwern

ответ

-1

Я хотел бы добавить несколько столбцов в базу данных, как last_name1, last_name2, last_name3 и т.д., и сделать их по желанию (не ставьте валидации на этих атрибутах). Надеюсь это ответит на твой вопрос!

+0

Сколько из них вы бы предложили создать? –

+0

Я думаю, что вопрос о _normalizing_ именах в некотором роде, а не просто разбить их. –

+0

Мне любопытно узнать о возможных решениях, которые другие предлагают :) – Maddie

0

Первый заказ - это придумать некоторые правила. Основываясь на ваших примерах, и Spanish naming customs, вот мой удар по правилам.

  • Имя имеет фамилию, фамилию отца и фамилию материнской семьи.
  • Для имени может быть несколько слов.
  • Фамилия может быть несколько слов, связанных de, y, или e.

Так ['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 не так проста. Например ...

Один Leocadia Blanco Альварес, женился на Педро Переса Montilla, могут быть рассмотрены в качестве Леокадия Бланко де Переса или Леокадия Blanco Альварес де Перез

В этом случае ['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.

Удачи.

+0

в порядке, например, я разделяю, когда у них более 4 пробелов, и легко взять имя и фамилию, но что я должен делать, если у меня есть De? например http://imgur.com/a/qfpS1, поэтому мне нужно отделить и сравнить с правильным, если они равны, кроме того, что он не равен поиску равного, кто-нибудь может мне помочь? –

+0

@ e.herrera Прежде чем пытаться выяснить, какая часть является частью, сканируйте части для 'de' или других союзов и объедините их следующим образом. '['Foo', 'Bar', 'De', 'Baz']' становится '['Foo', 'Bar', 'De Baz']'. Тогда выясните, какая часть есть какая. – Schwern

Смежные вопросы