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.
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 |
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 |
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
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.
Extrahieren Sie die Namen der Artikelkategorien (nach Namen, nicht zeilenweise).
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]]'
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))
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))
?: ...
](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 Diagramm
Ich 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']
** 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 Hayami
Teil 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']
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