Sprachverarbeitung 100 Knock 2020 wurde veröffentlicht, daher werde ich es sofort versuchen.
In Kapitel 3 werden wir die erforderlichen Informationen mit regulären Ausdrücken aus Wikipedia-Artikeln extrahieren und formatieren.
Wikipedia-Markup-Informationen sind Hilfe: Kurzübersicht - Wikipedia, API Informationen finden Sie in API: Image Information-MediaWiki. Da die Markup-Informationen jedoch unvollständig sind, können Sie die Daten oder Wikipedia-Seite anzeigen. Das Muster muss anhand von% AA% E3% 82% B9) identifiziert werden.
Es gibt eine Datei jawiki-country.json.gz, die Wikipedia-Artikel im folgenden Format exportiert.
Lesen Sie die JSON-Datei des Wikipedia-Artikels und zeigen Sie den Artikeltext zu "UK" an. Führen Sie in den Problemen 21-29 den hier extrahierten Artikeltext aus.
Code
import gzip
import json
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
print(eng[0]['text'])
Ausgabeergebnis (Teil)
{{redirect|UK}}
{{redirect|Vereinigtes Königreich|Ehrenländer im Frühjahr und Herbst|Englisch(Frühling und Herbst)}}
{{Otheruses|Europäisches Land|Lokale Küche der Präfekturen Nagasaki und Kumamoto|Igirisu}}
{{Grundlegende Informationen Land
|Kurzbezeichnung=England
︙
Beachten Sie, dass jawiki-country.json
JSON Lines ist.
Extrahieren Sie die Zeile, in der der Kategoriename im Artikel angegeben ist.
Code
import gzip
import json
import regex as re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
texts = eng_data['text'].split('\n')
#Extrahieren Sie Zeilen mit Kategorien
cat_rows = list(filter(lambda e: re.search('\[\[Kategorie:|\[\[Category:', e), texts))
print('\n'.join(cat_rows))
Ausgabeergebnis
[[Category:England|*]]
[[Category:Vereinigte Königreich Mitgliedsländer]]
[[Category:Königreich des Vereinigten Königreichs|*]]
[[Category:G8-Mitgliedsländer]]
[[Category:Mitgliedsländer der Europäischen Union|Ehemalige]]
[[Category:Marine Nation]]
[[Category:Bestehendes souveränes Land]]
[[Category:Inselstaat]]
[[Category:Eine Nation / ein Gebiet, das 1801 gegründet wurde]]
Help:Vereinfachtes Diagramm- WikipediaDann"[[Category:Hilfe|HiyoHayami]]Obwohleseigentlich"[[Kategorie:Hilfe|HiyoHayami]]EsgibtaucheinMuster(obwohlesineinembritischenArtikelnichtvorkommt).
Extrahieren Sie die Namen der Artikelkategorien (nach Namen, nicht nach Zeile).
Code
import gzip
import json
import regex as re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
texts = eng_data['text'].split('\n')
#Extrahieren Sie Zeilen mit Kategorien
cat_rows = list(filter(lambda e: re.search('\[\[Kategorie:|\[\[Category:', e), texts))
#Extrahieren Sie nur den Kategorienamen aus der Zeile, die die Kategorie enthält
cat_rows = list(map(lambda e: re.search('(?<=(\[\[Kategorie:|\[\[Category:)).+?(?=(\||\]))', e).group(), cat_rows))
print('\n'.join(cat_rows))
Ausgabeergebnis
England
Vereinigte Königreich Mitgliedsländer
Königreich des Vereinigten Königreichs
G8-Mitgliedsländer
Mitgliedsländer der Europäischen Union
Marine Nation
Bestehendes souveränes Land
Inselstaat
Eine Nation / ein Gebiet, das 1801 gegründet wurde
Es gibt einen Standard re als Bibliothek für reguläre Ausdrücke, aber ich erhalte den Fehler "Look-Behind erfordert Muster mit fester Breite" im Look-Ahead. Verwenden Sie dazu regex.
Zeigen Sie den Abschnittsnamen und seine Ebene an (z. B. 1, wenn "== Abschnittsname =="), die im Artikel enthalten sind.
Code
import json
import re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
texts = eng_data['text'].split('\n')
#Zeilen mit Abschnitten extrahieren
sec_rows = list(filter(lambda e: re.search('==.+==', e), texts))
# =Berechnen Sie den Pegel aus der Anzahl von
sec_rows_num = list(map(lambda e: e + ':' + str(int(e.count('=') / 2 - 1)), sec_rows))
# =Und Leerzeichen entfernen
sections = list(map(lambda e: e.replace('=', '').replace(' ', ''), sec_rows_num))
print('\n'.join(sections))
Ausgabeergebnis (Teil)
Ländername:1
Geschichte:1
Erdkunde:1
Großstädte:2
Klima:2
︙
Extrahieren Sie alle Mediendateien, auf die aus dem Artikel verwiesen wird.
Code
import json
import regex as re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
texts = eng_data['text'].split('\n')
#Extrahieren Sie Zeilen mit Dateien
file_rows = list(filter(lambda e: re.search('\[\[Datei:|\[\[File:|\[\[file:', e), texts))
#Extrahieren Sie nur den Dateinamen aus der Zeile, die die Datei enthält
file_rows = list(map(lambda e: re.search('(?<=(\[\[Datei:|\[\[File:|\[\[file:)).+?(?=(\||\]))', e).group(), file_rows))
print('\n'.join(file_rows))
Ausgabeergebnis
Royal Coat of Arms of the United Kingdom.svg
United States Navy Band - God Save the Queen.ogg
Descriptio Prime Tabulae Europae.jpg
Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg
London.bankofengland.arp.jpg
Battle of Waterloo 1815.PNG
Uk topo en.jpg
BenNevis2005.jpg
Population density UK 2011 census.png
2019 Greenwich Peninsula & Canary Wharf.jpg
Leeds CBD at night.jpg
Palace of Westminster, London - Feb 2007.jpg
Scotland Parliament Holyrood.jpg
Donald Trump and Theresa May (33998675310) (cropped).jpg
Soldiers Trooping the Colour, 16th June 2007.jpg
City of London skyline from London City Hall - Oct 2008.jpg
Oil platform in the North SeaPros.jpg
Eurostar at St Pancras Jan 2008.jpg
Heathrow Terminal 5C Iwelumo-1.jpg
UKpop.svg
Anglospeak.svg
Royal Aberdeen Children's Hospital.jpg
CHANDOS3.jpg
The Fabs.JPG
Wembley Stadium, illuminated.jpg
Help:Vereinfachtes Diagramm- WikipediaDann "[[Datei:Wikipedia-logo-v2-ja.png|thumb|Erläuterungstext]]Obwohl es eigentlich "[[File:Wikipedia-logo-v2-ja.png|thumb|Erläuterungstext]]」「[[file:Wikipedia-logo-v2-ja.png|thumb|Erläuterungstext]]Es gibt auch ein Muster.
Extrahieren Sie die Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.
Code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
text = eng_data['text']
#Grundlegende Informationen extrahieren
basic_text = re.search('{{Grundinformation[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Liste nach Zeilenumbrüchen auf und lösche unnötige Teile
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Wechseln Sie zum Schreibtyp
basic_dict = {}
for basic in basic_ary:
key, *values = basic.split('=')
key = key.replace(' ', '').replace('|', '')
basic_dict[key] = ''.join(values).strip()
pprint.pprint(basic_dict)
Ausgabeergebnis (Teil)
{'GDP/Mann': '36,727<ref name"imf-statistics-gdp" />',
'BIP-Wert': '2.316,2 Milliarden<ref name"imf-statistics-gdp" />',
'BIP-Wert MER': '2.433,7 Milliarden<ref name"imf-statistics-gdp" />',
︙
'Name des Premierministers': '[[Boris Johnson]]',
'Titel des Premierministers': '[[britischer Premierminister|Premierminister]]',
'Hauptstadt': '[[London]](eigentlich)'}
Entfernen Sie zum Zeitpunkt der Verarbeitung 25 das MediaWiki-Hervorhebungs-Markup (alle schwachen Hervorhebungen, Hervorhebungen und starken Hervorhebungen) aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).
Code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
text = eng_data['text']
#Grundlegende Informationen extrahieren
basic_text = re.search('{{Grundinformation[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Liste nach Zeilenumbrüchen auf und lösche unnötige Teile
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Wechseln Sie zum Wörterbuchtyp
basic_dict = {}
for basic in basic_ary:
#In Schlüssel und Werte unterteilt
key, *values = basic.split('=')
#Formen Sie den Schlüssel
key = key.replace(' ', '').replace('|', '')
#Beitreten, da die Werte aufgelistet sind
value = ''.join(values).strip()
#Entfernen des markierten Markups
value = value.replace("'''''", '').replace("'''", '').replace("''", '')
basic_dict[key] = value
pprint.pprint(basic_dict)
Ausgabeergebnis (Teil)
{'GDP/Mann': '36,727<ref name"imf-statistics-gdp" />',
'BIP-Wert': '2.316,2 Milliarden<ref name"imf-statistics-gdp" />',
'BIP-Wert MER': '2.433,7 Milliarden<ref name"imf-statistics-gdp" />',
︙
'Etablierte Form 4': 'Geändert in den aktuellen Ländernamen "Großbritannien und das Vereinigte Königreich Nordirland"',
︙
'Name des Premierministers': '[[Boris Johnson]]',
'Titel des Premierministers': '[[britischer Premierminister|Premierminister]]',
'Hauptstadt': '[[London]](eigentlich)'}
Hilfe: Kurzreferenz - Wikipedia "Unterscheidung von anderen (schräg) ) “,„ Hervorhebung (fett) “und„ Schräg und Hervorhebung “werden hier als„ Hervorhebungs-Markup “verstanden.
Entfernen Sie zusätzlich zu den 26 Prozessen das interne Link für MediaWiki-Links aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).
Code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
text = eng_data['text']
#Grundlegende Informationen extrahieren
basic_text = re.search('{{Grundinformation[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Liste nach Zeilenumbrüchen auf und lösche unnötige Teile
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Wechseln Sie zum Schreibtyp
basic_dict = {}
for basic in basic_ary:
#In Schlüssel und Werte unterteilt
key, *values = basic.split('=')
#Formen Sie den Schlüssel
key = key.replace(' ', '').replace('|', '')
#Beitreten, da die Werte aufgelistet sind
value = ''.join(values).strip()
#Entfernen des markierten Markups
value = value.replace("'''''", '').replace("'''", '').replace("'", '')
#Interne Link-Zeichenfolge abrufen
targets = re.findall('((?<=({{)).+?(?=(}})))', value)
#Formatierung der internen Linkzeichenfolge
if targets:
for target in targets:
value = re.sub('{{.+?}}', target[0].split('|')[-1], value, count=1)
#Interne Link-Zeichenfolge abrufen
targets = re.findall('((?<=(\[\[)).+?(?=(\]\])))', value)
#Formatierung der internen Linkzeichenfolge
if targets:
for target in targets:
value = re.sub('\[\[.+?\]\]', target[0].split('|')[-1], value, count=1)
basic_dict[key] = value
pprint.pprint(basic_dict)
Ausgabeergebnis (Teil)
{'GDP/Mann': '36,727<ref name"imf-statistics-gdp" />',
'BIP-Wert': '2.316,2 Milliarden<ref name"imf-statistics-gdp" />',
'BIP-Wert MER': '2.433,7 Milliarden<ref name"imf-statistics-gdp" />',
︙
'Etablierte Form 3': 'Gründung des Vereinigten Königreichs Großbritannien und Irland<br />(1800 Gemeinsames Gesetz)',
︙
'Name des Premierministers': 'Boris Johnson',
'Titel des Premierministers': 'Premierminister',
'Hauptstadt': 'London (virtuell)'}
Help:Vereinfachtes Diagramm- WikipediaDann "[[Artikelüberschrift|Zeichen anzeigen]]Es gibt Muster wie ", aber in Wirklichkeit".{{Artikelüberschrift|Zeichen anzeigen}}Es scheint ein Muster von "zu geben.
Entfernen Sie zusätzlich zu den 27 Prozessen das MediaWiki-Markup so weit wie möglich aus den Vorlagenwerten und formatieren Sie die grundlegenden Länderinformationen.
Code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
text = eng_data['text']
#Grundlegende Informationen extrahieren
basic_text = re.search('{{Grundinformation[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Liste nach Zeilenumbrüchen auf und lösche unnötige Teile
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Wechseln Sie zum Schreibtyp
basic_dict = {}
for basic in basic_ary:
#In Schlüssel und Werte unterteilt
key, *values = basic.split('=')
#Formen Sie den Schlüssel
key = key.replace(' ', '').replace('|', '')
#Beitreten, da die Werte aufgelistet sind
value = ''.join(values).strip()
#Entfernen des markierten Markups
value = value.replace("'''''", '').replace("'''", '').replace("'", '')
#Interne Link-Zeichenfolge abrufen
targets = re.findall('((?<=({{)).+?(?=(}})))', value)
#Formatierung der internen Linkzeichenfolge
if targets:
for target in targets:
value = re.sub('{{.+?}}', target[0].split('|')[-1], value, count=1)
#Interne Link-Zeichenfolge abrufen
targets = re.findall('((?<=(\[\[)).+?(?=(\]\])))', value)
#Formatierung der internen Linkzeichenfolge
if targets:
for target in targets:
value = re.sub('\[\[.+?\]\]', target[0].split('|')[-1], value, count=1)
#Tag-Entfernung
value = value.replace('<br />', '')
value = re.sub('<ref.+?</ref>', '', value)
value = re.sub('<ref.+?/>', '', value)
basic_dict[key] = value
pprint.pprint(basic_dict)
Ausgabeergebnis (Teil)
{'GDP/Mann': '36,727',
'BIP-Wert': '2.316,2 Milliarden',
'BIP-Wert MER': '2.433,7 Milliarden',
︙
'Name des Premierministers': 'Boris Johnson',
'Titel des Premierministers': 'Premierminister',
'Hauptstadt': 'London (virtuell)'}
Verwenden Sie den Inhalt der Vorlage, um die URL des Flaggenbilds abzurufen. (Hinweis: Rufen Sie imageinfo in der MediaWiki-API auf, um Dateiverweise in URLs zu konvertieren.)
Code
import json
import regex as re
import requests
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Da die Originaldaten JSON Lines ≠ JSON sind, lesen Sie Zeile für Zeile
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#UK extrahieren
eng = list(filter(lambda e: e['title'] == 'England', jsons))
eng_data = eng[0]
#Text extrahieren
text = eng_data['text']
#Grundlegende Informationen extrahieren
basic_text = re.search('{{Grundinformation[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Liste nach Zeilenumbrüchen auf und lösche unnötige Teile
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Wechseln Sie zum Schreibtyp
basic_dict = {}
for basic in basic_ary:
#In Schlüssel und Werte unterteilt
key, *values = basic.split('=')
#Formen Sie den Schlüssel
key = key.replace(' ', '').replace('|', '')
#Beitreten, da die Werte aufgelistet sind
value = ''.join(values).strip()
#Entfernen des markierten Markups
value = value.replace("'''''", '').replace("'''", '').replace("'", '')
#Interne Link-Zeichenfolge abrufen
targets = re.findall('((?<=({{)).+?(?=(}})))', value)
#Formatierung der internen Linkzeichenfolge
if targets:
for target in targets:
value = re.sub('{{.+?}}', target[0].split('|')[-1], value, count=1)
#Interne Link-Zeichenfolge abrufen
targets = re.findall('((?<=(\[\[)).+?(?=(\]\])))', value)
#Formatierung der internen Linkzeichenfolge
if targets:
for target in targets:
value = re.sub('\[\[.+?\]\]', target[0].split('|')[-1], value, count=1)
#Tag-Entfernung
value = value.replace('<br />', '')
value = re.sub('<ref.+?</ref>', '', value)
value = re.sub('<ref.+?/>', '', value)
basic_dict[key] = value
#API-Aufruf
session = requests.Session()
params = {
'action': 'query',
'format': 'json',
'prop': 'imageinfo',
'titles': 'File:' + basic_dict['Flaggenbild'],
'iiprop': 'url'
}
result = session.get('https://ja.wikipedia.org/w/api.php', params=params)
res_json = result.json()
print(res_json['query']['pages']['-1']['imageinfo'][0]['url'])
Ausgabeergebnis
https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg
Was Sie in Kapitel 3 lernen können
Recommended Posts