Traitement du langage 100 coups 2015 ["Chapitre 3: Expressions régulières"](http: //www.cl.ecei.tohoku) Il s'agit d'un enregistrement de 26e "Suppression du balisage accentué" de .ac.jp / nlp100 / # ch3).
De cette heure au 28, nous supprimerons le balisage avec une expression régulière. Cette fois, nous allons apprendre la suppression (remplacement) ** en utilisant la fonction ** sub
.
Lien | Remarques |
---|---|
026.Suppression du balisage en surbrillance.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:26 | Copiez et collez la source de nombreuses pièces source |
Apprenez les bases et les astuces des expressions canoniques Python à partir de zéro | J'ai organisé ce que j'ai appris dans ce coup |
Expression régulière HOWTO | Expression régulière officielle Python Comment faire |
re ---Opération d'expression régulière | Description officielle du paquet Python re |
Help:Graphique simplifié | Wikipediaの代表的なマークアップのGraphique simplifié |
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
pandas | 0.25.3 |
En appliquant des expressions régulières à la description du balisage sur la page Wikipédia, diverses informations et connaissances peuvent être extraites.
Expressions régulières, JSON, Wikipedia, InfoBox, services web
Un fichier jawiki-country.json.gz qui exporte les articles Wikipédia au format suivant Il y a.
- Une information d'article par ligne est stockée au format JSON --Dans chaque ligne, le nom de l'article est stocké dans la clé "title" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "text", et cet objet est écrit au format JSON. --Le fichier est entièrement compressé
Créez un programme qui effectue le traitement suivant.
Lorsque vous traitez> 25, supprimez le balisage d'accentuation MediaWiki (tout accent faible, accentuation et accentuation forte) de la valeur du modèle et convertissez-le en texte (Référence: [Markup Quick Reference](http: // ja. wikipedia.org/wiki/Help:% E6% 97% A9% E8% A6% 8B% E8% A1% A8)).
Selon Aide: Référence rapide, le "balisage accentué" est le suivant: Il existe trois types.
type | Format | Exemple |
---|---|---|
Distinguer les autres (oblique) | Entourez de deux guillemets simples | ''Distinguer des autres'' |
Emphase (gras) | Entourez de 3 guillemets simples | '''Accentuation''' |
Oblique et souligné | Entourez de 5 guillemets simples | '''''Oblique et souligné''''' |
Extrayez la partie suivante du fichier avec une expression régulière. Il semble qu'il n'y ait que "l'accent (gras)" dans ce sujet.
Extrait de la partie "balisage accentué" du fichier
"|Forme établie 4=Nom du pays actuel "'''Royaume-Uni de Grande-Bretagne et d'Irlande du Nord'''"changer en\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('Angleterre')
basic = re.search(r'''
^\{\{Informations de base.*?\n #Terme de recherche(\Est un traitement d'échappement), Non capturé, non gourmand
(.*?) #Chaîne de caractères arbitraire
\}\} #Terme de recherche(\Est un traitement d'échappement)
$ #Fin de chaîne
''', wiki_body, re.MULTILINE+re.VERBOSE+re.DOTALL)
templates = OrderedDict(re.findall(r'''
^\| # \Est-ce un traitement d'échappement, non-capture
(.+?) #Cible de capture(key), Non gourmand
\s* #0 ou plusieurs caractères vides
= #Termes de recherche, non-capture
\s* #0 ou plusieurs caractères vides
(.+?) #Cible de capture(Value), Non gourmand
(?: #Démarrer un groupe qui n'est pas capturé
(?=\n\|) #nouvelle ligne(\n)+'|'Devant de(Une vision positive affirmative)
| (?=\n$) #Ou un saut de ligne(\n)+Avant la fin(Une vision positive affirmative)
) #Fin du groupe non ciblé pour la capture
''', basic.group(1), re.MULTILINE+re.VERBOSE+re.DOTALL))
#Suppression du balisage
def remove_markup(string):
#Suppression du balisage en surbrillance
replaced = re.sub(r'''
(\'{2,5}) #2-5'(Début du balisage)
(.*?) #Un ou plusieurs caractères (chaîne de caractères cible)
(\1) #Identique à la première capture (fin du balisage)
''', r'\2', string, flags=re.MULTILINE+re.VERBOSE)
return replaced
for i, (key, value) in enumerate(templates.items()):
replaced = remove_markup(value)
templates[key] = replaced
#Montrez des choses étranges
if value != replaced:
print(i, key)
print('Changer avant\t', value)
print('Après le changement\t', replaced)
print('----')
pprint(templates)
La partie principale de ce temps est la partie suivante. La fonction sub
est utilisée pour supprimer (remplacer) le" balisage accentué ". Puisqu'il y a un count
dans le quatrième argument, vous devez spécifier le nom lors du passage des flags
(indicateurs de compilation). Je passais désespérément l'indicateur de compilation sans remarquer le count
, et cela n'a pas fonctionné et j'ai perdu environ 30 minutes ...
python
replaced = re.sub(r'''
(\'{2,5}) #2-5'(Début du balisage)
(.*?) #Un ou plusieurs caractères (chaîne de caractères cible)
(\1) #Identique à la première capture (fin du balisage)
''', r'\2', string, flags=re.MULTILINE+re.VERBOSE)
La fonction sub
effectue une substitution de caractères. L'ordre des arguments est 1. modèle d'expression régulière, 2. chaîne de caractères de remplacement et 3. chaîne de caractères cible de remplacement.
>>> re.sub(r'Cible de remplacement', 'Remplacé', 'Cible de remplacement 対象外 Cible de remplacement')
'Remplacé Sans objet Remplacé'
Soit dit en passant, la valeur du «formulaire d'établissement 4» est la suivante avant et après le changement.
41 Forme établie 4
Avant de changer Nom du pays actuel "'''Royaume-Uni de Grande-Bretagne et d'Irlande du Nord'''"changer en
Après le changement, le nom actuel du pays devient "Grande-Bretagne et Royaume-Uni d'Irlande du Nord"
----
Lorsque le programme est exécuté, les résultats suivants sont affichés. Les majorations restantes seront supprimées aux 27e et 28e courses.
Résultat de sortie
OrderedDict([('Nom abrégé', 'Angleterre'),
('Nom du pays japonais', 'Royaume-Uni de Grande-Bretagne et d'Irlande du Nord'),
('Nom officiel du pays',
'{{lang|en|United Kingdom of Great Britain and Northern '
'Ireland}}<ref>Nom officiel du pays autre que l'anglais:<br/>\n'
'*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn '
'mu Thuath}}([[Gaélique écossais]])<br/>\n'
'*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd '
'Iwerddon}}([[Pays de Galles]])<br/>\n'
'*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart '
'na hÉireann}}([[irlandais]])<br/>\n'
'*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon '
'Glédh}}([[Cornouailles]])<br/>\n'
'*{{lang|sco|Unitit Kinrick o Great Breetain an Northren '
'Ireland}}([[Écossais]])<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 écossais)</ref>'),
('Image du drapeau', 'Flag of the United Kingdom.svg'),
('Image de l'emblème national',
'[[Fichier:Royal Coat of Arms of the United '
'Kingdom.svg|85px|Emblème national britannique]]'),
('Lien de l'emblème national', '([[Emblème national britannique|emblème national]])'),
('Slogan', '{{lang|fr|Dieu et mon droit}}<br/>([[français]]:Dieu et mes droits)'),
('Hymne national', '[[Sa Majesté la Reine|Protégez Sa Majesté la Reine, Dieu]]'),
('Image de position', 'Location_UK_EU_Europe_001.svg'),
('Terminologie officielle', '[[Anglais]](Enréalité)'),
('Capitale', '[[Londres]]'),
('Ville la plus grande', 'Londres'),
('Ancien titre de la tête', '[[Prince britannique|Reine]]'),
('Prénom', '[[Elizabeth II]]'),
('Titre de premier ministre', '[[Premier ministre britannique|premier ministre]]'),
('Nom du premier ministre', '[[David Cameron]]'),
('Classement de la zone', '76'),
('Taille de la zone', '1 E11'),
('Valeur de la zone', '244,820'),
('Rapport de surface d'eau', '1.3%'),
('Année de recensement', '2011'),
('Classement de la population', '22'),
('Taille de la population', '1 E7'),
('Valeur de la population',
'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>'),
('Valeur de densité de population', '246'),
('Statistiques du PIB année yuan', '2012'),
('Source de valeur du PIB',
'1,5478 billion<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>'),
('Statistiques du PIB Année MER', '2012'),
('Classement du PIB MER', '5'),
('Valeur du PIB RFG', '2433,7 milliards<ref name="imf-statistics-gdp" />'),
('Année statistique du PIB', '2012'),
('Classement du PIB', '6'),
('Valeur du PIB', '2316,2 milliards<ref name="imf-statistics-gdp" />'),
('GDP/Homme', '36,727<ref name="imf-statistics-gdp" />'),
('Forme fondatrice', 'Fondation du pays'),
('Forme établie 1',
'[[Royaume d'Angleterre]]/[[Royaume d'Ecosse]]<br />(Les deux pays[[Droit de l'Union'
'(1707)|1707連合法]]Jusqu'à ce que)'),
('Date de création 1', '[[927]]/[[843]]'),
('Forme établie 2', '[[Royaume de Grande-Bretagne]]Fondation du pays<br />([[Droit de l'Union(1707)|1707連合法]])'),
('Date d'établissement 2', '[[1707]]'),
('Forme établie 3',
'[[Royaume-Uni de Grande-Bretagne et d'Irlande]]Fondation du pays<br />([[Droit de l'Union(1800)|1800連合法]])'),
('Date d'établissement 3', '[[1801]]'),
('Forme établie 4', 'Changement du nom de pays actuel "Grande-Bretagne et Royaume-Uni d'Irlande du Nord"'),
('Date d'établissement 4', '[[1927]]'),
('devise', '[[Étang Sterling|Livre britannique]](£)'),
('Code de devise', 'GBP'),
('Fuseau horaire', '±0'),
('Heure d'été', '+1'),
('ISO 3166-1', 'GB / GBR'),
('ccTLD', '[[.uk]] / [[.gb]]<ref>L'utilisation est.Un nombre extrêmement faible par rapport au Royaume-Uni.</ref>'),
('Numéro de téléphone international', '44'),
('Remarque', '<references />')])
Recommended Posts