Selección de autores de forma aleatoria con Python

NumPy logo

Recientemente hemos estado trabajando con los repositorios de datos abiertos de diferentes bibliotecas para crear listados de autores de forma aleatoria. En primer lugar, seleccionamos un conjunto de entre diez mil y cien mil autores a partir de los puntos de acceso SPARQL.

Por ejemplo, para el caso de la Biblioteca Nacional de Francia, podemos ejecutar la siguiente consulta:


SELECT DISTINCT ?s ?viafid
WHERE {
?s a foaf:Person .
?s owl:sameAs ?viafid.
FILTER(regex(str(?viafid), "viaf" ) )
}
LIMIT 100000

Recogemos los recursos de tipo foaf:Person que estan enlazados a VIAF. Mediante la instrucción regex nos permite filtrar las URLs que contienen el término viaf. A continuación, el resultado de la consulta ejecutada en su repositorio SPARQL lo almacenamos en un fichero llamado bnf-author-viaf.csv.

Para proceder a seleccionar de forma aleatoria un conjunto de autores de ese fichero podemos utilizar la librería de Python NumPy. El siguiente código muestra cómo se lee el fichero con la lista total y se utiliza dicha librería para seleccionar 100 autores a través de la instrucción random.choice. Finalmente, el resultado se almacena en un fichero de salida.

import csv
import numpy

numbersList = []

with open('data/bnf-author-viaf.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
if line_count == 0:
print(f'Column names are {", ".join(row)}')
line_count += 1
else:
print(f'\t{row[0]} link with viaf: {row[1]} .')

numbersList.append(row[0] + "," + row[1])
line_count += 1
print(f'Processed {line_count} lines.')

random_num = numpy.random.choice(numbersList, 100);
print(random_num)

with open('output/random-bnf-id.txt', 'w') as f:
for item in random_num:
f.write("%s\n" % item)

El código completo con ejemplos en otras bibliotecas está disponible en nuestra cuenta de GitHub.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

35 + = 36