Training Char-RNNs for Transferring Name Styles

Contents

Introduction

Dataset

A few days ago I was enticed into thinking if there is an app for generating names (no, not a startup idea). You know, something along the lines of “generate 10 Indian names”. I didn’t know the answer, but it got me thinking about names. Before the flame of this random musing could die down, I found a dataset of names, thanks to mbejda. The dataset consists of Hispanic, Indian, Caucasian and African American names. I had the dataset, so something had to be done.

RNNs

Now perhaps you have read Karpathy’s fantastic blog on RNNs and what they do.

Here is one of quotes from the blog:

We’ll train RNNs to generate text character by character and ponder the question “how is that even possible?”

Yes, it’s pretty mind-blowing. The blog goes into the details of how it’s done. Here’s a short summary of what RNNs do: RNNs can take a bunch of text, say T, and learn to generate new text that would seem to be taken from T. For example, we can train an RNN on all the works of William Shakespeare, and the RNN can, in turn, generate new text that would seem to be written by Shakespeare. The blog I’ve linked to contains this and many other interesting examples. The way RNNs do this is by learning to “predict the next character” in the sequence given the hitherto seen characters.

Putting it together, I had:

  1. A model that can learn to generate new samples from a piece of text.
  2. A corpus of names.

So it would not be very inspiring if I say that we can use RNNs to generate new names. Yes, we can, and yes, I did. I got an “Indian Name Generator” generating Deepaks and Nehas, a “Caucasian Name Generator” generating Michaels and Jennifers and so on. It was something, but as I said, not very interesting.

Cross Seeding

Now, I didn’t feel like throwing all these RNNs away, so wondered what would happen if I feed, say, the “Indian Name Generator” with a first few characters from a Caucasian name, and let it generate the rest? Will it try to create a name that sounds Indian? So I ran a bunch of these experiments, and present the somewhat more interesting results in this post. I also used seeds from unconventional names, like those of Pokémons and wrestlers. It was fun to see all these different RNNs take a stab at creating a name that sounds to be from their domain:

name seed african_american caucasian hispanic indian all_races
undertaker underta undertall nix# undertan starlir# underta romero# undertala# undertayshawn king#
aman madaan aman mad aman madadenis# aman madich# aman madro l gonzalez# aman madhkaran# aman madha#
jose luis jose l jose l graham# jose l ramirez# jose l morales# jose lal sharma# jose l rodriguez#
hideyoshi hideyo hideyon u bennett# hideyo g morio# hideyordo rodriguez# hideyohar sharma# hideyon d brown#
dan fineman dan f dan f briggs# dan f witharr# dan flekrez# dan farjat saini# dan francersiii#
hulk hogan hulk ho hulk hornes# hulk howstie# hulk hoelles.maldonado# hulk holoo chand singh# hulk holu#


This post has 6 section: The introduction just got over. We’ll now take a quick look at the data, followed by a discussion on how the input is converted to a representation that can be used for training these name generators. We’ll then look at some details of the model, how the predictions are done and the name styles transferred, and finally present the results.

The code, with cleaned + processed dataset, and notes on how to run the training and scoring processes, is located here.

Looking at the Data

Although there is no limit to the number of different analysis we can run, we’ll present only two here in the interest of space (and the attention span): i) the most popular names and ii) the name length distributions. Looking at the most popular names will give us a feel for the dataset, and the name length distributions were added to add more plots and make this post look fancier (and it’s used somewhere down the line, too).

The following tables list the top 5 most popular names for each of the races. Please note that the first and the last names are listed separately (e.g., Latoya Williams is not the most popular African-American female name; Latoya is the most popular first name for African-American females, and Williams is the most popular last name for African-American females).

African American      
Female First Names Female Last names Male First Names Male Last Names
latoya williams michael johnson
ashley johnson james brown
patricia brown anthony jones
angela smith willie jackson
mary jackson robert davis
Caucasian      
Female First Names Female Last Names Male First Names Male Last Names
jennifer smith michael johnson
amanda brown james rodriguez
kimberly williams robert davis
jessica miller david jones
ashley johnson john brown
Hispanic      
Female First Names Female Last Names Male First Names Male Last Names
maria rodriguez jose rodriguez
melissa gonzalez juan garcia
jennifer rivera luis martinez
gloria perez carlos rivera
elizabeth garcia jorge hernandez
Indian      
Female First Names Female Last Names Male First Names Male Last Names
smt devi deepak kumar
pooja pooja rahul singh
smt. kumari amit sharma
jyoti jyoti ram lal
kumari bai sanjay ram
Name Length Distributions

