Ich habe versucht Sprachverarbeitung 100 Knock 2020. Sie können den Link anderer Kapitel von hier und den Quellcode von hier sehen.
Lesen Sie die JSON-Datei des Wikipedia-Artikels und zeigen Sie den Artikeltext zu "UK" an. Führen Sie in den Fragen 21 bis 29 den hier extrahierten Artikeltext aus.
020.py
import pandas as pd
path = "jawiki-country.json.gz"
df = pd.read_json(path, lines=True)
print(df.query("title == 'England'")["text"].values[0])
# -> {{redirect|UK}}
# {{redirect|Vereinigtes Königreich|Die Nationen des Frühlings und des Herbstes|Englisch(Frühling und Herbst)}}
# {{Otheruses|Europäisches Land|Lokale Küche der Präfekturen Nagasaki und Kumamoto|Igirisu}}
Da die angegebene Datei im Format "JSON Lines" vorliegt, setzen wir "lines" auf "True".
Mit query ()
können Sie Zeilenelemente abrufen, die die Bedingungen erfüllen. Sie können auch df [df [" title "] =" UK "]
ausführen.
Extrahieren Sie die Zeile, in der der Kategoriename im Artikel angegeben ist.
021.py
import input_json as js
article = js.input()
print(list(filter(lambda x: "[[Category" in x, article)))
# -> ['[[Category:England|*]]', '[[Category:England連邦加盟国]]', '[[Category:Königreich des Vereinigten Königreichs|*]]'...
Die in Nr. 20 extrahierte Anweisung kann jetzt mit "import" und "js.input ()" aufgerufen werden.
Gibt die Filterfunktion einen Iterator zurück, richtig? Ich habe den Eindruck, dass die Verarbeitung von list (filter ())
nicht gut passt. Ich frage mich, ob es eine andere Implementierungsmethode gibt.
Extrahieren Sie die Namen der Artikelkategorien (nach Namen, nicht zeilenweise).
022.py
import input_json as js
import re
article = js.input()
list = [re.match("\[\[Category:([^\|,\]]+)", item) for item in article]
print([str.groups()[0] for str in list if str is not None])
# -> ['England', 'England連邦加盟国', 'Königreich des Vereinigten Königreichs'...
Ich habe festgestellt, dass der Titel in diesem Kapitel ein regulärer Ausdruck ist, also habe ich ihn damit geschrieben.
Extrahieren der in "[[Kategorie:" und "|" oder "]" eingeschlossenen Zeichenfolge. Es ist wie ein Code und es macht Spaß.
Wenn Sie groups ()
verwenden, erhalten Sie den Inhalt von()
im regulären Ausdruck als Mehrfachtyp, daher habe ich sie in einem Listentyp zusammengefasst.
Zeigen Sie den Abschnittsnamen und seine Ebene (z. B. 1, wenn "== Abschnittsname ==") im Artikel enthalten sind.
023.py
import input_json as js
import re
article = js.input()
list = [re.search("(==+)([^=]*)", item) for item in article]
print([{item.group(2): f'Level {item.group(1).count("=")}'} for item in list if not item == None])
# -> [{'Ländername': 'Level 2'}, {'Geschichte': 'Level 2'}...
Ich habe die Teile == + und [^ =] * des regulären Ausdrucks mit search (). Group () erhalten. Die Ebene des Abschnitts entsprach also der Anzahl von
=, also habe ich versucht, sie mit
count () im Typ
dict` zusammenzusetzen.
Extrahieren Sie alle Mediendateien, auf die aus dem Artikel verwiesen wird.
024.py
import input_json as js
import re
article = js.input()
list = [re.search("^\[\[Datei:([^|]*)", item) for item in article]
print([str.group(1) for str in list if not str==None])
# -> ['Descriptio Prime Tabulae Europae.jpg', "Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg "...
Mit Blick auf die Markup-Kurzreferenz, [[File:
Es fühlt sich an, als wäre der Teil, mit dem begonnen wird, eine Mediendatei. Ich habe auch nach einer Zeichenfolge gesucht, die [[File:
enthält, aber ich habe sie ausgeschlossen, weil es unwahrscheinlich erscheint.
Extrahieren Sie die Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.
025.py
import pandas as pd
import re
df = pd.read_json("jawiki-country.json.gz", lines=True)
article = df.query("title == 'England'")["text"].values[0]
str = re.findall("(?<=Grundlegende Informationen Land\n\|).*(?=\n\}\})", article, flags=re.DOTALL)
ans = {}
for item in str[0].replace(" ", "").split("\n|"):
kv = re.sub("\<ref\>.*\</ref\>", "", item, flags=re.DOTALL).split("=")
ans[kv[0]] = kv[1]
print(ans)
# -> {'Kurzbezeichnung': 'England', 'Japanischer Ländername': 'Vereinigtes Königreich Großbritannien und Nordirland',...
Der Teil, der mit "{{grundlegende Informationen" beginnt und mit "\ n}}" endet, wird durch "positive Vorausschau" und "positive Vorausschau" abgeglichen, und "Teilen" erfolgt mit "\ n |". Sie müssen das Flag "re.DOTALL" setzen, da Sie "\ n" in die Übereinstimmungsanweisung aufnehmen müssen. Dieses Problem hat eine ganze Weile gedauert ...
Entfernen Sie bei 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-Schnellreferenztabelle).
026.py
import pandas as pd
import re
def remove_quote(a: list):
ans = {}
for i in a:
i = re.sub("'+", "", i, flags=re.DOTALL)
i = re.sub("<br/>", "", i, flags=re.DOTALL).split("=")
ans[i[0]]= i[1]
return ans
df = pd.read_json("jawiki-country.json.gz", lines=True)
article = df.query("title == 'England'")["text"].values[0]
str = re.findall("(?<=Grundlegende Informationen Land\n\|).*(?=\n\}\})", article, flags=re.DOTALL)
list = [re.sub("\<ref\>.*\</ref\>", "", item, flags=re.DOTALL) for item in str[0].replace(" ", "").split("\n|")]
print(remove_quote(list))
# -> ...'Slogan': '{{lang|fr|[[Dieuetmondroit]]}}([[Französisch]]:[[Dieuetmondroit|Gott und meine Rechte]])',...
`` Und
`aus der Ausgabe von Nr. 25 entfernt.
Es scheint, dass der Typ im Argument der Funktion angegeben werden kann, also habe ich versucht, ihn zu verwenden.
Entfernen Sie zusätzlich zur Verarbeitung von> 26 das interne Link-Markup für MediaWiki aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).
027.py
import pandas as pd
import re
p_quote = re.compile("'+")
p_br = re.compile("<br/>")
p_ref = re.compile("\<ref\>.*\</ref\>", re.DOTALL)
p_emphasis1 = re.compile("\[\[[^\]]*\|([^\|]*?)\]\]")
p_emphasis2 = re.compile("\[\[(.+?)\]\]")
def remove_markup(a: list):
ans = {}
for i in a:
i = p_quote.sub("", i)
i = p_br.sub("", i)
i = p_emphasis1.sub(r"\1", i)
if p_emphasis2.search(i):
i = i.replace("[", "").replace("]", "")
i = i.split("=")
ans[i[0]] = i[1]
return ans
df = pd.read_json("jawiki-country.json.gz", lines=True)
article = df.query("title == 'England'")["text"].values[0]
str = re.findall("(?<=Grundlegende Informationen Land\n\|).*(?=\n\}\})", article, flags=re.DOTALL)
list = [p_ref.sub("", item) for item in str[0].replace(" ", "").split("\n|")]
print(remove_markup(list))
# -> ...'Slogan': '{{lang|fr|Dieuetmondroit}}(Französisch:Gott und meine Rechte)'...
[A]
Der in der Form vonA
,[A|...|B]
Der in der Form vonB
Wird ausgegeben.
Ich habe auch reguläre Ausdrücke vorkompiliert und verwendet. Allmählich verstehe ich den regulären Ausdruck nicht.
Ich dachte auch, nachdem ich die obige Antwort gesehen hatte, aber wenn Sie es wissen, lassen Sie mich bitte wissen, ob Sie das Phänomen lösen können, dass die Farbanordnung seltsam wird, wenn Sie einen regulären Ausdruck einbetten.
Entfernen Sie zusätzlich zur Verarbeitung> 27 MediaWiki-Markups so weit wie möglich aus den Vorlagenwerten und formatieren Sie grundlegende Länderinformationen.
028.py
import pandas as pd
import re
p_quote = re.compile("'+")
p_br = re.compile("<br/>")
p_ref = re.compile("\<ref\>.*\</ref\>", re.DOTALL)
p_emphasis1 = re.compile("\[\[[^\]]*\|([^\|]*?)\]\]")
p_emphasis2 = re.compile("\[\[(.+?)\]\]")
p_templete1 = re.compile("\{\{\d\}\}")
p_templete2 = re.compile("\{\{.*\|([^\|]*?)\}\}")
p_refname = re.compile("<refname.*")
def remove_markup(a: list):
ans = {}
for i in a:
i = p_quote.sub("", i)
i = p_br.sub("", i)
i = p_emphasis1.sub(r"\1", i)
if p_emphasis2.search(i):
i = i.replace("[", "").replace("]", "")
i = p_templete1.sub("", i)
i = p_templete2.sub(r"\1", i)
i = p_refname.sub("", i)
i = re.sub("((Staatswappen))", r"\1", i)
i = re.sub("\}\}Datei.*", "", i).split("=")
ans[i[0]] = i[1]
return ans
df = pd.read_json("jawiki-country.json.gz", lines=True)
article = df.query("title == 'England'")["text"].values[0]
str = re.findall("(?<=Grundlegende Informationen Land\n\|).*(?=\n\}\})", article, flags=re.DOTALL)
list = [p_ref.sub("", item) for item in str[0].replace(" ", "").split("\n|")]
print(remove_markup(list))
# -> ...'Slogan': 'Dieuetmondroit (Französisch:Gott und meine Rechte)'...
Ich habe versucht, das Markup von einem Ende zu entfernen. Diese Schreibweise scheint jedoch nicht gut für Artikel außerhalb Großbritanniens zu gelten. (In dem Artikel in Singapur konnten beispielsweise die Parameter der Flaggenbreite usw. nicht extrahiert werden.)
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.)
029.py
import requests
import pandas as pd
import re
p_quote = re.compile("'+")
p_br = re.compile("<br />")
p_ref = re.compile("\<ref\>.*\</ref\>", re.DOTALL)
p_emphasis1 = re.compile("\[\[[^\]]*\|([^\|]*?)\]\]")
p_emphasis2 = re.compile("\[\[(.+?)\]\]")
p_templete1 = re.compile("\{\{\d\}\}")
p_templete2 = re.compile("\{\{.*\|([^\|]*?)\}\}")
p_refname = re.compile("<ref name.*")
def remove_markup(a: list):
ans = {}
for i in a:
i = p_quote.sub("", i)
i = p_br.sub("", i)
i = p_emphasis1.sub(r"\1", i)
if p_emphasis2.search(i):
i = i.replace("[", "").replace("]", "")
i = p_templete1.sub("", i)
i = p_templete2.sub(r"\1", i)
i = p_refname.sub("", i)
i = re.sub("((Staatswappen))", r"\1", i)
i = re.sub("\}\}Datei.*", "", i).split("=")
i[0] = re.sub("^\s", "", i[0])
i[0] = re.sub("\s$", "", i[0])
i[1] = re.sub("^\s", "", i[1])
i[1] = re.sub("\s$", "", i[1])
ans[i[0]] = i[1]
return ans
df = pd.read_json("jawiki-country.json.gz", lines=True)
article = df.query("title == 'England'")["text"].values[0]
str = re.findall("(?<=Grundlegende Informationen Land\n\|).*(?=\n\}\})", article, flags=re.DOTALL)
list = [p_ref.sub("", item) for item in str[0].split("\n|")]
page = remove_markup(list)
print(page["Flaggenbild"])
url = 'https://en.wikipedia.org/w/api.php'
PARAMS = {
"action": "query",
"format": "json",
"prop": "imageinfo",
"iiprop": "url",
"titles": "File:" + page["Flaggenbild"]
}
response = requests.get(url, params=PARAMS)
data = response.json()
for k, v in data["query"]["pages"].items():
print(f"{v['imageinfo'][0]['url']}")
# -> https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg
Eigentlich wollte ich Nr. 28 "importieren", aber ich habe den Teil der Markup-Entfernung ein wenig geändert, also habe ich alle Zeilen gepostet.
Ich sende eine GET-Anfrage mit dem "Anfrage" -Modul. Imageinfo of MediaWiki API war sehr hilfreich.
Recommended Posts