[PYTHON] 100 natürliche Sprachverarbeitung klopft Kapitel 3 Reguläre Ausdrücke (erste Hälfte)

Eine Aufzeichnung zur Lösung der Probleme in der ersten Hälfte von Kapitel 3. Wie Sie auf der Webseite sehen können, lautet die Zieldatei jawiki-country.json, eine Erweiterung von jawiki-country.json.gz.

Es gibt eine Datei jawiki-country.json.gz, die Wikipedia-Artikel im folgenden Format exportiert. Informationen zu einem Artikel pro Zeile werden 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.

</ i> 20. Lesen von JSON-Daten

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.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re
import json

inputfile = 'jawiki-country.json'
outputfile = 'jawiki-england.txt'

f = open(inputfile)
g = open(outputfile, 'w')

target = re.compile(u'England')

for line in f:
    res = json.loads(line)
    if target.search(res[u'text']):
        g.write(res['text'].encode('utf8') + '\n')
f.close()
g.close()

#=> (Datei jawiki-england.Ausgabe an txt)

Verwenden Sie das Re-Modul. Da Japanisch als Unicode-Zeichenfolge behandelt wird, wird es in Form von "u'UK" geschrieben. Kompilieren Sie mit der Kompilierungsmethode des re-Moduls zu einem regulären Ausdruck und bestimmen Sie mit der Suchmethode, ob jede Zeile target (UK) enthält.

</ i> 21. Extrahieren Sie Zeilen mit Kategorienamen

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

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_category.txt'

f = open(inputfile)
g = open(outputfile, "w")

category = re.compile('\[\[Category:.+\]\]')

for line in f:
    if category.match(line):
        g.write(line.strip() + "\n")

f.close()
g.close()

#=> (Datei jawiki-england_category.Ausgabe an txt)

Gleich wie das vorherige Problem. Beurteilung, ob "[[Kategorie: ~]]" aufgenommen werden soll. Escape [ und ], weil es sich um einen regulären Ausdruck handelt.

</ i> 22. Extraktion des Kategorienamens

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

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_category-name.txt'

f = open(inputfile)
g = open(outputfile, "w")

category = re.compile('\[\[Category:(.+)\]\]')

for line in f:
    l = category.match(line)
    if l:
        g.write(l.group(1) + "\n")

f.close()
g.close()

#=> (Datei jawiki-england_category-name.Ausgabe an txt)

Rufen Sie den Kategorienamen mit der Gruppenmethode des re-Moduls ab. Sie können das Teil durch das Teil (. +) Muster erhalten, das beim Kompilieren des regulären Ausdrucks in Klammern eingeschlossen ist. Wenn das Argument "0" ist, wird die gesamte Übereinstimmung zurückgegeben, und wenn es sich um einen numerischen Wert handelt, wird der gemusterte Teil der Zahl zurückgegeben (wenn der numerische Wert größer als die Anzahl der Muster ist, wird IndexError zurückgegeben).

</ i> 23. Abschnittsstruktur

Zeigen Sie die im Artikel enthaltenen Abschnittsnamen und deren Ebenen an (z. B. 1, wenn "== Abschnittsname ==").

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_section.txt'

f = open(inputfile)
g = open(outputfile, "w")

section = re.compile(r'=(=+) (.+) =')

for line in f:
    l = section.match(line)
    if l:
        g.write("sec%s : " % len(l.group(1)))
        g.write(l.group(2) + "\n")

f.close()
g.close()

#=> (Datei jawiki-england_section.Ausgabe an txt)

Verwenden Sie wie im vorherigen Problem die Gruppenmethode. Die Schnittebene wird durch die Anzahl von = bestimmt.

</ i> 24. Extrahieren von Dateiverweisen

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

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

inputfile = 'jawiki-england.txt'
outputfile = 'jawiki-england_media.txt'

f = open(inputfile)
g = open(outputfile, "w")

mediafile = re.compile(r".*(Datei|File|file):(.*\.[a-zA-Z0-9]+)\|.*")

for line in f:
    l = mediafile.match(line)
    if l:
        g.write(l.group(2) + "\n")

f.close()
g.close()

#=> (Datei jawiki-england_media.Ausgabe an txt)

Gleich wie das Problem bisher.

Ich fand es kompliziert, Gruppen zu verwenden, aber nachdem ich ein paar Fragen gelöst hatte, verstand ich es irgendwie.

Recommended Posts