The name length distributions are next plotted for each of the races. It seems like short names (perhaps without a surname) are popular among Indians, giving rise to the minor mode in the distribution. Hispanic names tend to be longer, as indicated by the fat tail following the mean. 15-ish seems to be the most popular name length across the races (here’s one thing you can take away from the post).

African American Names Caucasian

Hispanic Indian

Input Representation

In this section, we will spend some time looking at how do we take a bunch of these names and convert them into a form that can be fed to an RNN. We will get to that representation in three steps: encoding, standardization, and embeddings.

a) Encoding

We convert each character in a (string) name to a number using the following mapping:

Character Encoding
a-z 0-25
” “ (Space) 26
”#” (End of Name) 27
. (Invalid Character) 28

All the names are converted to lowercase English alphabets, with a space separating different components of a name. Every name ends with a special name end character (“#”). Every other character is mapped to a “.”, an invalid character substitute. For example, “joe” would be converted to [9 14 4 27].

b) Standardization

Name lengths are anything but a constant, as seen from the length distributions. However, we are using “unrolled” RNNs, and thus we need to fix on a maximum name length. Names longer than the maximum name length will be truncated, and names shorter than the maximum name length will be padded with “.” (invalid character). As discussed, we assume that every name ends with a “#,” the name end character. All of this happens in the following piece of code:

def encode_and_standardize(name):
   name = name + CharCodec.NAME_END #add the end of the name symbol for everyname
   name = CharCodec.encode(name) #encode
   if name_len >= CharCodec.max_name_length:
       truncated_name = name[:(CharCodec.max_name_length - 1)]
       truncated_name.append(CharCodec.char_to_class[CharCodec.NAME_END]) #must attach the name end
       return np.array(truncated_name, dtype=np.int32)
   else:
       padded_name = np.empty(CharCodec.max_name_length, dtype=np.int32)
       padded_name.fill(CharCodec.INVALID_CHAR_CLASS)
       padded_name[:name_len] = name
       return padded_name

Note that we retain the name end character (#) even after the truncation.

So how do we arrive at the max_name_length? A simple way to do that is fix on a large number, like 100. However, that would mean that our network will be wider than we perhaps want (most of the names will be smaller than 100 characters). This will lead to lots of wasted computation and slower training times (give it a try!). Or, we could plot a distribution of the name lengths and pick something simple. We’ve already done that, and as you can see, it seems like 25 will cover most of the cases, and we add one space to accommodate the name end marker, “#.” Thus, all the names are standardized to length 26. At this point, the string name “joe” has become an array of 26 numbers, [ 9 14 4 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28].

c) Embeddings

So far, we have standardized each name to a fixed length, added a character to mark the end of the name, and encoded the name from an array of chars to an array of integers.

If you don’t know what embeddings are at all, I recommend checking out this or this link.

The tl;dr of the technique is that each of the characters is mapped to an array of numbers. The array is called an embedding, and the length of the array is the dimensionality of the embedding. For example, if we choose to use 5-dimensional embeddings, it just means that every character is mapped to a 5-dimensional real vector. We can start with pre-trained embeddings, or learn them as part of the training process, which is what our model does. In our setting, that means that we will hopefully learn embeddings that makes it easier for us to predict the next character in the name. With 5-dimensional embeddings, “joe” will now be a matrix of 26 rows and five columns.

The following three lines of code is all that’s needed add embeddings. embeddings is a matrix, which has one row for each character in our vocabulary. Concretely, if we had used 5-dimensional embeddings, the embeddings matrix would have the dimensions 29 x 5; each of the characters would have a corresponding array of length 5. tf.nn.embedding_lookup takes in the input, which is batch_size x max_name_length, and maps (looks up) each character in the standardized name to an embedding, to yield an input with dimensions batch_size x max_name_length x n_embeddings.

names = tf.placeholder(tf.int32, shape=(None, max_name_length), name="input")
embeddings = tf.Variable(tf.random_uniform([vocab_size, n_embeddings], -1.0, 1.0))
embedded_names = tf.nn.embedding_lookup(embeddings, names) #(?, max_name_length, n_embeddings)

Tensorboard can help in visualizing embeddings using PCA and t-SNE. The t-SNE visualization of the embedding matrix from the Indian name generator is as follows. As you can see, the vowels are all close to each other, which hints at the fact that the learned embeddings wrap some linguistic properties of the names pertaining to the race, and are perhaps useful in generating new ones.

Embeddings
Embeddings learned by the Indian Name Generator visualized using Tensorboard

Model

The particular form of RNNs that we use for this exercise is an LSTM. This book has a pretty good explanation of the LSTMs, and this neat blog post is another standard reference for the topic. A high-level overview of the model follows. Each character in the normalized name is converted to the corresponding embedding vector, and the entire input name becomes a matrix or name embeddings. The name embeddings are then fed to the first LSTM in the stack. The output from this first LSTM is fed to a second LSTM. The second LSTM is connected to a dense layer, which emits a logits vector of length 29. An argmax over the logits vector is used to calculate the loss and generation. A diagram of the computation graph generated by Tensorboard is as follows:

Model Architecture
The overall model setup generated by tensorboard. The input Embeddings are fed to stacked LSTMs, which in turn feed to a dense layer

An instance of the model with made up numbers is shown below. It’s a replica of this diagram from this blog I’ve already linked to.

Model Example
A sample instance of the model. The input name is “Amy#” (# being the end of the name character). At each step, the network is expected to predict the next character. Thus, at step 1, the expected output is “M”, the 2nd character. At step 2, the expected output becomes the 3rd character, Y. As explained in the encoding section, the characters after the “#”, “.”, are invalid characters added for padding.

Transferring Name Styles

Since we have discussed a lot, let’s quickly recap before moving ahead. Some of the following may seem to be a repeat from the introduction because it sort of is.

  • Dataset: We have a dataset of names from different races.
  • Generator: We have discussed a model that can be trained to predict the next character given a sequence of characters. Let’s call this model the generator.

We train one generator per dataset. Thus, we have a model that has learned to predict the next few characters in an Indian name given the first few, and so on. We then seed each of these generators with a few characters from a name, say “Der” from “Derek,” and compare the results.

The prediction process is illustrated in the figure below, followed by the code.

Prediction Process

Code:

res = seed
initial_seed_offset = len(seed)
for i in range(CharCodec.max_name_length - len(seed)):
    feats = CharCodec.encode_and_standardize(res).reshape(1, CharCodec.max_name_length)
    prediction = sess.run(model.prediction, feed_dict={names: feats})
    res += " ".join(CharCodec.decode(prediction[0])[i + initial_seed_offset - 1])
    if res[-1] == CharCodec.NAME_END:
        break

Results

The results are compiled in the following table. The first column is the name, the second the seed used as an initial input to the model. The subsequent columns list the names generated by the different generators using the given seed.

name seed african_american caucasian hispanic indian all_races
zhang wei zhan zhankhea l stencor# zhane a nelson# zhanole s estrada# zhanna sankar# zhanson e martin#

