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).
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.
Utilisez la base de données construite avec> 60 pour obtenir l'emplacement d'activité d'un artiste spécifique (désigné).
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 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é
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.
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