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 **.
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 |
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 Zeile, in der der Kategoriename im Artikel angegeben ist.
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]]'
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))
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))
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']
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
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)
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']
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