Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
artist.json.gz ist eine Datei in der geöffneten Musikdatenbank MusicBrainz, die in das JSON-Format konvertiert und im gzip-Format komprimiert wird. In dieser Datei werden Informationen zu einem Künstler in einer Zeile im JSON-Format gespeichert. Der Umriss des JSON-Formats lautet wie folgt.
Feld Schimmel Inhalt Beispiel id Eindeutige Kennung ganze Zahl 20660 gid Globale Kennung String "ecf9f3a3-35e9-4c58-acaa-e707fba45060" name Künstlername String "Oasis" sort_name Künstlername (zur Auftragsdiagnose) String "Oasis" area Ort der Tätigkeit String "United Kingdom" aliases alias Liste der Wörterbuchobjekte aliases[].name alias String "Oase" aliases[].sort_name Alias (zur Ausrichtung) String "Oase" begin Beginn der Aktivität Wörterbuch begin.year Beginn der Aktivität ganze Zahl 1991 begin.month Aktivitätsstartmonat ganze Zahl begin.date Beginn der Aktivität ganze Zahl end Enddatum der Aktivität Wörterbuch end.year Ende des Aktivitätsjahres ganze Zahl 2009 end.month Aktivitätsende Monat ganze Zahl 8 end.date Enddatum der Aktivität ganze Zahl 28 tags Etikett Liste der Wörterbuchobjekte tags[].count Anzahl der Markierungen ganze Zahl 1 tags[].value Tag-Inhalt String "rock" rating Bewertung Wörterbuchobjekt rating.count Anzahl der Stimmen für die Bewertung ganze Zahl 13 rating.value Bewertungswert (Durchschnittswert) ganze Zahl 86 Erwägen Sie das Speichern und Abrufen von artist.json.gz-Daten in Key-Value-Store (KVS) und dokumentenorientierten Datenbanken. Verwenden Sie LevelDB, Redis, Kyoto Cabinet usw. als KVS. MongoDB wurde als dokumentenorientierte Datenbank übernommen, es können jedoch auch CouchDB, RethinkDB usw. verwendet werden.
Verwenden Sie die mit> 60 erstellte Datenbank, um den Aktivitätsort eines bestimmten (bestimmten) Künstlers abzurufen.
main.py
# coding: utf-8
import re
import leveldb
fname_db = 'test_db'
#Regulärer Ausdruck zum Zerlegen des Schlüssels in Name und ID
pattern = re.compile(r'''
^
(.*) # name
\t #Trennung
(\d+) # id
$
''', re.VERBOSE + re.DOTALL)
#LevelDB geöffnet
db = leveldb.LevelDB(fname_db)
#Bedingungseingabe
clue = input('Bitte geben Sie den Künstlernamen ein--> ')
hit = False
#Künstlername+'\t'Suche nach
for key, value in db.RangeIter(key_from=(clue + '\t').encode()):
#Geben Sie den Schlüssel auf Name und ID zurück
match = pattern.match(key.decode())
name = match.group(1)
id = match.group(2)
#Beenden Sie, wenn Sie ein anderer Künstler werden
if name != clue:
break
#Überprüfen Sie den Aktivitätsort und zeigen Sie ihn an
area = value.decode()
if area != '':
print('{}(id:{})Aktivitätsort:{}'.format(name, id, area))
else:
print('{}(id:{})Der Ort der Tätigkeit ist nicht registriert'.format(name, id))
hit = True
if not hit:
print('{}Ist nicht registriert'.format(clue))
Ausführungsergebnis
Bitte geben Sie den Künstlernamen ein--> Oasis
Oasis(id:20660)Aktivitätsort:United Kingdom
Oasis(id:286198)Aktivitätsort:United States
Oasis(id:377879)Aktivitätsort:United Kingdom
Im Beispiel gab es 3 Fälle von Oasis.
Ausführungsergebnis
Bitte geben Sie den Künstlernamen ein--> SMAP
SMAP(id:265728)Aktivitätsort:Japan
In dieser Datenbank ist SMAP in Japan noch aktiv.
Selbst wenn Sie als Künstler registriert sind, haben Sie möglicherweise keine Informationen darüber, wo Sie aktiv sind.
Ausführungsergebnis
Bitte geben Sie den Künstlernamen ein-->Mayuko Higa
Mayuko Higa(id:1075206)Der Ort der Tätigkeit ist nicht registriert
Mayuko Higa hat sich eine Liste von Künstlern angesehen, deren Aktivitätsorte nicht registriert waren, und sie ist zufällig in Kanji aufgefallen, also habe ich sie als Beispiel verwendet. Es scheint aus Okinawa zu sein.
Wenn der Künstler selbst nicht registriert ist, ist dies wie folgt.
Ausführungsergebnis
Bitte geben Sie den Künstlernamen ein--> segavvy
segavvy ist nicht registriert
Wenn Sie nur nach Schlüssel suchen und den Schlüssel mit "LevelDB.Get ()" angeben, wird der Wert zurückgegeben und endet, aber vorherige Frage In der Datenbank, in der erstellt wurde, ist der Schlüssel der Künstlername + '\ t' + eindeutige Kennung, um doppelte Künstlernamen zu verarbeiten. Ich kenne die eindeutige Kennung nicht im Voraus, also habe ich einen Iterator bekommen und ihn überprüft.
Der Iterator wird von "LevelDB.RangeIter ()" erfasst. Wenn Sie jedoch normalerweise alle Elemente erfassen und überprüfen, geht der Nutzen der Verwendung von KVS verloren. Verwenden Sie daher die Tatsache, dass der LevelDB-Schlüssel immer sortiert ist. Ich bin.
LevelDB.RangeIter ()
kann die Startbedingung des Iterators mit key_from angeben. Wenn Sie also den Künstlernamen angeben, nach dem Sie suchen möchten, + '\ t' und erst danach unabhängig von der eindeutigen Kennung den entsprechenden Künstler überprüfen Sie können den Wert direkt erhalten.
Sie können die Endbedingung auch mit key_to angeben, aber diesmal habe ich sie nicht angegeben, da ich die Sortierlogik von LevelDB nicht genau kannte und mir nicht vorstellen konnte, wie ich sie angeben soll. Stattdessen wird es unterbrochen, wenn der Künstlername nicht Ihren Wünschen entspricht.
Abgesehen davon ist meine Lieblings-Fusion-Band T-SQUARE aus irgendeinem Grund nicht registriert.
Ausführungsergebnis
Bitte geben Sie den Künstlernamen ein--> T-SQUARE
T-SQUARE ist nicht registriert
Auf mysteriöse Weise war das -
(Bindestrich) nicht das übliche Zeichen (Unicode-Codepunkt: 45), sondern ein anderes Zeichen (dasselbe: 8208), als ich einen Moment in die Daten schaute. Wenn Sie diesen Charakter eingeben, wird er getroffen.
Ausführungsergebnis
Bitte geben Sie den Künstlernamen ein--> T‐SQUARE
T‐SQUARE(id:9707)Aktivitätsort:Japan
Solche Schwankungen in der Notation können zu Suchauslassungen führen. Wenn Sie also versuchen, einen Suchmechanismus zu erstellen, kann dies ein schmerzhaftes Thema sein. Selbst in den bisherigen Problemen habe ich verschiedene Methoden wie morphologische Analyse und Handhabung als Prototyp oder Stemming gelernt, aber ich öffne auch, ob es sich um einen Fall handelt, volle halbe Breite, variante Zeichen, altes und neues Kanji, Kanji (=) Es scheint, dass es verschiedene Dinge gibt, wie z. B. Hiragana, vollständige Rechtschreibung oder Abkürzung.
Unicode-Codepunkte finden Sie übrigens in Python unter ord ()
.
Was ist ein Unicode-Codepunkt? Für diejenigen unter Ihnen, die Geek anstreben, ist die Erklärung von Unterschiede zwischen Unicode und UTF-8, verstanden aus dem Konzept des Zeichencodes leicht zu verstehen.
Das ist alles für den 62. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.
Recommended Posts