Ustalanie płci na podstawie imienia i nazwiska / Sex determinator

0

Cześć. Muszę napisać klasę, której zadaniem jest określać płeć osoby na podstawie imienia i/lub nazwiska.
Imion i nazwisk jest dużo a dodatkowo użytkownicy nie zawsze podają imię i nazwisko normalnie - czasem świrują.
Liczę, że 90% wyników będzie dobrych (błędne diagnozy będą potem poprawiane ręcznie).

Niżej podaję przykładową próbkę :

Seba
Mati
Ryszardo
Andżelika Myu
Neli Rokita
Juleczka Bubu
Anna Nowak
Jak Kowal
Kuba Ernest Kowalski
Jan Neli Rokita
Bartosz Visecky
Wojtek Kashkash
Alan Melone
Katarzyna Patrycja Drabczyk
Martyna Kozak
Caroline Żabusiek

Wie ktoś jak kto najlepiej zrobić?
Jakiś prosty regex? albo jakaś lista polskich imion, nazwisk per płeć - tylko jest ona gdzieś w necie dostępna?
Z listą to mogłabym sprawdzać nawet jakieś string similarity.
Chcę to zrobić jak najprościej, małym nakładem żeby było te 90% skuteczności.

moja aktualna implementacja:

package pl.springbreakers;

import pl.springbreakers.model.Sex;

import javax.annotation.Nullable;
import javax.inject.Named;

@Named
public class PolishSexDeterminator {

    public Sex determine(final String name, @Nullable final String surname) {
        return null;
    }
}
2

Nie wiem czy da się takie coś zrobić inaczej niż posiadając bazę imion i mapując poszczególne imiona na płeć. Chyba najpewniejszy sposób.

http://stackoverflow.com/questions/818203/does-anyone-know-of-a-good-library-for-mapping-a-persons-name-to-his-or-her-gen

5

Moja rada nie rób tego. Często wychodzą z tego niezłe WTF.
Przykładowo dziewczyna nagle nie mogła wejść na siłownię, bo została uznana za faceta tylko dlatego, że wpisała prefix "dr" przed imieniem. To tylko jeden przykład a takich dziwnych corner case jest dużo więcej i często nie można przewidzieć konsekwencji.
Miałem kolegę, który miał na imię Zawisza a końcówka "a" powoduje, że większość takich automatów (zwłaszcza opartych o regexp) klasyfikują go jako kobietę.
Do tego dochodzą emigranci z różnych dziwnych krajów.

1

Problem co najmniej NP-trudny.

5

@furious programming lepiej mi pomóż z algorytmem a nie mnie ochrzaniasz

Mam kolejny post napisać o tym samym? Dobrze;

Algorytm rozpoznawania płci jest w dzisiejszych czasach absurdalny, tak samo jak absurdalne są nadawane dzieciom imiona; Nawet baza imion to słaby pomysł, bo choć by spełniała założenia, to lepszym rozwiązaniem będzie po prostu dodatkowe pole do wyboru typu płci; Często najprostsze rozwiązania są w praktyce najlepsze;

Ale to tylko moje zdanie.

0
furious programming napisał(a):

lepszym rozwiązaniem będzie po prostu dodatkowe pole do wyboru typu płci.

nooo XD gdybym mogła tak zrobić to bym zrobiła

słowniki:

 curl "http://imiona.nazwiska-polskie.pl/zenskie" | grep "</td><td>" | sed -e 's/<[^>]*>//g' > polish-female-names.txt
 curl "http://imiona.nazwiska-polskie.pl/meskie" | grep "</td><td>" | sed -e 's/<[^>]*>//g' > polish-male-names.txt

oczywiście nie ma Mercedes i Zawisza, ale poki co lepszych nie znalazłam.

2

oczywiście nie ma Mercedes i Zawisza, ale poki co lepszych nie znalazłam.

Przyda się aktualizowanie bazy imion po wprowadzeniu nowego (którego jeszcze nie używano);

PS: Ta strona wydaje mi się mało wiarygodna, widząc na przykład żeńskie imię typu Zuzannna; Na stronie nie ma podanych informacji o źródle imion i o sposobie ich gromadzenia; Wikipedia ma całkiem pokaźną listę imion, przy czym zakładam, że to bardziej wiarygodne źródło.

