[PYTHON] Traitement du langage 100 knocks-21: Extraire les lignes contenant les noms de catégories

Traitement du langage 100 coups 2015 ["Chapitre 3: Expressions régulières"](http: //www.cl.ecei.tohoku) .ac.jp / nlp100 / # ch3) 21e "Ligne d'extraction contenant le nom de la catégorie" enregistrement. La dernière fois était une préparation, et cette fois, c'est la pratique des expressions régulières. Jusqu'à présent, Gugu utilise beaucoup de contenu de base dont je me souviens. Plus précisément, il regorge de bases telles que ** chaîne de caractères brute, re.VERBOSE, re.MULTILINE, guillemet triple **.

Lien de référence

Lien Remarques
021.Extraire des lignes contenant des noms de catégories.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:21 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.

21. Extraire les lignes contenant le nom de la catégorie

Extrayez la ligne qui déclare le nom de la catégorie dans l'article.

Supplément au problème (à propos du "nom de la catégorie")

Selon Aide: Référence rapide, le "nom de la catégorie" est «[[[ Catégorie: Aide | Hayami Hiyo]] `format. Extrayez la partie suivante du fichier avec une expression régulière.

Extrait de la partie "nom de la catégorie" du fichier


[[Category:Angleterre|*]]\n'
[[Category:Royaume du Royaume-Uni|*]]\n'
[[Category:Pays membres du G8]]\n'
[[Category:Pays membres de l'Union européenne]]\n'
[[Category:Nation marine]]\n'
[[Category:Pays souverain]]\n'
[[Category:Pays insulaire|Kureito Furiten]]\n'
[[Category:État / région créé en 1801]]'

Répondre

Programme de réponse [021. Extraire les lignes contenant nom de catégorie.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/03.%E6%AD%A3%E8%A6%8F%E8%A1 % A8% E7% 8F% BE / 021.% E3% 82% AB% E3% 83% 86% E3% 82% B4% E3% 83% AA% E5% 90% 8D% E3% 82% 92% E5% 90% AB% E3% 82% 80% E8% A1% 8C% E3% 82% 92% E6% 8A% BD% E5% 87% BA.ipynb)

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

#Ignorer la séquence d'échappement dans la chaîne brute lorsque r est au début
#Ignorer les pauses au milieu avec des guillemets triples
# re.Ignorer les espaces et les commentaires à l'aide de l'option VERBOSE
# re.Rechercher plusieurs lignes avec MULTILINE
pprint(re.findall(r'''
                     ^                  #Le début de la chaîne(Le résultat ne change pas même s'il n'est pas inclus)
                     (                  #Commencer à grouper
                     .*                 #Toute chaîne de caractères de 0 caractère ou plus
                     \[\[Category:      #Terme de recherche(\Est un traitement d'échappement)
                     .*                 #Toute chaîne de caractères de 0 caractère ou plus
                     \]\]               #Terme de recherche(\Est un traitement d'échappement)
                     .*                 #Toute chaîne de caractères de 0 caractère ou plus
                     )                  #Fin du regroupement
                     $                  #Fin de chaîne(Le résultat ne change pas même s'il n'est pas inclus)
                     ''', wiki_body, re.MULTILINE+re.VERBOSE))

Répondre au commentaire

Le sujet principal de ce coup est le suivant.

pprint(re.findall(r'''
                     ^                  #Le début de la chaîne(Le résultat ne change pas même s'il n'est pas inclus)
                     (                  #Commencer à grouper
                     .*                 #Toute chaîne de caractères de 0 caractère ou plus
                     \[\[Category:      #Terme de recherche(\Est un traitement d'échappement)
                     .*                 #Toute chaîne de caractères de 0 caractère ou plus
                     \]\]               #Terme de recherche(\Est un traitement d'échappement)
                     .*                 #Toute chaîne de caractères de 0 caractère ou plus
                     )                  #Fin du regroupement
                     $                  #Fin de chaîne(Le résultat ne change pas même s'il n'est pas inclus)
                     ''', wiki_body, re.MULTILINE+re.VERBOSE))

Obtenez tous les résultats de la recherche avec la fonction findall

La fonction findall ** renvoie toutes les chaînes qui correspondent au modèle au format liste **. L'exemple suivant extrait tous les mots complémentaires qui se terminent par ly ( \ w est "caractères alphabétiques et soulignés" #% E7% 89% B9% E6% AE% 8A% E6% 96% 87% E5% AD% 97)).

findall exemple


>>> text = "He was carefully disguised but captured quickly by police."
>>> re.findall(r"\w+ly", text)
['carefully', 'quickly']

[chaîne brute](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#raw%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7% E3% 82% A8% E3% 82% B9% E3% 82% B1% E3% 83% BC% E3% 83% 97% E3% 82% B7% E3% 83% BC% E3% 82% B1% E3% Séquence d'échappement désactivée à 83% B3% E3% 82% B9% E7% 84% A1% E5% 8A% B9)

Faites précéder le guillemet de r pour en faire une chaîne brute. Vous pouvez désactiver la séquence d'échappement à l'aide d'une chaîne brute. ** Si le modèle d'expression régulière a une séquence d'échappement, il est difficile à lire, alors faites-en une chaîne brute et invalidez-la **.

Exemple de sortie d'impression de chaîne brute


>>> print('a\tb\nA\tB')
a   b
A   B

>>> print(r'a\tb\nA\tB')
a\tb\nA\tB

[Citations triples](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% Réverbose A8% 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)

Vous pouvez utiliser des sauts de ligne dans le modèle d'expression régulière en les mettant entre guillemets triples `` '' (également possible avec" "" `). ** Régulier par sauts de ligne Rend le modèle d'expression plus facile à lire **

Exemple d'utilisation de triple devis


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)

