GO name2gender

Aus archium.org
Wechseln zu: Navigation, Suche

Überprüft anhand von Übereinstimmungskriterien, ob ein Vorname eher männlich oder eher weiblich ist um z.B. eine nicht näher definierte Anrede so verläßlich wie möglich als Herr oder Frau bestimmen zu können. Sehr gute Vorarbeit bei der Sammlung aussagekräftiger Wortendungen wurde hierzu geleistet von: http://www.herber.de/...

Bei der Bewertung der Endungen erhalten hier jedoch längere Übereinstimmungen entsprechend ihrer Wortlänge einen höheren Wert, schließlich sind längere Zeichenketten aussagekräftiger als kürzere.

package main

import (
	"fmt"
	"os"
	"strings"
)

var signals [][][]string = [][][]string{
	{
		// Female
		{"a", "e", "i", "y"},
		{"ah", "al", "bs", "dl", "el", "et", "id", "il", "in", "it", "ll", "th", "ud", "uk"},
		{"ary", "aut", "bel", "des", "dis", "een", "efa", "eig", "ett", "fer", "got", "ies", "ild", "ina", "ind", "ion", "itt", "jam", "joy", "Joy", "kim", "lar", "len", "lis", "lyn", "men", "mor", "oan", "ren", "rin", "res", "rix", "run", "san", "tas", "udy", "urg", "vig"},
		{"ardi", "atie", "borg", "cole", "endy", "gard", "gart", "gnes", "gund", "iede", "indy", "ines", "iris", "iris", "ison", "istl", "ldie", "lilo", "lind", "loni", "lott", "lynn", "mber", "moni", "nken", "oldy", "quel", "riam", "rien", "sann", "smin", "ster", "uste", "vian", "vien"},
		{"achel", "agmar", "almut", "becca", "candy", "doris", "echen", "edwig", "irene", "mandy", "rauke", "sandy", "sther", "uriel", "velin", "ybill"},
		{"irsten", "lilian", "lorene", "almuth"},
	},
	{
		// Male
		{"f", "g", "o", "r", "s", "t", "z"},
		{"ai", "an", "ax", "ay", "dy", "en", "ey", "fa", "gi", "hn", "im", "iy", "ki", "ld", "lm", "nn", "oy", "pe", "rc", "rd", "ri", "rk", "ry", "ua", "us", "uy", "ve", "we", "zy"},
		{"ael", "ali", "aid", "ain", "are", "arl", "aul", "bal", "bby", "bin", "cal", "cca", "cel", "cil", "cin", "dal", "die", "don", "dre", "ede", "eil", "eit", "emy", "eon", "ffer", "gon", "gun", "hal", "hel", "hil", "hka", "ich", "iel", "ill", "ini", "kie", "lev", "lge", "lip", "lix", "lon", "lob", "lte", "lja", "mal", "met", "mil", "min", "mon", "mre", "mud", "muk", "nid", "nik", "nsi", "oah", "obi", "oel", "örn", "ole", "oni", "oly", "phe", "pit", "rcy", "ram", "rdi", "rad", "red", "rel", "ric", "rge", "rka", "ron", "rnd", "rne", "rre", "rti", "sil", "son", "sse", "ste", "tie", "tof", "ton", "uce", "udi", "uel", "uli", "uke", "uwe", "vel", "vid", "vin", "wel", "win", "xei", "xel"},
		{"abel", "akim", "asan", "atti", "dres", "eith", "elin", "ence", "ffer", "frid", "gary", "gene", "hane", "hard", "hein", "idel", "iete", "irin", "jona", "kita", "kola", "land", "lion", "levi", "luka", "mike", "mund", "muth", "nand", "naud", "neth", "niel", "nnie", "ntin", "nuth", "ommy", "önke", "ören", "pete", "rank", "rene", "rick", "ried", "ries", "rlin", "rome", "rtin", "stas", "tell", "tila", "toph", "tony", "tore", "uele"},
		{"astel", "benny", "billy", "billi", "elice", "ianni", "laude", "danny", "dolin", "ormen", "ronny", "seyin", "ustel", "ustin", "vanni", "willi", "willy"},
		{"iedrun", "hilipp"},
	},
}

const usageString string = "usage: name2gender -n name [-g m,w,n] \n\n" +
	"arguments:\n" +
	"  -n              name\n" +
	"  -g (optional)   gender list e.g. \"male,female,device\"; (default: \"m,w,n\")\n\n" +
	"http://www.archium.org"

var gender = [3]string{"m", "w", "n"}
var name string
var testosteron, oestrogen, hormonspiegel uint8

func main() {
	switch len(*(MapCLIArguments())) {
	case 2:
		copy(gender[:], strings.Split((*(MapCLIArguments()))["-g"], ",")[:])
		fallthrough
	case 1:
		name = (*(MapCLIArguments()))["-n"]
		if name != "" {
			break
		}
		fallthrough
	default:
		fmt.Println(usageString)
		return
	}

	for i := (uint8)(0); i <= 1; i++ {
		for j := 0; j < len(signals[i]); j++ {
			for _, kv := range signals[i][j] {
				if value := j + 1; endOfString(name, value) == kv {
					hormonspiegel += uint8(value)
				}
			}
		}
		if i == 0 {
			oestrogen = hormonspiegel
		} else {
			testosteron = hormonspiegel
		}
		hormonspiegel = 0
	}
	if testosteron > oestrogen {
		fmt.Println(gender[0])
	} else if testosteron < oestrogen {
		fmt.Println(gender[1])
	} else {
		fmt.Println(gender[2])
	}

	// Aber notwendig ist selbst das nicht. Anonymen Funktionen können die Parameter direkt übergeben werden:
	fmt.Println(func(a, b int) int {
		if a > b {
			return a
		} else {
			return b
		}
	}(3, 4)) // 4

}

func endOfString(chars string, digits int) string {
	length := len(chars)
	min := func(a, b int) int {
		if a < b {
			return a
		} else {
			return b
		}
	}
	return chars[length-min(digits, length) : length]
}

func MapCLIArguments() *map[string]string {
	cliAguments := os.Args[1:]
	var cliAgumentsMapped map[string]string = make(map[string]string)
	for key, value := range cliAguments {
		if value[0:1] == "-" {
			if len(cliAguments) > key+1 && cliAguments[key+1][0:1] != "-" {
				cliAgumentsMapped[cliAguments[key]] = cliAguments[key+1]
			} else {
				cliAgumentsMapped[cliAguments[key]] = ""
			}
		}
	}
	return &cliAgumentsMapped
}