Sprachverarbeitung 100 Schläge 2015 ["Kapitel 3: Reguläre Ausdrücke"](http: //www.cl.ecei.tohoku) Dies ist der Datensatz von 29. "Abrufen der URL des Flaggenbilds" von .ac.jp / nlp100 / # ch3). Dieses Mal extrahieren wir den Wert eines bestimmten Elements aus dem Wörterbuch, das mit regulären Ausdrücken erstellt wurde, und werfen es an den Webdienst.
Verknüpfung | Bemerkungen |
---|---|
029.Holen Sie sich die URL des Flaggenbildes.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:29 | Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein |
Lernen Sie von Grund auf Python Grundlagen und Tipps für reguläre Ausdrücke | Ich habe organisiert, was ich in diesem Klopfen gelernt habe |
Regulärer Ausdruck HOWTO | Python offizieller regulärer Ausdruck How To |
re ---Operation mit regulären Ausdrücken | Python offizielle Re-Paketbeschreibung |
Help:Vereinfachtes Diagramm | Wikipediaの代表的なマークアップのVereinfachtes Diagramm |
Art | Ausführung | Inhalt |
---|---|---|
OS | Ubuntu18.04.01 LTS | Es läuft virtuell |
pyenv | 1.2.15 | Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze |
Python | 3.6.9 | python3 auf pyenv.6.Ich benutze 9 3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden Pakete werden mit venv verwaltet |
In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren. Ich habe mich gefragt, ob ich das "Anfragen" -Paket verwenden soll, aber ich habe es nicht verwendet, weil es so einfach war, dass ich es nicht verwenden musste. Wenn Sie es verwenden, sollte der Code etwas kürzer sein.
Art | Ausführung |
---|---|
pandas | 0.25.3 |
Verschiedene Informationen und Kenntnisse können extrahiert werden, indem reguläre Ausdrücke auf die Markup-Beschreibung auf der Wikipedia-Seite angewendet werden.
Reguläre Ausdrücke, JSON, Wikipedia, InfoBox, Webdienste
Eine Datei jawiki-country.json.gz, die Wikipedia-Artikel im folgenden Format exportiert Es gibt.
- Eine Artikelinformation pro Zeile wird 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 komprimiert
Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt.
Verwenden Sie den Inhalt der Vorlage, um die URL des Flaggenbilds abzurufen. (Hinweis: imageinfo in MediaWiki API Rufen Sie es auf und konvertieren Sie den Dateiverweis in eine URL.
Ich habe auf die folgenden zwei Links bezüglich der MediaWiki-API verwiesen. MediaWiki API: Hauptseite der API imageinfo: Erläuterung der Beispiele und Parameter
from collections import OrderedDict
import json
import re
from urllib import request, parse
import pandas as pd
def extract_by_title(title):
df_wiki = pd.read_json('jawiki-country.json', lines=True)
return df_wiki[(df_wiki['title'] == title)]['text'].values[0]
wiki_body = extract_by_title('England')
basic = re.search(r'''
^\{\{Grundinformation.*?\n #Suchbegriff(\Ist Escape-Verarbeitung), Nicht gefangen genommen, nicht gierig
(.*?) #Beliebige Zeichenfolge
\}\} #Suchbegriff(\Ist Escape-Verarbeitung)
$ #Ende der Zeichenfolge
''', wiki_body, re.MULTILINE+re.VERBOSE+re.DOTALL)
templates = OrderedDict(re.findall(r'''
^\| # \Ist Escape-Verarbeitung, nicht erfasst
(.+?) #Ziel erfassen(key), Nicht geizig
\s* #0 oder mehr Leerzeichen
= #Suchbegriffe, nicht erfasst
\s* #0 oder mehr Leerzeichen
(.+?) #Ziel erfassen(Value), Nicht geizig
(?: #Starten Sie eine Gruppe, die nicht erfasst wird
(?=\n\|) #Neue Zeile(\n)+'|'Vor dem(Bejahender Ausblick)
| (?=\n$) #Oder ein Zeilenumbruch(\n)+Vor dem Ende(Bejahender Ausblick)
) #Ende der Gruppe, die nicht erfasst werden soll
''', basic.group(1), re.MULTILINE+re.VERBOSE+re.DOTALL))
#Markup-Entfernung
def remove_markup(string):
#Entfernen des markierten Markups
#Entfernungsziel:''Unterscheide dich von anderen''、'''Betonung'''、'''''斜体とBetonung'''''
replaced = re.sub(r'''
(\'{2,5}) #2-5'(Beginn des Markups)
(.*?) #Ein oder mehrere Zeichen (Zielzeichenfolge)
(\1) #Entspricht der ersten Aufnahme (Ende des Markups)
''', r'\2', string, flags=re.MULTILINE+re.VERBOSE)
#Entfernen von internen Linkdateien
#Entfernungsziel:[[Artikelüberschrift]]、[[Artikelüberschrift|Zeichen anzeigen]]、[[Artikelüberschrift#Abteilungsname|Zeichen anzeigen]]、[[Datei:Wi.png|thumb|Erläuterungstext]]
replaced = re.sub(r'''
\[\[ # '[['(Markup starten)
(?: #Starten Sie eine Gruppe, die nicht erfasst wird
[^|]*? # '|'Andere Zeichen als 0 Zeichen oder mehr, nicht gierig
\| # '|'
)*? #Gruppenende, diese Gruppe erscheint 0 oder mehr, nicht gierig(Änderungen von Nr. 27)
( #Gruppenstart, Ziel erfassen
(?!Category:) #Negativer Ausblick(Wenn es enthalten ist, ist es ausgeschlossen.)
([^|]*?) # '|'Andere als 0 Zeichen, nicht gierig(Zeichenfolge angezeigt werden)
)
\]\] # ']]'(Ende des Markups)
''', r'\1', replaced, flags=re.MULTILINE+re.VERBOSE)
# Template:Entfernung von Lang
#Entfernungsziel:{{lang|Sprach-Tag|String}}
replaced = re.sub(r'''
\{\{lang # '{{lang'(Markup starten)
(?: #Starten Sie eine Gruppe, die nicht erfasst wird
[^|]*? # '|'0 oder mehr Zeichen als nicht gierig
\| # '|'
)*? #Gruppenende, diese Gruppe erscheint 0 oder mehr, nicht gierig
([^|]*?) #Ziel erfassen,'|'Andere als 0 Zeichen, nicht gierig(Zeichenfolge angezeigt werden)
\}\} # '}}'(Ende des Markups)
''', r'\1', replaced, flags=re.MULTILINE+re.VERBOSE)
#Entfernen von externen Links
#Ziel entfernt werden[http(s)://xxxx] 、[http(s)://xxx xxx]
replaced = re.sub(r'''
\[https?:// # '[http://'(Markup starten)
(?: #Starten Sie eine Gruppe, die nicht erfasst wird
[^\s]*? #0 oder mehr nicht leere Zeichen, nicht gierig
\s #Leer
)? #Gruppenende, diese Gruppe erscheint 0 oder 1
([^]]*?) #Ziel erfassen,']'Andere als 0 Zeichen, nicht gierig (Zeichenfolge, die angezeigt werden soll)
\] # ']'(Ende des Markups)
''', r'\1', replaced, flags=re.MULTILINE+re.VERBOSE)
#Entfernen von HTML-Tags
#Ziel entfernt werden<xx> </xx> <xx/>
replaced = re.sub(r'''
< # '<'(Start des Markups)
.+? #1 oder mehr Zeichen, nicht gierig
> # '>'(Ende des Markups)
''', '', replaced, flags=re.MULTILINE+re.VERBOSE)
return replaced
for i, (key, value) in enumerate(templates.items()):
replaced = remove_markup(value)
templates[key] = replaced
#Anforderungsgenerierung
url = 'https://www.mediawiki.org/w/api.php?' \
+ 'action=query' \
+ '&titles=File:' + parse.quote(templates['Flaggenbild']) \
+ '&format=json' \
+ '&prop=imageinfo' \
+ '&iiprop=url'
#Senden Sie eine Anfrage an den MediaWiki-Dienst
connection = request.urlopen(request.Request(url))
#Als json erhalten
response = json.loads(connection.read().decode())
print(response['query']['pages']['-1']['imageinfo'][0]['url'])
Der Hauptteil dieser Zeit ist der folgende Teil.
Für den URL-Parameter wird der Wert von "Flag Image" aus dem Wörterbuch abgerufen, das durch den regulären Ausdruck erstellt wurde (da das Leerzeichen usw. gemischt wird, wenn es einfach abgerufen wird, wird die Funktion [urllib.parse.quote
]( Codiert mit https://docs.python.org/ja/3/library/urllib.parse.html#urllib.parse.quote).
Ohne Zertifizierung ist es einfach zu gewinnen.
python
#Anforderungsgenerierung
url = 'https://www.mediawiki.org/w/api.php?' \
+ 'action=query' \
+ '&titles=File:' + parse.quote(templates['Flaggenbild']) \
+ '&format=json' \
+ '&prop=imageinfo' \
+ '&iiprop=url'
#Senden Sie eine Anfrage an den MediaWiki-Dienst
connection = request.urlopen(request.Request(url))
#Als json erhalten
response = json.loads(connection.read().decode())
print(response['query']['pages']['-1']['imageinfo'][0]['url'])
Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben.
Ausgabeergebnis
https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg
Dieses Bild.