En passant re.VERBOSE au paramètre flags, vous pouvez utiliser des commentaires et des blancs dans le modèle d'expression régulière (peu importe si vous ne l'utilisez pas). ** Facilitez la lecture du modèle d'expression régulière en insérant un commentaire et un espace **. Il s'agit d'une méthode d'amélioration de la lisibilité utilisée en combinaison avec des guillemets triples.

Exemple d'utilisation de triple devis


a = re.compile(r'''\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits''', re.VERBOSE)

Rechercher plusieurs lignes avec re.MULTILINE

Utilisez cette option lorsque vous souhaitez rechercher plusieurs lignes.

re.Exemple d'utilisation MULTILINE


string = r'''\
1ère ligne
2e ligne au début de la ligne'''

#Rechercher la cible pour plusieurs lignes
print(re.findall(r'^Début de ligne.*', string, re.MULTILINE))
# ['1ère ligne', '2e ligne au début de la ligne']

#Seule la première ligne est recherchée
print(re.findall(r'^Début de ligne.*', string))
# ['1ère ligne']

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

Lorsque le programme est exécuté, les résultats suivants sont affichés.

Résultat de sortie


['[[Category:Angleterre|*]]',
 '[[Category:Royaume du Royaume-Uni|*]]',
 '[[Category:Pays membres du G8]]',
 '[[Category:Pays membres de l'Union européenne]]',
 '[[Category:Nation marine]]',
 '[[Category:Pays souverain]]',
 '[[Category:Pays insulaire|Kureito Furiten]]',
 '[[Category:État / région créé en 1801]]']

Recommended Posts

Traitement du langage 100 knocks-21: Extraire les lignes contenant les noms de catégories
100 traitement de langue knock-22: Extraction du nom de la catégorie
100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 40
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
100 coups de traitement linguistique (2020): 10-19
100 coups de traitement linguistique (2020): 30
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
100 coups de traitement linguistique (2020): 46
100 coups de traitement linguistique (2020): 21
100 coups de traitement linguistique (2020): 36
100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 30
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 84
100 coups de traitement du langage amateur: 81
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 40
100 coups de traitement du langage amateur: 45
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 22
100 coups de traitement du langage amateur: 61
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de langue amateur: 08