In the above example, the seed used is “zhan,” from the Chinese name “zhang wei.” All the networks take this tricky seed and generate a name that finally looks like a name from the given model. For example, the African-American generator yields “zhankhea l stencor” (the “#” is the end of the name marker), the caucasian generator yields “zhane a nelson” and so on.

Results from this test file are as follows. I hope the post was useful, please feel free to contact me for any questions/comments at amn.madaan@gmail.com.

Thanks!

name seed african_american caucasian hispanic indian all_races
derek vroom de derrick l curtis# dennis r coleman# dennis r suro# deepak . pardeep# derrick l brown#
derek vroom derek derek a clark# derek a hardellin# derek m sanchez# derekha bhai# derek a carter#
derek vroom derek vr derek vright# derek vraworit# derek vrkilla.carcial# derek vrasha# derek vrow#
dan fineman da david l morgan# david l mccoy# daniel carachure# dalip shah# david l brown#
dan fineman dan f dan f briggs# dan f witharr# dan flekrez# dan farjat saini# dan francersiii#
dan fineman dan fine dan finette tyrel# dan fines# dan finera.garcia# dan fine# dan fine#
carolyn kennedy car carlos e jr robinson# carlos r reyes# carlos a guerra# carta# carlos a cardona#
carolyn kennedy carolyn carolyn r miller# carolyn a roe# carolyno jr rodriguez# carolynir# carolyn r martinez#
carolyn kennedy carolyn ken carolyn kendry# carolyn kendrick# carolyn kendeles.rodriguez carolyn kent# carolyn kent#
michael zuckerberg mich michael a chapman# michael a mckinney# michael a martinez# michael# michael a mccormick#
michael zuckerberg michael z michael z chatman# michael z baker# michael z martinez# michael zah# michael z russell#
michael zuckerberg michael zucke michael zuckenne# michael zuckellan# michael zucke# michael zuckena# michael zuckelli#
gary yao ga gary l hayes# gary w jr davis# gabriel a romero# gaurav sharam# gary l baker#
gary yao gary gary l hayes# gary w jr davis# gary avila# gary# gary l baker#
gary yao gary y gary y jr brown# gary yancey# gary y avares# gary yadav# gary yadav#
pranay chopra pra pradel lucas# praie r saliska# pramie rivera# pramod kumar tiwari# pramod kumar tiwari#
pranay chopra pranay pranay s mccarter# pranayoos n santana# pranay a gonzalez# pranayavara bijgut# pranayan devi#
pranay chopra pranay ch pranay charlon# pranay chess# pranay chaveda# pranay chawla# pranay chand#
mayank bhardwaj may maydreona l miles# maykel c calderon# maynor padilla.estrada# maya kumari# maya devi#
mayank bhardwaj mayank mayank redison# mayank j romero# mayank h rodriguez# mayank .aakash# mayank pandey#
mayank bhardwaj mayank bhar mayank bharder# mayank bharresse# mayank bharque# mayank bhardwaj# mayank bhardwaj#
aman madaan am amos e robinson# amanda l hatcher# amalio rivera# amit kumar singh# amanda l hutchinson#
aman madaan aman aman j joseph# aman p jr marshall# aman f rivera# aman saroj# aman sharma#
aman madaan aman mad aman madadenis# aman madich# aman madro l gonzalez# aman madhkaran# aman madha#
priyanka lingawal priy priy loveranc# priye j mergtone# priy g martinez# priyanka . pinki# priyanka . pinki#
priyanka lingawal priyanka priyankauguson# priyanka l monagan# priyankaune# priyanka . pinki# priyanka . pinki#
priyanka lingawal priyanka lin priyanka linkley# priyanka linto# priyanka linorriz# priyanka linditay# priyanka linda#
uma sawant um umar a hassan# umid r mann# umeliar m sanchez# uma . barkha# uma devi#
uma sawant uma s uma stimer l jenkins# uma s vancey# uma s muniz# uma shankar soni# uma shankar#
uma sawant uma saw uma sawrm crow# uma sawyornig# uma sawillas# uma sawan# uma saweer#
ankur dewan an anthony l mcclain# anthony r horn# antonio r hernandez# anil kumar sain# anthony j perry#
ankur dewan ankur ankurick reed# ankur m davis# ankur mondales# ankur kumar# ankur sharma#
ankur dewan ankur de ankur dewin# ankur dehalf# ankur delapamill# ankur devi# ankur devi#
rahul gupta ra raymond l hopps# randall l rice# ramon a feliciano# ram sagar# raymond l holland#
rahul gupta rahul rahuleshor c robbin# rahul a jr gonzalez# rahul g martinez# rahul sharma# rahul sharma#
rahul gupta rahul gu rahul gudert# rahul guenoa# rahul gutineza# rahul gupta# rahul gupta#
zhang wei zh zhivago rodgers# zhenya v deckarri# zhecory colinza# zhini devi# zhenya santana#
zhang wei zhan zhankhea l stencor# zhane a nelson# zhanole s estrada# zhanna sankar# zhanson e martin#
zhang wei zhang zhang m forbeson# zhang j henderson# zhang g diaz.hernandez# zhang depo# zhang r johnson#
wang xiu ying wan wanda j malone# wanda j dentoscionle# wanda rodriguez# wani bhavi# wanda j davis#
wang xiu ying wang x wang x jamison# wang x bailey# wang x rodriguez# wang xai d.o lageh ri par# wang xiluseiia mond#
wang xiu ying wang xiu wang xiu douglas# wang xiu r mccall# wang xiu castillo# wang xiu shaker# wang xiu santing#
hideyoshi hi hillard j london# hilario m gomez# hiram a maldonado# himanshu . annu# himanshu . annu#
hideyoshi hide hideajrake redmon# hidel f martinez# hidel garcia# hidee chaudhry# hidena#
hideyoshi hideyo hideyon u bennett# hideyo g morio# hideyordo rodriguez# hideyohar sharma# hideyon d brown#
zhang xiu ying zha zharran e austin# zhays j notz# zhanole s estrada# zhanna sankar# zhayni essidion#
zhang xiu ying zhang x zhang x hall# zhang x herty# zhang x corrova# zhang xeta# zhang x i barraman#
zhang xiu ying zhang xiu zhang xiu donner# zhang xiu r brack# zhang xiu cardenas# zhang xiu w.o# zhang xiu partadill#
hashimoto ha harry l jr caine# harold d minor# harold a cardenas.valenci# harish chand dua# harold l harris#
hashimoto hash hashantae walleggter# hashia l sannero.ferzill.c hashus rodriguez.gutierre# hashim# hashim#
hashimoto hashim hashimmela j slove# hashim naviguenteras# hashimaer m gonzalez.matha hashim# hashim#
shinzo abe sh shantae d dennis# shannon l bennett# shawn d rodriguez# shankar lal gopalani# shane a brown#
shinzo abe shinz shinzella b dowers# shinzeyne a scharden# shinz a medina# shinz yadav# shinza delvacy#
shinzo abe shinzo shinzo iii hardy# shinzo a dejesunnell.igos# shinzo d rodriguez# shinzo . raju# shinzo . ammo#
maria guadalupe mar marcus d cook# mark a beasley# mario a martinez# mariyam . sonam# mark a barnes#
maria guadalupe maria g maria green# maria g pierce# maria g serrano# maria garg# maria g castillo#
maria guadalupe maria guada maria guada# maria guadaguez# maria guadal.pont# maria guadal# maria guada#
jose luis jo john l graham# joseph a bernston# jose a correa# joyti sharma# joseph a brown#
jose luis jose joseph l henry# joseph a bernston# jose a correa# josender sharma# joseph a brown#
jose luis jose l jose l graham# jose l ramirez# jose l morales# jose lal sharma# jose l rodriguez#
veronica ve vernon l hankerson# vernon r locke# veronica hernandez# veer bhan# vernon l brown#
veronica vero veronica m butler# veronica b jamison# veronica hernandez# veronika bhinder# veronica l brown#
veronica veroni veronica m butler# veronica b jamison# veronica hernandez# veronika bhinder# veronica l brown#
juan carlos ju julius mcdaniels# justin a moore# juan c montalba# julfi . sonu# justin l barnette#
juan carlos juan juan p laster# juan c martinez# juan c montalba# juan morji# juan c castillo#
juan carlos juan car juan cardonas# juan carranza# juan carrillo# juan carodhari# juan cardona#
rosa maria ro robert l moore# robert l bresteane# roberto c munoz rivera# rohit agrawal# robert l jr marshall#
rosa maria rosa rosa a hobbs# rosa m demerd# rosa m torres# rosa kalah# rosa a johnson#
rosa maria rosa ma rosa mannt# rosa martinez# rosa mata# rosa mani# rosa massey#
francisco javier fran frank j brown# frank e carballo# francisco j mendez# frana# frank l jr bennett#
francisco javier francisc francisco a nunez# francisco gonzales# francisco j mendez# francischan# francisco j mendez#
francisco javier francisco ja francisco javen# francisco jaza.torrez# francisco jaigue# francisco jain# francisco jaramaz.ramos#
maria elena ma marcus d cook# mark a beasley# mario a martinez# manish kumar mandal# mark a barnes#
maria elena maria maria murray# maria l west# maria g serrano# mariam mumtaz# maria l lassinorino#
maria elena maria el maria ellis# maria elweow# maria elaramdo# maria elam# maria eller#
brianna b brandon m fleming# brandon l holland# bryan santana# bharat bhushan# brian k bradley#
brianna bri brian k brickhound# brian k saitham# brian n acosta# brij mohan thakur# brian k bradley#
brianna brian brian k brickhound# brian k saitham# brian n acosta# brianti# brian k bradley#
chloe c charles e hall# christopher m brannon# carlos a guerra# chander shekhar# christopher m mcclendon#
chloe ch charles e hall# christopher m brannon# christian rivera# chander shekhar# christopher m mcclendon#
chloe chl chlente chasbin# chloe p johnson# chlistonae a funsez# chlepal# chletu s jr marshall#
destiny d david l morgan# david l mccoy# daniel carachure# deepak . pardeep# david l brown#
destiny des desmond t baker# desiree l barnett# dessie santiago# desh raj# desmond t harris#
destiny desti destiny j rios# destiny straton# destin santiago# desti# destiny j brown#
jeremiah je jermaine l martin# jeremy m morrison# jesus m salinas# jeet pal .jitu# jeremy l coleman#
jeremiah jere jeremy a lee# jeremy m morrison# jeremy o burgos# jerender singh# jeremy l coleman#
jeremiah jeremi jeremiah d preister# jeremiah m conner# jeremias v gomez# jeremi rana# jeremiah d brown#
josiah j james l caldwell# joseph a bernston# jose a correa# jai kishan gupta# joseph a brown#
josiah jos joseph l henry# joseph a bernston# jose a correa# josin jomon# joseph a brown#
josiah josi josiah m beachem# josian montanez# josie a rivera# josin jomon# josiah m martinez#
undertaker un undray anderson# uney s mendes# unesto brito# unknown . monu# undrae m mcclellan#
undertaker under underially r ivy# underico cabez.garcia# under p maldonado# under jain# underick j collins#
undertaker underta undertall nix# undertan starlir# underta romero# undertala# undertayshawn king#
yokozuna yo yolanda y kryger# yosmanis a cruz# yovanny z bautista# yogesh chahar# yogesh chandra jo#
yokozuna yoko yokondrae o hurdolk# yoko d chambers# yokonnihua f seplano# yoko# yokoshania c carter#
yokozuna yokozu yokozull bowell# yokozuma c adams# yokozua l uerda# yokozuddina# yokozua j harris#
andre the giant and andre l arnold# andrew j denny# andres r guajardo# andhav# andrew j brown#
andre the giant andre t andre t mccray# andre t mccoy# andre t salazar# andre topta# andre t morgan#
andre the giant andre the g andre the gilmer# andre the gorsom# andre the garcia# andre the gadar# andre the getti#
big show bi billy r jr collier# billy j ball# billy e caballero reyes# birender kuma .r yadav# billy j banks#
big show big big a mitchell# big p o carson# big mariano# big singh# big nemi#
big show big sh big shardley j jr atturwow big shulte# big shergorio luz# big shan# big sharma#
hulk hogan hu hubert l hunt# hugh walthall# humberto m malagon# husainpreet kour# hugh a holt#
hulk hogan hulk hulk iv herrit# hulk leath# hulk rodriguez.gonzale# hulk mohd# hulk kumari#
hulk hogan hulk ho hulk hornes# hulk howstie# hulk hoelles.maldonado# hulk holoo chand singh# hulk holu#
picachu p patrick l lee# paul a branch# pedro j salazarlopez# parveen kaur . simi# paul j boyd#
picachu pic picky edmores# pick d sansom# picer g melendez# picay . sonu# pick d moran#
picachu picac picace lewis# picacco turdlere u alvie# picacio burgos# picachiram akwal# picace a james#
mewtwo m marcus d cook# michael a mckinney# mario a martinez# manish kumar mandal# mark a barnes#
mewtwo mew mewille m rodriguez# mewald j donnynons# mewel achevedo# mewa aggarwal# mewasui . sanjali#
mewtwo mewt mewtis f jr baken# mewthed shewnert# mewtel diaz# mewta# mewtilles dison#
jigglypuff ji jimmy l jr floyd# jimmy d booher# jimmy r torres# jitender sehrawat# jimmy l barnett#
jigglypuff jiggl jiggl jordan# jigglan a layhorn# jigglan r alvaro# jiggla# jiggl r porter#
jigglypuff jigglyp jigglyphal# jigglyp t cedeno# jigglype vernarda# jigglypri . papa# jigglypu g martin#
bulbasaur bu burnell mckenney# buddy l cook# bulfrano garcia# budh prakash# buddy l mccray#
bulbasaur bulb bulber l hargus# bulbernon k manond# bulbim m rolon# bulbul# bulbul#
bulbasaur bulbas bulbas jr littles# bulbas.san s layvoro# bulbashumald gasialisanosh bulbas# bulbas b rivera#
charizard ch charles e hall# christopher m brannon# christian rivera# chander shekhar# christopher m mcclendon#
charizard char charles e hall# charles e jr hartsfield# charles r murillo# charan singh . minchu# charles a brown#
charizard chariz charizelo m laster# charizy a berry# chariz l martinez# chariz# chariz c hill#
Written on November 18, 2017