Traitement du langage 100 coups 2015 ["Chapitre 3: Expressions régulières"](http: //www.cl.ecei.tohoku) Il s'agit de l'enregistrement de 29e "Obtention de l'URL de l'image du drapeau" de .ac.jp / nlp100 / # ch3). Cette fois, nous extrairons la valeur d'un élément spécifique du dictionnaire créé à l'aide d'expressions régulières et le lancerons au service Web.
Lien | Remarques |
---|---|
029.Obtenez l'URL de l'image du drapeau.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:29 | 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. Je me demandais s'il fallait utiliser le package requests
, mais je ne l'ai pas utilisé car il était si simple que je n'avais pas besoin de l'utiliser. Si vous l'utilisez, le code devrait être un peu plus court.
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.
Utilisez le contenu du modèle pour obtenir l'URL de l'image du drapeau. (Indice: imageinfo dans API MediaWiki Appelez-le et convertissez la référence de fichier en URL)
J'ai fait référence aux deux liens suivants concernant l'API MediaWiki. API MediaWiki: page principale de l'API imageinfo: Explication des exemples et des paramètres
from collections import OrderedDict
import json
import re
from urllib import request, parse
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
#Cible de suppression:''Distinguer des autres''、'''Accentuation'''、'''''斜体とAccentuation'''''
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)
#Suppression des fichiers de liens internes
#Cible de suppression:[[Le titre de l'article]]、[[Le titre de l'article|Caractère d'affichage]]、[[Le titre de l'article#Nom de la section|Caractère d'affichage]]、[[Fichier:Wi.png|thumb|Texte explicatif]]
replaced = re.sub(r'''
\[\[ # '[['(Commencer le balisage)
(?: #Démarrer un groupe qui n'est pas capturé
[^|]*? # '|'Caractères autres que 0 caractère ou plus, non gourmands
\| # '|'
)*? #Fin du groupe, ce groupe apparaît 0 ou plus, non gourmand(Changements par rapport au n ° 27)
( #Début de groupe, cible de capture
(?!Category:) #Perspectives négatives(S'il est inclus, il est exclu.)
([^|]*?) # '|'Autre que 0 caractère, non gourmand(Chaîne de caractères à afficher)
)
\]\] # ']]'(Fin du balisage)
''', r'\1', replaced, flags=re.MULTILINE+re.VERBOSE)
# Template:Suppression de Lang
#Cible de suppression:{{lang|Balise de langue|Chaîne}}
replaced = re.sub(r'''
\{\{lang # '{{lang'(Commencer le balisage)
(?: #Démarrer un groupe qui n'est pas capturé
[^|]*? # '|'0 ou plus de caractères autres que, non gourmand
\| # '|'
)*? #Fin du groupe, ce groupe apparaît 0 ou plus, non gourmand
([^|]*?) #Capturer la cible,'|'Autre que 0 caractère, non gourmand(Chaîne de caractères à afficher)
\}\} # '}}'(Fin du balisage)
''', r'\1', replaced, flags=re.MULTILINE+re.VERBOSE)
#Suppression des liens externes
#Cible à supprimer[http(s)://xxxx] 、[http(s)://xxx xxx]
replaced = re.sub(r'''
\[https?:// # '[http://'(Commencer le balisage)
(?: #Démarrer un groupe qui n'est pas capturé
[^\s]*? #0 ou plusieurs caractères non vides, non gourmands
\s #Vide
)? #Fin du groupe, ce groupe apparaît 0 ou 1
([^]]*?) #Capturer la cible,']'Autre que 0 caractère, non gourmand (chaîne de caractères à afficher)
\] # ']'(Fin du balisage)
''', r'\1', replaced, flags=re.MULTILINE+re.VERBOSE)
#Suppression des balises HTML
#Cible à supprimer<xx> </xx> <xx/>
replaced = re.sub(r'''
< # '<'(Début du balisage)
.+? #1 caractère ou plus, non gourmand
> # '>'(Fin du balisage)
''', '', replaced, flags=re.MULTILINE+re.VERBOSE)
return replaced
for i, (key, value) in enumerate(templates.items()):
replaced = remove_markup(value)
templates[key] = replaced
#Demande de génération
url = 'https://www.mediawiki.org/w/api.php?' \
+ 'action=query' \
+ '&titles=File:' + parse.quote(templates['Image du drapeau']) \
+ '&format=json' \
+ '&prop=imageinfo' \
+ '&iiprop=url'
#Envoyez une demande au service MediaWiki
connection = request.urlopen(request.Request(url))
#Reçu en tant que json
response = json.loads(connection.read().decode())
print(response['query']['pages']['-1']['imageinfo'][0]['url'])
La partie principale de ce temps est la partie suivante. Pour le paramètre URL, la valeur de "flag image" est obtenue à partir du dictionnaire créé par l'expression régulière. Encodé à l'aide de https://docs.python.org/ja/3/library/urllib.parse.html#urllib.parse.quote). Il est facile de gagner sans certification.
python
#Demande de génération
url = 'https://www.mediawiki.org/w/api.php?' \
+ 'action=query' \
+ '&titles=File:' + parse.quote(templates['Image du drapeau']) \
+ '&format=json' \
+ '&prop=imageinfo' \
+ '&iiprop=url'
#Envoyez une demande au service MediaWiki
connection = request.urlopen(request.Request(url))
#Reçu en tant que json
response = json.loads(connection.read().decode())
print(response['query']['pages']['-1']['imageinfo'][0]['url'])
Lorsque le programme est exécuté, les résultats suivants sont affichés.
Résultat de sortie
https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg
Cette image.