[PYTHON] 100 Sprachverarbeitung Knock-25: Vorlagenextraktion

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 3: Reguläre Ausdrücke"](http: //www.cl.ecei.tohoku) Es ist eine Aufzeichnung von 25. "Vorlage extrahieren" von .ac.jp / nlp100 / # ch3). Dieses Mal werden wir uns mit dem etwas verwirrenden Inhalt von ** bejahendem Ausblick ** befassen. Es ist nichts, wenn Sie es verstehen, aber ist es schwierig, die Wörter zu verstehen? Sie lernen auch ** DOTALL und bestellte Wörterbücher **. Dieser Inhalt ist wichtig, da er nach Kapitel 3 zu Stößen führt.

Referenzlink

Verknüpfung Bemerkungen
025.Extraktion der Vorlage.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:25 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
Template:Grundlegende Informationen Land Wikipedia-Ländervorlage

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

Inhalt anklopfen

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.

25. Extraktion der Vorlage

Extrahieren Sie die Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.

Problemergänzung (über "Basisinformationen")

[Vorlage: Land mit Basisinformationen](https://ja.wikipedia.org/wiki/Template:%E5%9F%BA%E7%A4%8E%E6%83%85%E5%A0%B1_%E5%9B In% BD) gibt es eine Vorlage für "Basisinformationen", auf die ich Bezug genommen habe. Die Feldnamen und Werte in diesen Basisinformationen werden mit regulären Ausdrücken extrahiert.

Auszug aus dem Teil "Basisinformationen" in der Datei


{{Grundlegende Informationen Land\n
|Kurzbezeichnung=England\n
|Japanischer Ländername=Vereinigtes Königreich Großbritannien und Nordirland\n

Unterlassung

|Internationale Telefonnummer= 44\n
|Hinweis= <references />\n
}}\n

Antworten

Antwortprogramm [025. Template-Extraktion.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/03.%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7 % 8F% BE / 025.% E3% 83% 86% E3% 83% B3% E3% 83% 97% E3% 83% AC% E3% 83% BC% E3% 83% 88% E3% 81% AE% E6% 8A% BD% E5% 87% BA.ipynb)

from collections import OrderedDict
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')

basic = re.search(r'''
                    ^\{\{Grundinformation.*?\n  #Suchbegriff(\Ist Escape-Verarbeitung), Nicht gefangen genommen, nicht gierig
                    (.*?)              #Beliebige Zeichenfolge
                    \}\}               #Suchbegriff(\Ist Escape-Verarbeitung)
                    $                  #Ende der Zeichenfolge
                    ''', wiki_body, re.MULTILINE+re.VERBOSE+re.DOTALL)
pprint(basic.group(1))

#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
templates = OrderedDict(re.findall(r'''
                          ^\|         # \Ist Escape-Verarbeitung, nicht erfasst
                          (.+?)       #Ziel erfassen(key), Nicht geizig
                          \s*         #0 oder mehr Leerzeichen
                          =           #Suchbegriffe, nicht erfasst
                          \s*         #0 oder mehr Leerzeichen
                          (.+?)       #Ziel erfassen(Value), Nicht geizig
                          (?:         #Starten Sie eine Gruppe, die nicht erfasst wird
                            (?=\n\|)  #Neue Zeile(\n)+'|'Vor dem(Bejahender Ausblick)
                          | (?=\n$)   #Oder ein Zeilenumbruch(\n)+Vor dem Ende(Bejahender Ausblick)
                          )           #Ende der Gruppe, die nicht erfasst werden soll
                         ''', basic[0], re.MULTILINE+re.VERBOSE+re.DOTALL))
pprint(templates)

Kommentar beantworten

Extraktion von "Basisinformationen"

Erstens ist der Extraktionsteil "Basisinformationen". Ich konnte es nicht mit einem regulären Ausdruck in den Wörterbuchtyp bringen, also habe ich es in zwei Schritten gemacht. ^ \ {\ {Basisinformationen beginnt bei" {{Basisinformationen "am Zeilenanfang und endet mit einem Zeilenumbruch. Holen Sie sich die Zeichenfolge nach dem Zeilenumbruch auf }}. Ich verwende re.DOTALL, um Zeilenumbrüche in den Platzhalter . aufzunehmen. Bisher verwendeten reguläre Ausdrücke die Funktion findall, aber da nur ein Ort erforderlich ist, die Funktion 'search' //qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#match%E3%81%A8search) wird verwendet.

python


basic = re.search(r'''
                    ^\{\{Grundinformation.*?\n  #Suchbegriff(\Ist Escape-Verarbeitung), Nicht gefangen genommen, nicht gierig
                    (.*?)              #Beliebige Zeichenfolge
                    \}\}               #Suchbegriff(\Ist Escape-Verarbeitung)
                    $                  #Ende der Zeichenfolge
                    ''', wiki_body, re.MULTILINE+re.VERBOSE+re.DOTALL)
pprint(basic.group(1))

Der Teil "Basisinformationen" wird in der folgenden Form extrahiert.

Extraktionsergebnis "Basisinformationen"


('|Kurzbezeichnung=England\n'
 '|Japanischer Ländername=Vereinigtes Königreich Großbritannien und Nordirland\n'
 '|Offizieller Ländername= {{lang|en|United Kingdom of Great Britain and Northern '
 'Ireland}}<ref>Offizieller Ländername außer Englisch:<br/>\n'

Unterlassung

 '|ccTLD = [[.uk]] / [[.gb]]<ref>Verwendung ist.Überwiegend kleine Zahl im Vergleich zu Großbritannien.</ref>\n'
 '|Internationale Telefonnummer= 44\n'
 '|Hinweis= <references />\n')

Feldname und Wertextraktion

Hier werden die Feldnamen und Werte extrahiert. Die Ergebnisse werden mit collection.OrderDIct in einen geordneten Wörterbuchtyp umgewandelt (da es bei der Ausgabe ohne Reihenfolge schwierig ist, sie zu lesen).

python


templates = OrderedDict(re.findall(r'''
                          ^\|         # \Ist Escape-Verarbeitung, nicht erfasst
                          (.+?)       #Ziel erfassen(key), Nicht geizig
                          \s*         #0 oder mehr Leerzeichen
                          =           #Suchbegriffe, nicht erfasst
                          \s*         #0 oder mehr Leerzeichen
                          (.+?)       #Ziel erfassen(Value), Nicht geizig
                          (?:         #Starten Sie eine Gruppe, die nicht erfasst wird
                            (?=\n\|)  #Neue Zeile(\n)+'|'Vor dem(Bejahender Ausblick)
                          | (?=\n$)   #Oder ein Zeilenumbruch(\n)+Vor dem Ende(Bejahender Ausblick)
                          )           #Ende der Gruppe, die nicht erfasst werden soll
                         ''', basic.group(1), re.MULTILINE+re.VERBOSE+re.DOTALL))

[FukuharaYohei / items / 459f27f0d7bbba551af7 #% E5% 85% 88% E8% AA% AD% E3% 81% BF% E5% BE% 8C% E8% AA% AD % E3% 81% BF% E3% 82% A2% E3% 82% B5% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3)

Affirmative Look-Ahead ist eine Technik, bei der, wenn die nachfolgende Zeichenfolge zuerst gelesen und die Bedingung erfüllt wird, auch dieser Teil übereinstimmt. Ich weiß, dass es schwer zu verstehen ist, weil ich es schreibe. Erstens hat diese Serie die folgenden vier.

Die folgende Form wird als Matrix verwendet.

positiv Verweigerung
Schau voraus (?=...)
...Übereinstimmung, wenn der Teil als nächstes fortgesetzt wird
(?!...)
...Übereinstimmung, wenn das Teil nicht folgt
Schau voraus (?<=...)
...Übereinstimmung, wenn sich das Teil vor der aktuellen Position befindet und eine Übereinstimmung vorliegt
(?<!...)
...Übereinstimmung, wenn sich das Teil vor der aktuellen Position befindet und keine Übereinstimmung vorliegt

Ein konkretes Beispiel ist leichter zu verstehen als eine ausführliche Erklärung.

>>> string = 'A01234 B91235 C01234'

#Bejahende Vorausschau(Positive Lookahead Assertions)
# '123'Neben an'5'Zeichenkette gefolgt von('(?=5)'Teil ist der folgende'.'Nicht ohne kommen)
>>> print(re.findall(r'..123(?=5).', string))
['B91235']

#Negative Vorausschau-Behauptung(Negative Lookahead Assertions)
# '123'Neben an'5'Zeichenfolge, die nicht folgt('(?!5)'Teil ist der folgende'.'Nicht ohne kommen)
>>> print(re.findall(r'..123(?!5).', string))
['A01234', 'C01234']

#Bejahende Vorausschau(Positive Lookbehind Assertions)
# '0'Aber'123'Passende Zeichenfolge vor('(?<=0)'Der Teil von ist der Anfang'.'Aberなければ取得しない)
>>> print(re.findall(r'..(?<=0)123', string))
['A0123', 'C0123']

#Negative Vorausschau(Negative Lookbehind Assertions)
# '0'Aber'123'Nicht übereinstimmender String zuvor('(?<!0)'Der Teil von ist der Anfang'.'Aberなければ取得しない)
>>> print(re.findall(r'..(?<!0)123', string))
['B9123']

Ausgabeergebnis (Ausführungsergebnis)

Wenn das Programm ausgeführt wird, wird am Ende das folgende Ergebnis ausgegeben.

Ausgabeergebnis


OrderedDict([('Kurzbezeichnung', 'England'),
             ('Japanischer Ländername', 'Vereinigtes Königreich Großbritannien und Nordirland'),
             ('Offizieller Ländername',
              '{{lang|en|United Kingdom of Great Britain and Northern '
              'Ireland}}<ref>Offizieller Ländername außer Englisch:<br/>\n'
              '*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn '
              'mu Thuath}}([[schottisch Gälisch]])<br/>\n'
              '*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd '
              'Iwerddon}}([[Wales]])<br/>\n'
              '*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart '
              'na hÉireann}}([[irisch]])<br/>\n'
              '*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon '
              'Glédh}}([[Cornwall]])<br/>\n'
              '*{{lang|sco|Unitit Kinrick o Great Breetain an Northren '
              'Ireland}}([[schottisch]])<br/>\n'
              '**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin '
              'Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin '
              'Airlann}}(Ulster Scottish)</ref>'),
             ('Flaggenbild', 'Flag of the United Kingdom.svg'),
             ('Nationales Emblembild',
              '[[Datei:Royal Coat of Arms of the United '
              'Kingdom.svg|85px|Britisches nationales Emblem]]'),
             ('Nationaler Emblem-Link', '([[Britisches nationales Emblem|Staatswappen]])'),
             ('Slogan', '{{lang|fr|Dieu et mon droit}}<br/>([[Französisch]]:Gott und meine Rechte)'),
             ('Nationalhymne', '[[Ihre Majestät die Königin|Beschütze deine Majestät die Königin, Gott]]'),
             ('Positionieren Sie das Bild', 'Location_UK_EU_Europe_001.svg'),
             ('Offizielle Terminologie', '[[Englisch]](eigentlich)'),
             ('Hauptstadt', '[[London]]'),
             ('Größte Stadt', 'London'),
             ('Ehemaliger Haupttitel', '[[Britischer Prinz|Königin]]'),
             ('Vorname', '[[Elizabeth II]]'),
             ('Titel des Premierministers', '[[britischer Premierminister|Premierminister]]'),
             ('Name des Premierministers', '[[David Cameron]]'),
             ('Gebietsrangliste', '76'),
             ('Flächengröße', '1 E11'),
             ('Flächenwert', '244,820'),
             ('Wasserflächenverhältnis', '1.3%'),
             ('Jahr der Volkszählung', '2011'),
             ('Bevölkerungsranking', '22'),
             ('Einwohnerzahl', '1 E7'),
             ('Bevölkerungswert',
              '63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm '
              'United Nations Department of Economic and Social '
              'Affairs>Population Division>Data>Population>Total '
              'Population]</ref>'),
             ('Bevölkerungsdichtewert', '246'),
             ('BIP-Statistik Jahr Yuan', '2012'),
             ('BIP-Wertquelle',
              '1,5478 Billionen<ref '
              'name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= '
              'IMF>Data and Statistics>World Economic Outlook Databases>By '
              'Countrise>United Kingdom]</ref>'),
             ('BIP-Statistik Jahr MER', '2012'),
             ('BIP-Ranking MER', '5'),
             ('BIP-Wert MER', '2.433,7 Milliarden<ref name="imf-statistics-gdp" />'),
             ('Statistisches BIP-Jahr', '2012'),
             ('BIP-Ranking', '6'),
             ('BIP-Wert', '2.316,2 Milliarden<ref name="imf-statistics-gdp" />'),
             ('GDP/Mann', '36,727<ref name="imf-statistics-gdp" />'),
             ('Gründungsform', 'Gründung des Landes'),
             ('Etablierte Form 1',
              '[[Königreich England]]/[[Königreich Schottland]]<br />(Beide Länder[[Unionsrecht'
              '(1707)|1707連合法]]Bis)'),
             ('Gründungsdatum 1', '[[927]]/[[843]]'),
             ('Etablierte Form 2', '[[Großbritannien Königreich]]Gründung des Landes<br />([[Unionsrecht(1707)|1707連合法]])'),
             ('Gründungsdatum 2', '[[1707]]'),
             ('Etablierte Form 3',
              '[[Vereinigtes Königreich Großbritannien und Irland]]Gründung des Landes<br />([[Unionsrecht(1800)|1800連合法]])'),
             ('Gründungsdatum 3', '[[1801]]'),
             ('Etablierte Form 4', "Aktueller Ländername "'''Vereinigtes Königreich Großbritannien und Nordirland'''"ändern"),
             ('Gründungsdatum 4', '[[1927]]'),
             ('Währung', '[[Sterling Teich|UK Pfund]](&pound;)'),
             ('Währungscode', 'GBP'),
             ('Zeitzone', '±0'),
             ('Sommerzeit', '+1'),
             ('ISO 3166-1', 'GB / GBR'),
             ('ccTLD', '[[.uk]] / [[.gb]]<ref>Verwendung ist.Überwiegend kleine Zahl im Vergleich zu Großbritannien.</ref>'),
             ('Internationale Telefonnummer', '44'),
             ('Hinweis', '<references />')])

Recommended Posts

100 Sprachverarbeitung Knock-25: Vorlagenextraktion
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
Sprachverarbeitung 100 knock-86: Wortvektoranzeige
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-28: Entfernen des MediaWiki-Markups
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung klopfen 2020 "für Google Colaboratory"
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100-Sprachverarbeitung knock-24: Dateireferenz extrahieren
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2