2013-07-03 11 views
6

Mam kilka ludzkich imion. Wszystkie są nazwami "zachodnimi" i potrzebuję tylko amerykańskich konwencji/skrótów (np. Pan zamiast Sr. dla señor). Niestety, ludzie, do których przesyłam rzeczy, nie wpisywali swoich nazwisk, więc nie mogę ich zapytać, jak chcieliby się nazywać. Znam płeć każdej osoby i jej pełne imię, ale tak naprawdę nie piszę tego dokładniej.Human Name parsing

Kilka przykładów:

  1. John Smith
  2. John Smith, Jr.
  3. John Smith Jr.
  4. John Smith XIV
  5. dr John Smith, Ph.D.

Chciałbym, aby móc analizować z części każdej nazwy:

name = Name.new("John Smith Jr.") 
name.first_name # <= John 
name.greeting # <= Mr. Smith 

Jeśli szukam „pozdrowienie” (prawdopodobnie nie najlepsze określenie), co chcę tu jest , dla 1-4, "Pan Smith". Dla 5, chciałbym doktora Smitha, ale zadowoliłbym się panem Smithem.

Klejnot Ruby do tego byłby idealny. Zainspirowałem się, by poprosić o coś tak dziwnego dla Chronicznego, klejnotu Rubinowego, który zajmuje się czasem w zadziwiająco ludzki sposób, pozwalając mi poprawnie powiedzieć "ostatni wtorek" i wymyślić coś sensownego. "Wystarczyłby algorytm, który uderzy najbardziej przypadków narożnych.

Próbuję sobie z niektórych zagadnień przedstawionych w falsehoods programmers believe about names

Odpowiedz

6

Ponieważ jesteś ograniczony do nazw w stylu zachodnim, myślę, że kilka zasad będzie Ci większość drogi tam:

  1. Jeśli pojawi się przecinek, usunąć najdalej jeden i wszystko po.
  2. Kontynuuj usuwanie słów od początku, podczas gdy po konwersji na małe litery i usuwaniu jakichkolwiek pełnych zatrzymań, należą one do zestawu { mr mrs miss ms rev dr prof } i innych, o których możesz pomyśleć. Używając tabeli tytułowej "wyniki" (np. [mr=1, mrs=1, rev=2, dr=3, prof=4] - zamów je, jak chcesz), zapisz tytuł o najwyższym wyniku, który został usunięty.
  3. Kontynuuj usuwanie słów od końca, gdy należą one do zbioru { jr phd } lub są cyframi rzymskimi o wartości mniej więcej 50 lub mniejszej (/[XVI]+/ to prawdopodobnie wystarczająco dobre wyrażenie regularne).
  4. Jeśli jeden lub więcej tytułów posiadających niezerowe wyniki zostały usunięte w kroku 2, użyj najwyższej z nich. W przeciwnym razie użyj "Mr." lub "Pani" według dostarczonej płci.
  5. Jako nazwisko użyj ostatniego słowa.

Nigdy nie będzie możliwe zagwarantowanie, że nazwa taka jak "John Baxter Smith" jest poprawnie przetwarzana, ponieważ nie wszystkie nazwy z podwójnym lufami używają łączników. Czy "Baxter Smith" to nazwisko? A może "Baxter" to drugie imię? Sądzę, że można bezpiecznie założyć, że imiona pośrednie są relatywnie częstsze niż podwójne, ale niewykryte nazwiska, co oznacza, że ​​lepiej jest domyślnie zgłosić ostatnie słowo jako nazwisko. Możesz także skompilować listę wspólnych, podwójnie nazwanych nazwisk i sprawdzić to.

+0

Daje mi to naprawdę dobry punkt wyjścia do napisania własnej biblioteki do DWIW. Odpowiedź została zaakceptowana. – Hut8

2

patrzeć na lufthansa stronie. Proszą o nich, jakiego rodzaju „tytuł” ​​oni chcą wykorzystanie. nigdy nie widziałem lepsze Pomysł w tym stylu:

Nie polecam używać klejnotów lub czegoś podobnego w tym przypadku, ponieważ angielski/hiszpański/francuski/.... są różnice w płci, a jeśli spróbujesz dyskoteki samemu, nie możesz odnieść sukcesu.

mam nadzieję pomóc

+1

Jest to zdecydowanie poprawna odpowiedź, jeśli zaczynasz od nowa, ale może to oznaczać, że system istnieje już od jakiegoś czasu. –

+0

Tak, byłoby wspaniale, gdybym mógł zapytać tych ludzi w ogóle. Niestety muszę się zgadywać. Zauważ moje pytanie prosi również o odróżnienie Jana Smitha XIV => Pana Smitha, a nie Pana XIV. Tak jak powiedziałem w pytaniu, znam już osobno płeć. – Hut8

1

humanparser

Przetwarza ludzkie imię ciąg na pozdrowienie, imię, drugie imię, nazwisko, przyrostka.

Install

npm install humanparser 

Wykorzystanie

var human = require('humanparser'); 

var fullName = 'Mr. William R. Jenkins, III' 
    , attrs = human.parseName(fullName); 

console.log(attrs); 

//produces the following output 

{ saluation: 'Mr.', 
    firstName: 'William', 
    suffix: 'III', 
    lastName: 'Jenkins', 
    middleName: 'R.', 
    fullName: 'Mr. William R. Jenkins, III' } 
1

Czy próbowałeś gem Ruby Namae?

Powinien dobrze radzić sobie z większością zachodnich nazw i zawiera kilka opcji konfiguracyjnych dla trudnych scenariuszy (wiele nazwisk, przecinek używany do rozdzielania nazw na liście i nazwisk). Powiedziawszy to, jest to deterministyczny analizator składni (z użyciem tego grammar) i są pewne przypadki, których nie będzie on obejmować.

Oto Twój przykład:

require('namae') 

Namae.parse 'John Smith and John Smith, Jr. and John Smith Jr and John Smith XIV' 
#=> [ 
    #<Name family="Smith" given="John">, 
    #<Name family="Smith" given="John" suffix="Jr.">, 
    #<Name family="Smith" given="John" suffix="Jr">, 
    #<Name family="Smith" given="John" suffix="XIV"> 
] 

on zmaga się z tytułem doktora, ale to coś może być w stanie naprawić.

2

Jest oparty parser Perl dostępne zrobić ten typ ekstrakcji http://search.cpan.org/~kimryan/Lingua-EN-NameParse/

Pobiegłem go poprzez swoje przykłady, aby uzyskać następujące results.It obsługuje tylko porządkowe przyrostków do 12 (XII), a także nie rozpoznaje . w Ph.D więc musiałem zmienić to w twoich danych wejściowych

JOHN SMITH        John        Smith      
JOHN SMITH, JR.       John        Smith    Jr  
JOHN SMITH JR.       John        Smith    Jr  
JOHN SMITH XII       John        Smith    XII  
DR. JOHN SMITH, PHD    Dr.  John        Smith    Phd