[PYTHON] Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3

Einführung

Ich habe versucht Sprachverarbeitung 100 Knock 2020. Sie können den Link anderer Kapitel von hier und den Quellcode von hier sehen.

Kapitel 3 Reguläre Ausdrücke

Nr.20 JSON-Daten lesen

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.

Antwort

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}}
Kommentare

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.

Nr.21 Zeilen mit Kategorienamen extrahieren

Extrahieren Sie die Zeile, in der der Kategoriename im Artikel angegeben ist.

Antwort

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|*]]'...
Kommentare

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.

Nr.22 Extraktion des Kategorienamens

Extrahieren Sie die Namen der Artikelkategorien (nach Namen, nicht zeilenweise).

Antwort

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'...
Kommentare

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.

Nr.23 Abschnittsstruktur

Zeigen Sie den Abschnittsnamen und seine Ebene (z. B. 1, wenn "== Abschnittsname ==") im Artikel enthalten sind.

Antwort

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'}...
Kommentare

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.

Nr.24 Extraktion der Dateireferenz

Extrahieren Sie alle Mediendateien, auf die aus dem Artikel verwiesen wird.

Antwort

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 "...
Kommentare

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.

Nr.25 Vorlagenextraktion

Extrahieren Sie die Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.

Antwort

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',...
Kommentare

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

Nr.26 Entfernen von hervorgehobenem Markup

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

Antwort

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]])',...
Kommentare

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

Nr.27 Entfernen interner Links

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

Antwort

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

[A]Der in der Form vonA,[A|...|B]Der in der Form vonBWird 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.

Nr.28 Entfernen des MediaWiki-Markups

Entfernen Sie zusätzlich zur Verarbeitung> 27 MediaWiki-Markups so weit wie möglich aus den Vorlagenwerten und formatieren Sie grundlegende Länderinformationen.

Antwort

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

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

Nr.29 Holen Sie sich die URL des Flaggenbildes

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

Antwort

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
Kommentare

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

Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 10-14]
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 15-19]
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung klopft Kapitel 2 (10 ~ 19)
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
[Ich habe es versucht] Nand2 Tetris Kapitel 6