2

Jest to zadanie skazane na porażkę. Wystarczy, że ankietę wypełni obcokrajowiec i już nie określisz płci.
Jeśli to ma służyć do prawdziwego projektu, to jeszcze będą cię potem przeklinać za brak wyobraźni (tak jak ja przeklinam ludzi, którzy myślą, że każdy mieszka w USA i może wybrać stan z listy na stronie).

Czemu nie zrobisz po prostu pola <select> z wyborem płci? (M, K, nieokreślona).

2

Jest to zadanie skazane na porażkę.

Nie na porażkę, ale 100% trafień się nie uzyska.
90% jest całkiem możliwe.

Czemu nie zrobisz po prostu pola <select> z wyborem płci? (M, K, nieokreślona).

Wybór zrobić i tak trzeba (dla tych 10%), ale na podstawie imienia można ustawiać wartość domyślną.

Co do nazwiska: wyłączając obcokrajowców z polskim nazwiskiem (u których może być z tym bałagan), to można też patrzeć na końcówkę -ski/-ska, -cki/-cka.

1

Myślę, że najłatwiej byłoby to zrobić dostając się do kamery i przepuszczając obraz z kamery przez jakiś analizator twarzy, który wykryłby płeć, wiek, rasę, może nawet religię(jeśli osoba byłaby ubrana w symbole religijne). Wtedy można byłoby jakoś ustalić płeć delikwenta z jakąś tam dużą pewnością. Ew. zrobić skrypt, który by nazwisko wrzucał w google i próbował odnaleźć czyjś profil na facebooku, linkedin itp. i sprawdzał płeć z ww. serwisów.

Albo można się po prostu tak nie bawić i zrobić pole wyboru płci, ew. logowanie facebookiem.

1

Jeśli to jest jakiś crawler to wyjścia nie ma.
Trzeba próbować trafić płeć, ale uzyskanie 99% trafności będzie trudne, 95% powinno być ok. Ja naw wszelki wypadek dodałbym wartości oznaczające niepewność albo brak rozwiązania.

1

Sprawdzać czy imię jest w bazie i dopasować. Jeśli nie ma, to zrobić zapytanie do jakiegoś wikipedia api jak jest/parsować stronę wikipedii na temat imienia (np. https://pl.wikipedia.org/wiki/Zawisza_(imi%C4%99)) i sprawdzić czy występuje tam słowo "męskie" czy "żeńskie"/"masculine" czy "feminine"/"masculine" oraz "feminine" (w przypadku imienia dla obu płci).

Powodzenia :)

0

Dobra póki co użyłam tamtych słowników, dodałam do nich Zawisze i Mercedes i zobaczę w praktyce na realnej próbce jak to się sprawdzi.
Zrobię może sobie mechanizm do dodawania nowych imion do słownika jak będzie wiele braków lub zmienię mechanizm.

@Named
public final class PolishSexDeterminator {

    private final List<String> maleNames = Files.readAllLines(Paths
            .get(getClass().getResource("/dictionaries/polish-male-names.txt").toURI()));
    private final List<String> femaleNames = Files.readAllLines(Paths
            .get(getClass().getResource("/dictionaries/polish-female-names.txt").toURI()));

    public PolishSexDeterminator() throws IOException, URISyntaxException {
    }

    public Optional<Sex> tryDetermine(@Nonnull final String name) {
        final Predicate<String> p = s -> (s.toLowerCase().equals(name.toLowerCase()));

        if (femaleNames.stream().anyMatch(p)) {
            return Optional.of(Sex.FEMALE);
        }

        if (maleNames.stream().anyMatch(p)) {
            return Optional.of(Sex.MALE);
        }

        return Optional.empty();
    }
}
0

Ostatnio oglądałem Top Model na Smart TV z dziewczyną przez tvnowski player i stwierdziłem, że jeśli inteligencja ludzka nie jest w stanie określić czy to chłop czy baba i czy to Kamila czy Kamil to komputer też sobie nie poradzi z tym... :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1