<jupyter_start><jupyter_text><jupyter_code>import pandas as pd
import numpy as np
import nltk, random
!git clone https://github.com/jvalhondo/spanish-names-surnames
def fromCSVtoArray(dataPath, genre):
  x_names = pd.read_csv(dataPath)
  x_names = x_names.dropna(axis = 0)
  x_names = x_names['name']
  x_names = np.asarray(x_names)

  return [(name, genre) for name in x_names] 

female = fromCSVtoArray('/content/spanish-names-surnames/female_names.csv', 'female')
male = fromCSVtoArray('/content/spanish-names-surnames/male_names.csv', 'male')
data = female + male

random.shuffle(data)
data[:10]
np.save('names.npy', data)
data = np.load('names.npy')
fset = [(atributos(n), g) for (n, g) in tagset]
train, test = fset[500:], fset[:500]
def ultimaLetra(nombre):
    atrib = {}
    atrib["ultima_letra"] = nombre[-1].lower()
    
    return atrib
def atributos(nombre):
    atrib = {}
    atrib["primera_letra"] = nombre[0].lower()
    atrib["ultima_letra"] = nombre[-1].lower()
    
    return atrib
def atributos1(nombre):
    atrib = {}
    atrib["primera_letra"] = nombre[0].lower()
    atrib["ultima_letra"] = nombre[-1].lower()
    for letra in 'abcdefghijklmnopqrstuvwxyz':
        atrib["count({})".format(letra)] = nombre.lower().count(letra)
        atrib["has({})".format(letra)] = (letra in nombre.lower())
    return atrib
