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.
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 |
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 Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.
[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
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)
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')
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))
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']
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]](£)'),
('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