[PYTHON] 100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 3: Reguläre Ausdrücke"](http: //www.cl.ecei.tohoku) Es ist eine Aufzeichnung von 22. "Name der Extraktkategorie" von .ac.jp / nlp100 / # ch3). Dieses Mal verwenden wir ** nicht erfasstes / nicht gieriges Match **. Das Gute an diesen 100 Schlägen ist, dass Sie den Inhalt nach und nach lernen können.

Referenzlink

Verknüpfung Bemerkungen
022.Extraktion des Kategorienamens.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:22 Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein
Lernen Sie die Grundlagen und Tipps der kanonischen Python-Ausdrücke von Grund auf neu 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.

22. Extraktion des Kategorienamens

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

Problemergänzung (über "Kategorie")

Laut Hilfe: Kurzreferenz lautet die "Kategorie" "[[Kategorie" : Hilfe | Hayami Hiyo]] Format. Extrahieren Sie den Teil " help` "in diesem Format. In der Datei enthält der Teil "Kategorie" die folgenden Daten.

Auszug aus dem Teil "Kategorie" 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 [022. Kategoriename extrahieren.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/03.%E6%AD%A3%E8%A6%8F%E8%A1%A8% E7% 8F% BE / 022.% E3% 82% AB% E3% 83% 86% E3% 82% B4% E3% 83% AA% E5% 90% 8D% E3% 81% AE% E6% 8A% BD % E5% 87% BA.ipynb)

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
#Suchen Sie nach kurzen Zeichenfolgen, indem Sie sie zu einem nicht gierigen Spiel machen
print(re.findall(r'''
                  ^                  #Der Anfang der Zeichenfolge(Das Ergebnis ändert sich auch dann nicht, wenn Sie es nicht haben, sondern es einfügen)
                  \[\[Category:      #Suchbegriff(\Ist Escape-Verarbeitung)
                  (                  #Starten Sie die zu erfassende Gruppierung
                  .*?                #Nicht gierige Übereinstimmung für eine Zeichenfolge 0 oder mehr
                  )                  #Ende der zu erfassenden Gruppierung
                  (?:                #Starten Sie die Gruppierung außerhalb der Erfassung
                  \|                 #Suchbegriff'|'
                  .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                  )?                 #Ende der Nichterfassungsgruppierung(0/Erscheinungsziel einmal)
                  \]\]               #Suchbegriff(\Ist Escape-Verarbeitung)
                  $                  #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

Der Hauptteil dieser Zeit ist der folgende Teil.

python


print(re.findall(r'''
                  ^                  #Der Anfang der Zeichenfolge(Das Ergebnis ändert sich auch dann nicht, wenn Sie es nicht haben, sondern es einfügen)
                  \[\[Category:      #Suchbegriff(\Ist Escape-Verarbeitung)
                  (                  #Starten Sie die zu erfassende Gruppierung
                  .*?                #Nicht gierige Übereinstimmung für eine Zeichenfolge 0 oder mehr
                  )                  #Ende der zu erfassenden Gruppierung
                  (?:                #Starten Sie die Gruppierung außerhalb der Erfassung
                  \|                 #Suchbegriff'|'
                  .*                 #Beliebige Zeichenfolge 0 Zeichen oder mehr
                  )?                 #Ende der Nichterfassungsgruppierung(0/Erscheinungsziel einmal)
                  \]\]               #Suchbegriff(\Ist Escape-Verarbeitung)
                  $                  #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))

[Nicht erfasst von ?: ...](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#%E3%82%AD%E3%83%A3%E3%83%97%E3%83 % 81% E3% 83% A3% E5% AF% BE% E8% B1% A1% E5% A4% 96)

Wenn Sie "(?: ...)" hinzufügen, wird es nicht in die Suchergebniszeichenfolge ** aufgenommen und nicht erfasst. Diesmal[[Category:Hilfe|Hiyo Hayami]]Formal|Vereinfachtes DiagrammIch möchte das Teil nicht erfassen, also nehme ich es nicht auf. Im folgenden Beispiel wird der Teil "4" als Muster für reguläre Ausdrücke verwendet, jedoch nicht im Ergebnis ausgegeben.

>>> re.findall(r'(.012)(?:4)', 'A0123 B0124 C0123')
['B012']

Gieriges / nicht gieriges Spiel

** Sie können die Länge der Zielzeichenfolge des Suchergebnisses steuern **. ** Die maximale Längenübereinstimmung ist eine gierige Übereinstimmung, und die minimale Längenübereinstimmung ist eine nicht gierige Übereinstimmung **. Die Standardeinstellung ist gierige Übereinstimmung. Diesmal[[Category:Hilfe|Hiyo Hayami]]Im Format|Hiyo HayamiTeil von 0/Da es einmal erscheint, wird es 0-mal sein, wenn Sie es nicht zu einem nicht gierigen Match machen|Hiyo Hayami]]Wird erworben.

#Gieriges Match
>>> print(re.findall(r'.0.*2',  'A0123 B0123'))
['A0123 B012']

#Nicht gieriges Match(*Nach dem?)
>>> print(re.findall(r'.0.*?2', 'A0123 B0123'))
['A012', 'B012']

Ausgabeergebnis (Ausführungsergebnis)

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

Ausgabeergebnis


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

Recommended Posts

100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens
Sprachverarbeitung 100 Knocks-21: Extrahieren Sie Zeilen mit Kategorienamen
Sprachverarbeitung 100 Knocks-46: Extraktion von Verbfall-Frame-Informationen
100 Sprachverarbeitungsklopfen 03 ~ 05
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 32
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
Sprachverarbeitung 100 Schläge-48: Extraktion des Weges von der Nase zur Wurzel
100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
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: 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: 12