def atributos2(nombre):
    primerSegundoNombre = nombre.split(' ')

    atrib = {}
    for i in range(len(primerSegundoNombre)):
      atrib["primera_letra_{}".format(i + 1)] = primerSegundoNombre[i][0].lower()
      atrib["ultima_letra_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower()
      for letra in 'abcdefghijklmnopqrstuvwxyz':
          atrib["count({})_{}".format(letra, i + 1)] = primerSegundoNombre[i].lower().count(letra)
          atrib["has({})_{}".format(letra, i + 1)] = (letra in primerSegundoNombre[i].lower())
    return atrib
def atributos3(nombre):
    primerSegundoNombre = nombre.split(' ')

    atrib = {}
    for i in range(len(primerSegundoNombre)):
      atrib["primera_letra_{}".format(i + 1)] = primerSegundoNombre[i][0].lower()
      atrib["ultima_letra_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower()
      for letra in 'aeiou':
          atrib["count({})_{}".format(letra, i + 1)] = primerSegundoNombre[i].lower().count(letra)
          atrib["has({})_{}".format(letra, i + 1)] = (letra in primerSegundoNombre[i].lower())
    return atrib
def atributos4(nombre):
    primerSegundoNombre = nombre.split(' ')

    atrib = {}
    for i in range(len(primerSegundoNombre)):
      atrib["primera_letra_{}".format(i + 1)] = primerSegundoNombre[i][0].lower()
      atrib["primera_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][0].lower() in 'aieou'
      atrib["ultima_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower() in 'aieou'
      atrib["ultima_letra_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower()
      for letra in 'aeiou':
          atrib["count({})_{}".format(letra, i + 1)] = primerSegundoNombre[i].lower().count(letra)
          atrib["has({})_{}".format(letra, i + 1)] = (letra in primerSegundoNombre[i].lower())
    return atrib
def atributos5(nombre):
    primerSegundoNombre = nombre.split(' ')

    atrib = {}
    atrib["segundo_nombre"] = len(primerSegundoNombre) > 1
    for i in range(len(primerSegundoNombre)):
      atrib["primera_letra_{}".format(i + 1)] = primerSegundoNombre[i][0].lower()
      atrib["primera_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][0].lower() in 'aieou'
      atrib["ultima_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower() in 'aieou'
      atrib["ultima_letra_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower()
      for letra in 'aeiou':
          atrib["count({})_{}".format(letra, i + 1)] = primerSegundoNombre[i].lower().count(letra)
          atrib["has({})_{}".format(letra, i + 1)] = (letra in primerSegundoNombre[i].lower())
    return atrib
def atributos5(nombre):
    primerSegundoNombre = nombre.split(' ')

    atrib = {}
    atrib["segundo_nombre"] = len(primerSegundoNombre) > 1
    for i in range(len(primerSegundoNombre)):
      atrib["primera_letra_{}".format(i + 1)] = primerSegundoNombre[i][0].lower()
      atrib["primera_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][0].lower() in 'aieou'
      atrib["ultima_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower() in 'aieou'
      atrib["ultima_letra_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower()
      for letra in 'aeiou':
          atrib["count({})_{}".format(letra, i + 1)] = primerSegundoNombre[i].lower().count(letra)
          atrib["has({})_{}".format(letra, i + 1)] = (letra in primerSegundoNombre[i].lower())
    return atrib
def atributos7(nombre):
    primerSegundoNombre = nombre.split(' ')

    atrib = {}

    #atrib["ultimas_4_letras_1"] = primerSegundoNombre[0][-1:-5:-1].lower()
    #atrib["ultimas_4_letras_2"] = primerSegundoNombre[1][-1:-5:-1].lower()


    for i in range(len(primerSegundoNombre)):
      atrib["ultimas_4_letras_{}".format(i + 1)] = primerSegundoNombre[i][-1:-5:-1].lower()
      atrib["primera_letra_{}".format(i + 1)] = primerSegundoNombre[i][0].lower()
      atrib["primera_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][0].lower() in 'aieou'
      atrib["ultima_letra_vocal_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower() in 'aieou'
      atrib["ultima_letra_{}".format(i + 1)] = primerSegundoNombre[i][-1].lower()
      for letra in 'aeiou':
          atrib["count({})_{}".format(letra, i + 1)] = primerSegundoNombre[i].lower().count(letra)
          atrib["has({})_{}".format(letra, i + 1)] = (letra in primerSegundoNombre[i].lower())
    return atrib
def dataAugmentation(data):
  newData = data
  for (n, g) in newData:
    primerYSegundoNombre = n.split(" ")
    segundoNombre = len(primerYSegundoNombre) > 1

    if segundoNombre:
      newData = np.append(newData, [(primerYSegundoNombre[0], g)], axis = 0)
      newData = np.append(newData, [(primerYSegundoNombre[1], g)], axis = 0)
      
    #print(newData[-1])
  return newData
def dataAugmentation2(data):
  newData = data
  
  for (n, g) in newData:
    primerYSegundoNombre = n.split(" ")
    segundoNombre = len(primerYSegundoNombre) > 1

    if segundoNombre:
      if not primerYSegundoNombre[0] in data[0]:
        newData = np.append(newData, [(primerYSegundoNombre[0], g)], axis = 0)
      
      if not primerYSegundoNombre[1] in data[0]:
        newData = np.append(newData, [(primerYSegundoNombre[1], g)], axis = 0)
      
      if not primerYSegundoNombre[1] + primerYSegundoNombre[0]  in data[0]:
        newData = np.append(newData, [(primerYSegundoNombre[1] + primerYSegundoNombre[0], g)], axis = 0)

  return newData
dataAugmented2 = dataAugmentation2(data)
np.save('dataAugmented.npy', dataAugmented2)
dataAugmented2 = np.load('dataAugmented.npy')
data.shape, dataAugmented2.shape<jupyter_output><empty_output><jupyter_text>Model Training<jupyter_code>fset = [(atributos7(n), g) for (n, g) in dataAugmented2]

train, test = fset[500:], fset[:500]
fset
classifierEspaniol = nltk.NaiveBayesClassifier.train(train)<jupyter_output><empty_output><jupyter_text>Evaluation<jupyter_code>print(nltk.classify.accuracy(classifierEspaniol, test))
i = 0
for (n, g) in data[:500]:
  p = classifierEspaniol.classify(atributos7(n))
  if p != g:
    i += 1
    print(n, g, p)

print(i)
print(nltk.classify.accuracy(classifierEspaniol, train))
classifierEspaniol.classify(atributos4('Xavier'))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17643160127253446, 'fraction_numerical': 0.017762460233297986, 'mean_word_length': 4.37776193870278, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 17, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '638855', 'license': 'MIT', 'n_tokens_mistral': 3066, 'n_tokens_neox': 2881, 'n_words': 463, 'path': 'Name_Classification_Model.ipynb', 'repo_name': 'XavierCarrera/text-classification-system', 'size': '7544'}