[PYTHON] Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau

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

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é

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

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.

29. Obtenez l'URL de l'image du drapeau

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)

Supplément au problème (à propos de "l'API MediaWiki")

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

Répondre

Répondre au programme [029. Obtenir l'URL de l'indicateur image.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/03.%E6%AD%A3%E8%A6%8F%E8%A1 % A8% E7% 8F% BE / 029.% E5% 9B% BD% E6% 97% 97% E7% 94% BB% E5% 83% 8F% E3% 81% AEURL% E3% 82% 92% E5% 8F% 96% E5% BE% 97% E3% 81% 99% E3% 82% 8B.ipynb)

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

Répondre au commentaire

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

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


https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg

Cette image. alt

Recommended Posts

Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
100 traitement du langage knock-59: analyse de la formule S
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 Language Processing Knock-26: suppression du balisage accentué
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-93 (en utilisant des pandas): calcul du taux de précision de la tâche d'analogie
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement d'image? L'histoire du démarrage de Python pour
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
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 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
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 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
[Langage C] [Linux] Récupère la valeur de la variable d'environnement
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
Obtenez l'URL de la destination de la redirection HTTP en Python
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
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 traitements linguistiques knock-77 (en utilisant scicit-learn): mesure du taux de réponse
Obtenez le nombre de chiffres
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
La fonction d'affichage d'image d'iTerm est pratique lors du traitement d'images.
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")
100 coups de traitement du langage amateur: Résumé
Comprendre la fonction de convolution en utilisant le traitement d'image comme exemple
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
100 traitement de la langue knock-96 (en utilisant Gensim): Extraction du vecteur lié au nom du pays
Obtenir l'URL du ticket JIRA créé par la bibliothèque jira-python
[Word2vec] Visualisons le résultat du traitement en langage naturel des avis des entreprises
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
Obtenez le nombre de vues de Qiita
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage