跳转到主要内容

生成随机名称

项目描述

根据美国人口普查数据或您提供的文件生成随机名称。

基本用法

使用censusname最简单的方法是使用generate方法。它根据2000年人口普查中的姓和名分布生成名称。它有一半的概率提供来自femalemale列表的姓氏。

import censusname
censusname.generate()
'Jane Smith'

或者,在命令行中运行

python -m censusname

使用name_format参数可以最简单地自定义Censusname。它接受一个包含两个格式化键的字符串:'given'和'surname'(格式应类似于Python的str.format内建函数)。

import censusname

# Generate first names
censusname.generate(nameformat='{given}')
'Linda'

# Generate names in last, first format
censusname.generate(nameformat='{surname}, {given')
'Nguyen, Pamela'

方法和对象

generate

生成随机名称。下面详细说明有效参数。

Censusname

在Censusname对象的默认实例上调用generate方法。Censusname是模块的核心,可以通过自定义格式和自定义名称列表创建实例。

关键字参数:nameformat,namefiles,max_frequencies,formatters,capitalize。

from censusname import Censusname

last_first = Censusname(nameformat='{surname}, {given}')
last_first.generate()
'Lashley, Emily'

Censusname.generate

C = Censusname()
C.generate()
'Michael Fox'

# Add the same middle initial to all names
C.generate(nameformat='{given} J. {surname}')
'Michael J. Fox'

名字的每一部分都是一个关键字参数。默认数据集包括按男女分开的给定名字文件。可以指示模块始终使用某个特定文件。

C.generate(given='female')
'Caroline Dippold'

由于 nameformat 的参数传递给了 Str.format,因此可以使用任何字符串格式化选项,如填充。

C.generate(nameformat='{given:10}', given='male')
'Charles   '

在 censusname 中,默认数据集提供全部大写的名字,并且 censusname 将它们改为标题大小写。可以通过 capitalize 参数关闭此功能,该参数适用于 CensusnameCensusname.generate

C.generate(capitalize=False)
'WES REAVES'

# or, create your own Censusname object
from censusname import Censusname
C = Censusname(capitalize=False)
C.generate()
'JOSE PETRIE'

是的,capitalize=False 导致名字大写有点奇怪。false 省略了 str.capitalize,因此原始数据中的默认大写格式得以显示,恰好是全部大写。您可以自定义模块的任意重新格式化方法。请继续阅读!

高级

您可以将自己的名字文件传递给 Censusname 以生成具有任意格式的名字。对于名字的每个部分,可以使用不同的文件集。如果您有按时间、地理或其他变量分解的名字数据,这将很有用。默认情况下,1990年的男性和女性名字数据与2000年的姓氏数据合并。

文件必须有两个字段:namecumulative_frequency。默认情况下,该软件包期望逗号分隔的文件,但您可以通过 csv.DictReader 参数传递参数 csv_args

cumulative_frequency 字段应根据升序频率计算,并且应在 0 到某个最大值之间 - 请参阅下面对 max_frequencies 的讨论。

默认情况下,名字生成器查看男性和女性名字的单独列表。您可以指定任意分组的名字列表。假设您有两个西班牙省份的名字分布数据。在西班牙,使用两个姓氏:父姓和母姓,所以您有四个姓氏文件,以及男性和女性名字的一般文件。

my_files = {
    'given': {
        'male': 'given-male.txt',
        'female': 'given-female.txt'
    },
    'paternal': {
        'sevilla': 'paternal-sevilla.txt',
        'toledo': 'paternal-toledo.txt'
    },
    'maternal': {
        'sevilla': 'maternal-sevilla.txt',
        'toledo': 'maternal-toledo.txt'
    }
}

# Perhaps you want to specify arguments to csv.DictReader, which will be reading the files
my_csv_args = {
    # Any arguments that can be passed to DictReader
}

