[PYTHON] Sprachverarbeitung 100 Knocks-21: Extrahieren Sie Zeilen mit Kategorienamen

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 3: Reguläre Ausdrücke"](http: //www.cl.ecei.tohoku) Es ist eine Aufzeichnung von 21. "Zeile einschließlich Kategorienamen extrahieren" von .ac.jp / nlp100 / # ch3). Das letzte Mal war eine Vorbereitung, und dieses Mal werden wir reguläre Ausdrücke üben. Bis jetzt verwendet Gugu viele grundlegende Inhalte, an die ich mich erinnerte. Insbesondere ist es voll von Grundlagen wie ** rohe Zeichenkette, re.VERBOSE, re.MULTILINE, dreifaches Anführungszeichen **.

Referenzlink

Verknüpfung Bemerkungen
021.Extrahieren Sie Zeilen mit Kategorienamen.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:21 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

Umgebung

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.

Art Ausführung
pandas 0.25.3

Kapitel 3: Reguläre Ausdrücke

Inhalt des Studiums

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

Klopfe an den Inhalt

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.

21. Zeilen mit Kategorienamen extrahieren

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

Problemergänzung (über "Kategoriename")

Laut Hilfe: Kurzreferenz lautet der "Kategoriename" [[[ Kategorie: Hilfe | Hayami Hiyo]] Format. Extrahieren Sie den folgenden Teil der Datei mit einem regulären Ausdruck.

Auszug aus dem Teil "Kategoriename" der Datei


[[Category:England|*]]\n'
[[Category:Königreich des Vereinigten Königreichs|*]]\n'
[[Category:G8-Mitgliedsländer]]\n'
[[Category:Mitgliedsländer der Europäischen Union]]\n'
[[Category:Marine Nation]]\n'
[[Category:Souveränes Land]]\n'
[[Category:Inselstaat|Kureito Furiten]]\n'
[[Category:Staat / Region gegründet 1801]]'

Antworten

Antwortprogramm [021. Zeilen mit dem Kategorienamen.ipynb extrahieren](https://github.com/YoheiFukuhara/nlp100/blob/master/03.%E6%AD%A3%E8%A6%8F%E8%A1 % A8% E7% 8F% BE / 021.% E3% 82% AB% E3% 83% 86% E3% 82% B4% E3% 83% AA% E5% 90% 8D% E3% 82% 92% E5% 90% AB% E3% 82% 80% E8% A1% 8C% E3% 82% 92% E6% 8A% BD% E5% 87% BA.ipynb)

from pprint import pprint
import re

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

#Ignorieren Sie die Escape-Sequenz in der Rohzeichenfolge, wenn r am Anfang steht
#Ignorieren Sie Pausen in der Mitte mit dreifachen Anführungszeichen
# re.Ignorieren Sie Leerzeichen und Kommentare mit der Option VERBOSE
# re.Suchen Sie mit MULTILINE nach mehreren Zeilen
pprint(re.findall(r'''
                     ^                  #Der Anfang der Zeichenfolge(Das Ergebnis ändert sich auch dann nicht, wenn Sie es nicht haben, sondern es einfügen)
                     (                  #Gruppierung starten
                     .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                     \[\[Category:      #Suchbegriff(\Ist Escape-Verarbeitung)
                     .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                     \]\]               #Suchbegriff(\Ist Escape-Verarbeitung)
                     .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                     )                  #Ende der Gruppierung
                     $                  #Ende der Zeichenfolge(Das Ergebnis ändert sich auch dann nicht, wenn Sie es nicht haben, sondern es einfügen)
                     ''', wiki_body, re.MULTILINE+re.VERBOSE))

Kommentar beantworten

Das Hauptthema dieses Klopfens ist wie folgt.

pprint(re.findall(r'''
                     ^                  #Der Anfang der Zeichenfolge(Das Ergebnis ändert sich auch dann nicht, wenn Sie es nicht haben, sondern es einfügen)
                     (                  #Gruppierung starten
                     .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                     \[\[Category:      #Suchbegriff(\Ist Escape-Verarbeitung)
                     .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                     \]\]               #Suchbegriff(\Ist Escape-Verarbeitung)
                     .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                     )                  #Ende der Gruppierung
                     $                  #Ende der Zeichenfolge(Das Ergebnis ändert sich auch dann nicht, wenn Sie es nicht haben, sondern es einfügen)
                     ''', wiki_body, re.MULTILINE+re.VERBOSE))

Holen Sie sich alle Suchergebnisse mit der Funktion findall

Die Funktion findall ** gibt alle Zeichenfolgen zurück, die dem Muster im Listenformat ** entsprechen. Im folgenden Beispiel werden alle Zusatzwörter extrahiert, die mit "ly" enden (\ w ist" alphabetische Zeichen und Unterstreichung ". #% E7% 89% B9% E6% AE% 8A% E6% 96% 87% E5% AD% 97).

Beispiel finden


>>> text = "He was carefully disguised but captured quickly by police."
>>> re.findall(r"\w+ly", text)
['carefully', 'quickly']

[roher String](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#raw%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7% E3% 82% A8% E3% 82% B9% E3% 82% B1% E3% 83% BC% E3% 83% 97% E3% 82% B7% E3% 83% BC% E3% 82% B1% E3% Escape-Sequenz deaktiviert bei 83% B3% E3% 82% B9% E7% 84% A1% E5% 8A% B9)

Stellen Sie dem Zitat ein "r" voran, um daraus eine rohe Zeichenfolge zu machen. Sie können die Escape-Sequenz mithilfe einer Rohzeichenfolge deaktivieren. ** Wenn das Muster für reguläre Ausdrücke eine Escape-Sequenz enthält, ist es schwer zu lesen. Machen Sie es daher zu einer rohen Zeichenfolge und machen Sie es ungültig **.

Beispiel für die Ausgabe von Rohzeichenfolgen


>>> print('a\tb\nA\tB')
a   b
A   B

>>> print(r'a\tb\nA\tB')
a\tb\nA\tB

[Dreifaches Zitat](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#%E3%83%88%E3%83%AA%E3%83%97%E3%83%AB%E3%82%AF% E3% 82% A9% E3% 83% BC% E3% 83% 88% E3% 81% A8 Reverbose% E3% 81% A7% E6% 94% B9% E8% A1% 8C% E3% 82% B3% E3% 83% A1% E3% 83% B3% E3% 83% 88% E7% A9% BA% E7% 99% BD% E7% 84% A1% E8% A6% 96)

Sie können Zeilenumbrüche im Muster für reguläre Ausdrücke verwenden, indem Sie sie in dreifache Anführungszeichen setzen (auch mit "" "" möglich). ** Normal durch Zeilenumbrüche. Erleichtert das Lesen des Ausdrucksmusters **

Verwendungsbeispiel für dreifache Anführungszeichen


a = re.compile(r'''\d +
                   \.  
                   \d *''')

[re.VERBOSE](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#%E3%83%88%E3%83%AA%E3%83%97%E3%83%AB%E3%82 % AF% E3% 82% A9% E3% 83% BC% E3% 83% 88% E3% 81% A8reverbose% E3% 81% A7% E6% 94% B9% E8% A1% 8C% E3% 82% B3 % E3% 83% A1% E3% 83% B3% E3% 83% 88% E7% A9% BA% E7% 99% BD% E7% 84% A1% E8% A6% 96)

Durch Übergeben von "re.VERBOSE" an den Parameter "flags" können Sie Kommentare und Leerzeichen im Muster für reguläre Ausdrücke verwenden (es spielt keine Rolle, ob Sie es nicht verwenden). ** Erleichtern Sie das Lesen des Musters für reguläre Ausdrücke, indem Sie einen Kommentar und ein Leerzeichen einfügen **. Dies ist eine Methode zur Verbesserung der Lesbarkeit, die in Kombination mit dreifachen Anführungszeichen verwendet wird.

Verwendungsbeispiel für dreifache Anführungszeichen


a = re.compile(r'''\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits''', re.VERBOSE)

Suchen Sie mehrere Zeilen mit re.MULTILINE

Verwenden Sie diese Option, wenn Sie nach mehreren Zeilen suchen möchten.

re.Anwendungsbeispiel MULTILINE


string = r'''\
1. Zeile
2. Zeile am Zeilenanfang'''

#Suchziel für mehrere Zeilen
print(re.findall(r'^Zeilenanfang.*', string, re.MULTILINE))
# ['1. Zeile', '2. Zeile am Zeilenanfang']

#Es wird nur die erste Zeile durchsucht
print(re.findall(r'^Zeilenanfang.*', string))
# ['1. Zeile']

Ausgabeergebnis (Ausführungsergebnis)

Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben.

Ausgabeergebnis


['[[Category:England|*]]',
 '[[Category:Königreich des Vereinigten Königreichs|*]]',
 '[[Category:G8-Mitgliedsländer]]',
 '[[Category:Mitgliedsländer der Europäischen Union]]',
 '[[Category:Marine Nation]]',
 '[[Category:Souveränes Land]]',
 '[[Category:Inselstaat|Kureito Furiten]]',
 '[[Category:Staat / Region gegründet 1801]]']

Recommended Posts

Sprachverarbeitung 100 Knocks-21: Extrahieren Sie Zeilen mit Kategorienamen
100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens
100 Sprachverarbeitungsklopfen 03 ~ 05
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 35
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitungsklopfen (2020): 42
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitungsklopfen (2020): 31
100 Sprachverarbeitungsklopfen (2020): 48
100 Sprachverarbeitungsklopfen (2020): 44
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 23
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 20
100 Sprachverarbeitungsklopfen (2020): 27
100 Sprachverarbeitungsklopfen (2020): 46
100 Sprachverarbeitungsklopfen (2020): 21
100 Sprachverarbeitungsklopfen (2020): 36
100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89
100 Amateur-Sprachverarbeitungsklopfen: 40
100 Amateur-Sprachverarbeitungsklopfen: 45
100 Amateur-Sprachverarbeitungsklopfen: 43
100 Amateur-Sprachverarbeitungsklopfen: 55
100 Amateur-Sprachverarbeitungsklopfen: 22
100 Amateur-Sprachverarbeitungsklopfen: 61
100 Amateur-Sprachverarbeitungsklopfen: 94
100 Amateur-Sprachverarbeitungsklopfen: 54
100 Amateur-Sprachverarbeitungsklopfen: 04
100 Amateur-Sprachverarbeitungsklopfen: 63
100 Amateur-Sprachverarbeitungsklopfen: 78
100 Amateur-Sprachverarbeitungsklopfen: 08