[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 61

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).

Kapitel 7: Datenbank

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.

61. Suche nach KVS

Verwenden Sie die mit> 60 erstellte Datenbank, um den Aktivitätsort eines bestimmten (bestimmten) Künstlers abzurufen.

Der fertige Code:

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:

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

Suche nach LevelDB

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.

Notationsschwankung, Unicode-Codepunkt

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

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