美国人口普查的名字文件不包含每个名字,只包含约 90% 的人口。考虑到这一点,random_name 可以接受 max_frequencies 参数来给出这些最大值。我们用字典指定这些最大值,其键是文件名。如果您提供了自定义文件但没有 max_frequencies,则将使用 100。 (最大频率为默认文件硬编码。)

# These are made-up numbers. Perhaps you prefer percentages:
maximums = {
    'given-male.txt': 89.7,
    'maternal-sevilla.txt': 90.4,
    # etc
}

# Or, you have a file where frequencies go from 0 to 1:
maximums = {
    'given-male.txt': 0.897,
    'maternal-sevilla.txt': 0.904,
    # etc
}

此外,我们希望在名字中使用标准连词

my_format = '{given} {paternal} y {maternal}'

使用这些示例生成名字

from censusname import Censusname

espana_nombre = Censusname(nameformat=my_format, namefiles=my_files, max_frequencies=maximums, csv_args=my_csv_args)

# Generate a name of the format 'Given Paternal y Maternal'
espana_nombre.generate()
'Luis de Góngora y Argote'

# Use a different format:
espana_nombre.generate(nameformat='{given} {paternal} de {maternal}')
'Pedro López de Ayala'

# Pick a name from the Sevilla files:
espana_nombre.generate(maternal='sevilla', paternal='sevilla')

# Pick a female name from the Toledo files:
# Note that any of the keys in my_files can be used as keyword arguments. The values should be keys from the respective dictionary.
espana_nombre.generate(given='female', maternal='toledo', paternal='toledo')

# By default, names are capitalized (title case).
# Generate a name using given capitalization in the files:
espana_nombre.generate(capitalize=False)

# By default, there's an equal probability of producing a name with a part from the Sevilla or Toledo lists.
# You have to do a little extra to weight that probability.
# Specify an 75% chance of a sevilla name, 25% chance of a toledo name:
province = random.choice(['sevilla'] * 3 + ['toledo'])
espana_nombre.generate(paternal=province, maternal=province)

示例:中间名字

使用内置数据通过随机选择第一个或最后一个名字来伪造中间名字

import censusname

namefiles = censusname.NAMEFILES

# Add a middle name entry to the name files
namefiles['middle'] = {
    'last': censusname.SURNAME2000,
    'female': censusname.FEMALEFIRST1990,
    'male': censusname.MALEFIRST1990
}

middlenames = censusname.Censusname(namefiles, censusname.MAX_FREQUENCIES, '{given} {middle} {surname}')

# Generate a name in the format "given, middle, surname"
# However, this might return unlikely names
middlenames.generate()
'John Mary Smith'

# Generated name will have a male first name and either a male given name or a surname as a middle name
middlenames.generate(given='male', middle=['male', 'last'])
'Charles Michael Brescia'

# Generated name will have a female first name and either a female given name or a surname as a middle name
middlenames.generate(given='female', middle=['female', 'last'])
'Mildred Hoang Hutton'

格式化器

您可以在返回之前对名字的每一部分运行任意的重新格式化方法。默认情况下,该软件包包括一个姓氏格式化器,该格式化器尝试智能地格式化原始名字,如 OHALLORAN(到 O’Halloran)。

您可以使用字典指定格式化器,该字典针对名字的每一部分。格式化器应是一系列方法。

my_formatters = {
    'given': [lambda x: x[::-1]], # reverse a string
    'surname': [lambda x: "De " + x],
}

cn = Censusname(formatters=my_formatters)
cn.generate()
'ekiM De Morgan'

可以添加到 Censusname.generate 的附加格式化器,它们将在对象中包含的任何格式化器之后运行。

more_formatters = {
    'given': [lambda x: x.replace('a', 'b')]
}

cn.generate(formatters=more_formatters)
'nbhtbN De Scardino'

请注意,向 censusname 传递格式化器参数将排除默认姓氏格式化器。尽管如此,保留它也很容易。

import censusname

my_formatters = {
    'surname': [censusname.formatters.recapitalize_surnames, custom_fuction]
}

由以下支持