[PYTHON] 100 coups de traitement du langage amateur: 61

C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Chapitre 7: Base de données

artist.json.gz est un fichier de la base de données musicale ouverte MusicBrainz qui est converti au format JSON et compressé au format gzip. Dans ce fichier, les informations sur un artiste sont stockées sur une seule ligne au format JSON. Le contour du format JSON est le suivant.

champ Moule Contenu Exemple
id Identifiant unique entier 20660
gid Identifiant global Chaîne "ecf9f3a3-35e9-4c58-acaa-e707fba45060"
name nom d'artiste Chaîne "Oasis"
sort_name Nom de l'artiste (pour le diagnostic de l'ordre) Chaîne "Oasis"
area Lieu d'activité Chaîne "United Kingdom"
aliases alias Liste des objets de dictionnaire
aliases[].name alias Chaîne "oasis"
aliases[].sort_name Alias (pour l'alignement) Chaîne "oasis"
begin Date de début de l'activité dictionnaire
begin.year Année de début d'activité entier 1991
begin.month Mois de début d'activité entier
begin.date Date de début de l'activité entier
end Date de fin de l'activité dictionnaire
end.year Fin d'année d'activité entier 2009
end.month Mois de fin d'activité entier 8
end.date Date de fin de l'activité entier 28
tags marque Liste des objets de dictionnaire
tags[].count Nombre de balises entier 1
tags[].value Contenu du tag Chaîne "rock"
rating Évaluation Objet dictionnaire
rating.count Nombre de votes pour la notation entier 13
rating.value Valeur de notation (valeur moyenne) entier 86

Envisagez de stocker et de récupérer les données artist.json.gz dans les bases de données Key-Value-Store (KVS) et orientées document. Utilisez LevelDB, Redis, Kyoto Cabinet, etc. comme KVS. MongoDB a été adopté comme base de données orientée document, mais CouchDB, RethinkDB, etc. peuvent également être utilisés.

61. Recherchez KVS

Utilisez la base de données construite avec> 60 pour obtenir l'emplacement d'activité d'un artiste spécifique (désigné).

Le code fini:

main.py


# coding: utf-8
import re
import leveldb

fname_db = 'test_db'

#Expression régulière pour décomposer la clé en nom et id
pattern = re.compile(r'''
    ^
    (.*)	# name
    \t      #Séparation
    (\d+)   # id
    $
    ''', re.VERBOSE + re.DOTALL)

#LevelDB ouvert
db = leveldb.LevelDB(fname_db)

#Entrée de condition
clue = input('Veuillez saisir le nom de l'artiste--> ')
hit = False

#nom d'artiste+'\t'Recherché par
for key, value in db.RangeIter(key_from=(clue + '\t').encode()):

	#Retournez la clé au nom et à l'identifiant
	match = pattern.match(key.decode())
	name = match.group(1)
	id = match.group(2)

	#Terminer lorsque vous devenez un artiste différent
	if name != clue:
		break

	#Vérifier et afficher l'emplacement de l'activité
	area = value.decode()
	if area != '':
		print('{}(id:{})Lieu d'activité:{}'.format(name, id, area))
	else:
		print('{}(id:{})Le lieu d'activité n'est pas enregistré'.format(name, id))
	hit = True

if not hit:
	print('{}N'est pas enregistré'.format(clue))

Résultat de l'exécution:

Résultat d'exécution


Veuillez saisir le nom de l'artiste--> Oasis
Oasis(id:20660)Lieu d'activité:United Kingdom
Oasis(id:286198)Lieu d'activité:United States
Oasis(id:377879)Lieu d'activité:United Kingdom

Il y avait 3 cas d'Oasis dans l'exemple.

Résultat d'exécution


Veuillez saisir le nom de l'artiste--> SMAP
SMAP(id:265728)Lieu d'activité:Japan

Dans cette base de données, SMAP est toujours actif au Japon.

Même si vous êtes inscrit en tant qu'artiste, il se peut que vous ne disposiez pas d'informations sur l'endroit où vous êtes actif.

Résultat d'exécution


Veuillez saisir le nom de l'artiste-->Mayuko Higa
Mayuko Higa(id:1075206)Le lieu d'activité n'est pas enregistré

Mayuko Higa cherchait une liste d'artistes dont les lieux d'activité n'étaient pas enregistrés, et cela se démarquait dans les kanji, alors je l'ai utilisé comme exemple. Il semble que ce soit d'Okinawa.

Si l'artiste lui-même n'est pas inscrit, ce sera comme suit.

Résultat d'exécution


Veuillez saisir le nom de l'artiste--> segavvy
segavvy n'est pas enregistré

Rechercher LevelDB

Si vous recherchez simplement par clé, si vous spécifiez la clé avec LevelDB.Get (), la valeur sera renvoyée et elle se terminera, mais question précédente Dans la base de données créée dans, la clé est le nom de l'artiste + '\ t' + identifiant unique afin de traiter les noms d'artistes en double. Je ne connais pas l'identifiant unique à l'avance, j'ai donc obtenu un itérateur et l'ai vérifié.

L'itérateur est acquis par LevelDB.RangeIter (), mais si vous acquérez et vérifiez normalement tous les éléments, le mérite d'utiliser KVS sera perdu, alors utilisez le fait que la clé LevelDB est toujours triée. Je suis. LevelDB.RangeIter () peut spécifier la condition de début de l'itérateur avec key_from, donc si vous spécifiez le nom de l'artiste que vous souhaitez rechercher + '\ t'et ne vérifiez qu'après cela, quel que soit l'identifiant unique, l'artiste correspondant Vous pouvez obtenir la valeur directement. Vous pouvez également spécifier la condition de fin avec key_to, mais je ne l'ai pas spécifiée cette fois car je ne connaissais pas clairement la logique de tri de LevelDB et ne savais pas comment la spécifier. Au lieu de cela, il se brise lorsque le nom de l'artiste n'est pas ce que vous voulez.

Fluctuation de notation, point de code Unicode

En passant, mon groupe de fusion préféré T-SQUARE n'est pas enregistré pour une raison quelconque.

Résultat d'exécution


Veuillez saisir le nom de l'artiste--> T-SQUARE
T-SQUARE n'est pas enregistré

Mystérieusement, quand j'ai regardé les données pendant un moment, le «-» (trait d'union) n'était pas le caractère habituel (point de code Unicode: 45) mais un autre caractère (idem: 8208). Si vous entrez ce caractère, il frappera.

Résultat d'exécution


Veuillez saisir le nom de l'artiste--> T‐SQUARE
T‐SQUARE(id:9707)Lieu d'activité:Japan

De telles fluctuations dans la notation peuvent entraîner des omissions de recherche, donc si vous essayez de créer un mécanisme de recherche, cela peut être un thème douloureux. Même dans les problèmes jusqu'à présent, j'ai appris diverses méthodes telles que l'analyse morphologique et la manipulation en tant que prototype ou dérivation, mais j'ouvre également s'il s'agit d'un cas, pleine demi-largeur, caractères variantes, anciens et nouveaux kanji, kanji (=) Il semble qu'il y ait diverses choses comme s'il s'agit de hiragana), l'orthographe complète ou l'abréviation.

Au fait, les points de code Unicode peuvent être trouvés en Python à ʻord () `.

Qu'est-ce qu'un point de code Unicode? Pour ceux qui disent, je pense que l'explication de Différence entre Unicode et UTF-8 comprise à partir de l'idée de code de caractère par Aiming for Geek est facile à comprendre.

C'est tout pour le 62e coup. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.


Recommended Posts

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 81
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 61
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de traitement du langage amateur: 12
100 coups de traitement du langage amateur: 14
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 19
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 98
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 32
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 87
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de traitement du langage amateur: 23
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 68
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 74
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 64
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 36
100 coups de traitement du langage amateur: 77
100 coups de langue amateur: 01
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03
100 coups de traitement du langage amateur: 82
100 coups de traitement du langage amateur: 69
100 coups de traitement du langage amateur: 53
100 coups de traitement du langage amateur: 18