[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 27

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 3: Reguläre Ausdrücke

Es gibt eine Datei jawiki-country.json.gz, die Wikipedia-Artikel im folgenden Format exportiert. ・ Pro Zeile werden eine Artikelinformation im JSON-Format gespeichert -In jeder Zeile wird der Artikelname im Schlüssel "title" und der Artikelkörper im Wörterbuchobjekt mit dem Schlüssel "text" gespeichert, und dieses Objekt wird im JSON-Format ausgeschrieben. ・ Die gesamte Datei wird mit gzip komprimiert Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt.

27. Entfernung interner Links

Entfernen Sie zusätzlich zur Verarbeitung> 26 das interne Link-Markup von MediaWiki aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: [Markup-Kurzreferenz](https://ja.wikipedia.org/wiki/Help :)) Vereinfachtes Diagramm)).

Der fertige Code:

main.py


# coding: utf-8
import gzip
import json
import re
fname = 'jawiki-country.json.gz'


def extract_UK():
	'''Holen Sie sich den Körper eines Artikels über England

Rückgabewert:
Britischer Artikeltext
	'''

	with gzip.open(fname, 'rt') as data_file:
		for line in data_file:
			data_json = json.loads(line)
			if data_json['title'] == 'England':
				return data_json['text']

	raise ValueError('Ich kann keinen britischen Artikel finden')


def remove_markup(target):
	'''Markup-Entfernung
Markierte Markups und interne Links entfernen

Streit:
	target --Zielzeichenfolge
Rückgabewert:
Zeichenfolge mit entferntem Markup
	'''

	#Entfernen des markierten Markups
	pattern = re.compile(r'''
		(\'{2,5})	#2-5'(Beginn des Markups)
		(.*?)		#Ein oder mehrere Zeichen (Zielzeichenfolge)
		(\1)		#Entspricht der ersten Aufnahme (Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\2', target)

	#Entfernung interner Links
	pattern = re.compile(r'''
		\[\[		# '[['(Beginn des Markups)
		(?:			#Starten Sie eine Gruppe, die nicht erfasst wird
			[^|]*?	# '|'0 oder mehr Zeichen als nicht gierig
			\|		# '|'
		)??			#Gruppenende, diese Gruppe erscheint 0 oder 1, nicht gierig
		([^|]*?)	#Ziel erfassen,'|'Andere als 0 Zeichen, nicht gierig (anzuzeigende Zeichenfolge)
		\]\]		# ']]'(Ende des Markups)
		''', re.MULTILINE + re.VERBOSE)
	target = pattern.sub(r'\1', target)

	return target


#Kompilieren der Extraktionsbedingungen der Basisinformationsvorlage
pattern = re.compile(r'''
	^\{\{Grundinformation.*?$	# '{{Grundinformation'Zeilen beginnend mit
	(.*?)		#Ziel erfassen, 0 oder mehr Zeichen, nicht gierig
	^\}\}$		# '}}'Linie
	''', re.MULTILINE + re.VERBOSE + re.DOTALL)

#Extraktion der Basisinformationsvorlage
contents = pattern.findall(extract_UK())

#Extraktionsbedingungszusammenstellung von Feldname und Wert aus dem Extraktionsergebnis
pattern = re.compile(r'''
	^\|			# '|'Zeilen beginnend mit
	(.+?)		#Erfassen Sie das Ziel (Feldname), ein oder mehrere Zeichen, nicht gierig
	\s*			#0 oder mehr Leerzeichen
	=
	\s*			#0 oder mehr Leerzeichen
	(.+?)		#Erfassen Sie ein Ziel (Wert), ein oder mehrere Zeichen, nicht gierig
	(?:			#Starten Sie eine Gruppe, die nicht erfasst wird
		(?=\n\|) 	#Neue Zeile+'|'Vorher (positive Vorausschau)
		| (?=\n$)	#Oder ein Zeilenumbruch+Vor dem Ende (bejahender Ausblick)
	)			#Gruppenende
	''', re.MULTILINE + re.VERBOSE + re.DOTALL)

#Extraktion von Feldnamen und Werten
fields = pattern.findall(contents[0])

#Im Wörterbuch einstellen
result = {}
keys_test = []		#Liste der Feldnamen in der Reihenfolge ihres Auftretens zur Bestätigung
for field in fields:
	result[field[0]] = remove_markup(field[1])
	keys_test.append(field[0])

#Zur Bestätigung angezeigt (Tasten zur einfachen Bestätigung_Mit Test nach Erscheinungsbild des Feldnamens sortieren)
for item in sorted(result.items(),
		key=lambda field: keys_test.index(field[0])):
	print(item)

Ausführungsergebnis:

Terminal


('Kurzbezeichnung', 'England')
('Japanischer Ländername', 'Vereinigtes Königreich Großbritannien und Nordirland')
('Offizieller Ländername', '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>Offizieller Ländername außer Englisch:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}(Schottisch Gälisch)<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}(Wales)<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}(Irisch)<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}(Cornwall)<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}(Schottisch)<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(Ulster Scottish)</ref>')
('Flaggenbild', 'Flag of the United Kingdom.svg')
('Nationales Emblembild', '[[Datei:Royal Coat of Arms of the United Kingdom.svg|85px|Britisches nationales Emblem]]')
('Nationaler Emblem-Link', '(Staatswappen)')
('Slogan', '{{lang|fr|Dieu et mon droit}}<br/>(Französisch:Gott und meine Rechte)')
('Nationalhymne', 'Beschütze deine Majestät die Königin, Gott')
('Positionieren Sie das Bild', 'Location_UK_EU_Europe_001.svg')
('Offizielle Terminologie', 'Englisch (virtuell)')
('Hauptstadt', 'London')
('Größte Stadt', 'London')
('Ehemaliger Haupttitel', 'Königin')
('Vorname', 'Elizabeth II')
('Titel des Premierministers', 'Premierminister')
('Name des Premierministers', 'David Cameron')
('Gebietsrangliste', '76')
('Flächengröße', '1 E11')
('Flächenwert', '244,820')
('Wasserflächenverhältnis', '1.3%')
('Jahr der Volkszählung', '2011')
('Bevölkerungsranking', '22')
('Einwohnerzahl', '1 E7')
('Bevölkerungswert', '63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>')
('Bevölkerungsdichtewert', '246')
('BIP-Statistik Jahr Yuan', '2012')
('BIP-Wertquelle', '1,5478 Billionen<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>')
('BIP-Statistik Jahr MER', '2012')
('BIP-Ranking MER', '5')
('BIP-Wert MER', '2.433,7 Milliarden<ref name="imf-statistics-gdp" />')
('Statistisches BIP-Jahr', '2012')
('BIP-Ranking', '6')
('BIP-Wert', '2.316,2 Milliarden<ref name="imf-statistics-gdp" />')
('GDP/Mann', '36,727<ref name="imf-statistics-gdp" />')
('Gründungsform', 'Gründung des Landes')
('Etablierte Form 1', 'Königreich England / Königreich Schottland<br />(Beide Länder bis zum Unionsgesetz von 1707)')
('Gründungsdatum 1', '927/843')
('Etablierte Form 2', 'Gründung des Königreichs Großbritannien<br />(Union Act 1707)')
('Gründungsdatum 2', '1707')
('Etablierte Form 3', 'Gründung des Vereinigten Königreichs Großbritannien und Irland<br />(Union Act 1800)')
('Gründungsdatum 3', '1801')
('Etablierte Form 4', 'Geändert in den aktuellen Ländernamen "Großbritannien und das Vereinigte Königreich Nordirland"')
('Gründungsdatum 4', '1927')
('Währung', 'UK Pfund(&pound;)')
('Währungscode', 'GBP')
('Zeitzone', '±0')
('Sommerzeit', '+1')
('ISO 3166-1', 'GB / GBR')
('ccTLD', '.uk / .gb<ref>Verwendung ist.Überwiegend kleine Zahl im Vergleich zu Großbritannien.</ref>')
('Internationale Telefonnummer', '44')
('Hinweis', '<references />')

Entfernen des internen Links "nur"

[Vorherige Frage] remove_markup () von (http://qiita.com/segavvy/items/f6d0f3d6eee5acc33c58) wurde repariert. Was mich diesmal süchtig macht ist, dass es gut funktioniert! Wenn Sie denken und prüfen[[Datei:Royal Coat of Arms of the United Kingdom.svg|85px|Britisches nationales Emblem]]WannいったDateiの指定まで巻き込んでいたこWannです。そこで、[[Wann]]In dem von eingeschlossenen Bereich|が0または1個しか出てこないWannいう条件に変更して(Dateiの場合は2個出てくる)、Dateiを巻き込むのを防いでみました。 Dies schließt jedoch Kategorien wie "[[Kategorie: UK | *]]" ein, auf die in den Ausgaben 21 und 22 und [Markup-Kurzreferenz](https://ja.wikipedia.org/wiki/Help: Es ist ein wenig auf halbem Weg, da es sich um eine Umleitung wie "#REDIRECT [[Artikelname]]" in der Schnellreferenztabelle handelt. Es ist in Ordnung, weil es diesmal nicht in den Zieldaten erscheint, aber möglicherweise nicht die Absicht der Frage beantwortet hat ...

Das ist alles für den 28. 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: 71
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89
100 Amateur-Sprachverarbeitungsklopfen: 40
100 Amateur-Sprachverarbeitungsklopfen: 45
100 Amateur-Sprachverarbeitungsklopfen: 43
100 Amateur-Sprachverarbeitungsklopfen: 55
100 Amateur-Sprachverarbeitungsklopfen: 22
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: 08
100 Amateur-Sprachverarbeitungsklopfen: 42
100 Amateur-Sprachverarbeitungsklopfen: 19
100 Amateur-Sprachverarbeitungsklopfen: 73
100 Amateur-Sprachverarbeitungsklopfen: 75
100 Amateur-Sprachverarbeitungsklopfen: 83
100 Amateur-Sprachverarbeitungsklopfen: 95
100 Amateur-Sprachverarbeitungsklopfen: 96
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: 66
100 Amateur-Sprachverarbeitungsklopfen: 28
100 Amateur-Sprachverarbeitungsklopfen: 64
100 Amateur-Sprachverarbeitungsklopfen: 34
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
100 Amateur-Sprachverarbeitungsklopfen: 35