[PYTHON] 100 Language Processing Knock-26: suppression du balisage accentué

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 de référence

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é

environnement

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

Chapitre 3: Expressions régulières

contenu de l'étude

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

Contenu frappé

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.

26. Suppression du balisage accentué

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)).

Supplément de problème (à propos du "balisage accentué")

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

Répondre

Programme de réponse 026. Suppression du markup.ipynb en surbrillance

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)

Répondre au commentaire

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"
----

Résultat de sortie (résultat de l'exécution)

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]](&pound;)'),
             ('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

100 Language Processing Knock-26: suppression du balisage accentué
100 Language Processing Knock-28: Suppression du balisage MediaWiki
100 traitement du langage knock-59: analyse de la formule S
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 traitement du langage knock-91: Préparation des données d'analogie
Traitement du langage 100 knocks-44: Visualisation des arbres dépendants
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 coups de traitement du langage avec Python 2015
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
100 coups de traitement du langage amateur: Résumé
100 traitements linguistiques knock-77 (en utilisant scicit-learn): mesure du taux de réponse
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 Language Processing Knock-55: extraction d'expressions uniques
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
Traitement du langage 100 knock-86: affichage vectoriel Word
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)