[PYTHON] 100 traitement de langue knock-22: Extraction du nom de la catégorie

Traitement du langage 100 coups 2015 ["Chapitre 3: Expressions régulières"](http: //www.cl.ecei.tohoku) Il s'agit d'un enregistrement du 22e "Nom de la catégorie d'extrait" de .ac.jp / nlp100 / # ch3). Cette fois, nous utiliserons ** correspondance non capturée / non gourmande **. La bonne chose à propos de ces 100 coups est que vous pouvez apprendre le contenu petit à petit.

Lien de référence

Lien Remarques
022.Extraction du nom de la catégorie.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:22 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é "titre" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "texte", et cet objet est écrit au format JSON. --Le fichier est entièrement compressé

Créez un programme qui effectue le traitement suivant.

22. Extraction du nom de la catégorie

Extraire les noms des catégories d'articles (par nom, pas ligne par ligne).

Supplément de problème (à propos de "catégorie")

Selon Aide: Référence rapide, la «catégorie» est «[[Category : Aide | Hayami Hiyo]] format. Extrayez la partie " help` "dans ce format. Dans le fichier, la partie «catégorie» comprend les données suivantes.

Extrait de la partie "catégorie" du dossier


[[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 [022. Nom de la catégorie extraction.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/03.%E6%AD%A3%E8%A6%8F%E8%A1%A8% E7% 8F% BE / 022.% E3% 82% AB% E3% 83% 86% E3% 82% B4% E3% 83% AA% E5% 90% 8D% E3% 81% AE% E6% 8A% BD % E5% 87% BA.ipynb)

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
#Recherchez des chaînes courtes en en faisant une correspondance non gourmande
print(re.findall(r'''
                  ^                  #Le début de la chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
                  \[\[Category:      #Terme de recherche(\Est un traitement d'échappement)
                  (                  #Commencer le regroupement pour être capturé
                  .*?                #Correspondance non gourmande pour toute chaîne de 0 ou plus
                  )                  #Fin du regroupement à capturer
                  (?:                #Commencer à grouper hors de la capture
                  \|                 #Terme de recherche'|'
                  .*                 #Toute chaîne de caractères de 0 caractère ou plus
                  )?                 #Fin du regroupement sans capture(0/Cible d'apparence une fois)
                  \]\]               #Terme de recherche(\Est un traitement d'échappement)
                  $                  #Fin de chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
                  ''', wiki_body, re.MULTILINE+re.VERBOSE))

Répondre au commentaire

La partie principale de ce temps est la partie suivante.

python


print(re.findall(r'''
                  ^                  #Le début de la chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
                  \[\[Category:      #Terme de recherche(\Est un traitement d'échappement)
                  (                  #Commencer le regroupement pour être capturé
                  .*?                #Correspondance non gourmande pour toute chaîne de 0 ou plus
                  )                  #Fin du regroupement à capturer
                  (?:                #Commencer à grouper hors de la capture
                  \|                 #Terme de recherche'|'
                  .*                 #Toute chaîne de caractères de 0 caractère ou plus
                  )?                 #Fin du regroupement sans capture(0/Cible d'apparence une fois)
                  \]\]               #Terme de recherche(\Est un traitement d'échappement)
                  $                  #Fin de chaîne(Même si vous ne l'avez pas, le résultat ne changera pas, mais je le mettrai en)
                  ''', wiki_body, re.MULTILINE+re.VERBOSE))

[Non capturé par ?: ...](https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7#%E3%82%AD%E3%83%A3%E3%83%97%E3%83 % 81% E3% 83% A3% E5% AF% BE% E8% B1% A1% E5% A4% 96)

Si vous ajoutez (?: ...), il ne sera pas inclus dans la chaîne de résultat de la recherche ** et ne sera pas capturé. Cette fois[[Category:Aidez-moi|Hiyo Hayami]]Formel|Graphique simplifiéJe ne veux pas capturer la pièce, donc je ne la capture pas. Dans l'exemple ci-dessous, la partie «4» est utilisée comme modèle d'expression régulière, mais elle n'est pas sortie dans le résultat.

>>> re.findall(r'(.012)(?:4)', 'A0123 B0124 C0123')
['B012']

Match gourmand / non gourmand

** Vous pouvez contrôler la longueur de la chaîne de caractères cible du résultat de la recherche **. ** La correspondance de longueur maximale est une correspondance gourmande, et la correspondance de longueur minimale est une correspondance non gourmande **. La valeur par défaut est une correspondance gourmande. Cette fois[[Category:Aidez-moi|Hiyo Hayami]]Au format|Hiyo HayamiPartie de 0/Puisqu'il apparaît une fois, si vous n'en faites pas une correspondance non gourmande, ce sera 0 fois|Hiyo Hayami]]Sera acquis.

#Match gourmand
>>> print(re.findall(r'.0.*2',  'A0123 B0123'))
['A0123 B012']

#Match non gourmand(*Après le?)
>>> print(re.findall(r'.0.*?2', 'A0123 B0123'))
['A012', 'B012']

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


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

Recommended Posts

100 traitement de langue knock-22: Extraction du nom de la catégorie
Traitement du langage 100 knocks-21: Extraire les lignes contenant les noms de catégories
Traitement du langage 100 knocks-46: Extraction des informations de trame de cas de verbe
100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 40
100 coups de traitement linguistique (2020): 32
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
Traitement du langage 100 knocks-48: Extraction du chemin du nez à la racine
100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
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: 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 traitement du langage amateur: 12