100 traitements du langage naturel frappent Chapitre 3 Expressions régulières (seconde moitié)

Un enregistrement de la résolution des problèmes dans la seconde moitié du chapitre 3.

</ i> 25. Extraction de modèles

Extraire les noms de champs et les valeurs du modèle "informations de base" inclus dans l'article et les stocker sous forme d'objet dictionnaire.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re
import json

def pass_string(string):
    return string

def fundamental_data(file, func):
    response = []
    data = {}
    start = re.compile(r"\{\{Informations de base")
    end = re.compile(r"\}\}")
    row = re.compile(r"^\s?\|?\s?(.+?)\s?=(.*)\|?")
    flag = False

    pre_key = None
    for line in file:
        if start.match(line):
            flag = True
            continue

        if end.match(line):
            flag = False

        if flag:
            l = row.match(line)

            if l:
                data[l.group(1).strip()] = func(l.group(2).strip())
                pre_key = l.group(1).strip()

            else:
                m = re.match(r"(.*)\}\}$", line)

                if m:
                    data[pre_key] += func(m.group(1).strip())
                    flag = False

                else:
                    data[pre_key] += func(line.strip())
        else:
            if len(data) > 0:
                response.append(data.copy())
                data.clear()

    return response

if __name__ == "__main__":
    inputfile = 'jawiki-england.txt'
    outputfile = 'jawiki-england_fundamental.json'
    f = open(inputfile)
    res = fundamental_data(f, pass_string)
    with open(outputfile, 'w') as g:
        json.dump(res, g, ensure_ascii=False)

#=> (Fichier jawiki-england_fundamental.Sortie vers json)

Les modèles pour les informations de base vont de {{informations de base '' à}} ''. </ i> Il y avait quelques exceptions, et il y avait des cas où }} n'était pas cassé et était à la fin de la ligne, donc la gestion des exceptions a été faite pour cette partie. Je la porte. (J'essaie de passer la fonction comme deuxième argument de la fonction fondamentale_data pour le problème qui suit)

</ i> 26. Suppression du balisage en surbrillance

Au moment du traitement> 25, supprimez le balisage d'accentuation MediaWiki (tous d'accentuation faible, d'accentuation et d'accentuation forte) de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re
import json
import problem25

def remove_emphasis(string):
    emphasis = re.compile(r"''('*)(.+)''\1")
    return emphasis.sub(r"\2", string)

if __name__ == "__main__":
    inputfile = 'jawiki-england.txt'
    outputfile = 'jawiki-england_fundamental-rmEmpha.json'
    f = open(inputfile)
    res = problem25.fundamental_data(f, remove_emphasis)
    with open(outputfile, 'w') as g:
        json.dump(res, g, ensure_ascii=False)

#=> (Fichier jawiki-england_fundamental-rmEmpha.Sortie vers json)

La fonction qui supprime le balisage en surbrillance est transmise à la fonction fondamentale_data créée dans le problème précédent. Le «\ number» dans l'expression régulière représente le «nombre» modèle, similaire à la méthode «group».

</ i> 27. Suppression des liens internes

En plus du traitement de> 26, supprimez le balisage du lien interne MediaWiki de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re
import json
import problem25
import problem26

def remove_internalLink(string):
    internallink = re.compile(r"\[\[((.+?)\|)?(.+?)\]\]")
    emphasis_removed = problem26.remove_emphasis(string)
    return internallink.sub(r"\3", emphasis_removed)

if __name__ == "__main__":
    inputfile = 'jawiki-england.txt'
    outputfile = 'jawiki-england_fundamental-rmEmpha-rmLink.json'
    f = open(inputfile)
    res = problem25.fundamental_data(f, remove_internalLink)
    with open(outputfile, 'w') as g:
        json.dump(res, g, ensure_ascii=False)

#=> (Fichier jawiki-england_fundamental-rmEmpha-rmLink.Sortie vers json)

En plus du traitement du problème précédent, ajouté le traitement pour supprimer le balisage de lien interne.

</ i> 28. Suppression du balisage MediaWiki

En plus du traitement de> 27, supprimez autant que possible le balisage MediaWiki de la valeur du modèle et formatez les informations de base du pays.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re
import json
import problem25
import problem26
import problem27

def remove_markup(string):
    markups = [
        re.compile(r"\[https?://[a-zA-Z0-9\./]+\s(.+)?\]"),
        re.compile(r"#REDIRECT\s?(.+)"),
        re.compile(r"<!--\s?(.+)\s?-->"),
        re.compile(r"\{\{.*[Ll]ang\|[a-zA-Z\-]+\|(.+)\}\}"),
        re.compile(r"(.*)<ref.+(</ref>)?>"),
        re.compile(r"(.*?)<br\s?/?>"),
        re.compile(r"<[a-z]+.*>(.*?)</[a-z]+>")
    ]
    removed_string = problem27.remove_internalLink(string)
    for m in markups:
        removed_string = m.sub(r"\1", removed_string)
    return removed_string

if __name__ == "__main__":
    inputfile = 'jawiki-england.txt'
    outputfile = 'jawiki-england_fundamental-rmMUs.json'
    f = open(inputfile)
    res = problem25.fundamental_data(f, remove_markup)
    with open(outputfile, 'w') as g:
        json.dump(res, g, ensure_ascii=False)

#=> (Fichier jawiki-england_fundamental-rmMUs.Sortie vers json)

Les balises trouvées étaient des liens externes, des redirections, des commentaires, des informations linguistiques et des instructions HTML, j'ai donc ajouté une fonctionnalité pour les supprimer.

</ i> 29. Obtenir l'URL de l'image du drapeau

Utilisez le contenu du modèle pour obtenir l'URL de l'image du drapeau. (Astuce: appelez imageinfo dans l'API MediaWiki pour convertir les références de fichiers en URL)

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import requests
import json

inputfile = 'jawiki-england_fundamental-rmMUs.json'
outputfile = 'jawiki-england_nationalflags.txt'

with open(inputfile, 'r') as f:
    template = json.load(f)

wikipedia_api = "http://ja.wikipedia.org/w/api.php?"
prop = {
    'action': "query",
    'prop': "imageinfo",
    'iiprop': "url",
    'format': "json",
    'formatversion': '2',
    'utf8': '',
    'continue': ''
}

g = open(outputfile, "w")

for country in template:
    if u'Image du drapeau' in country:
        countryname = country[u'Nom abrégé']
        filename = country[u'Image du drapeau']
        prop['titles'] = "Image:" + filename
        res = requests.get(url=wikipedia_api, params=prop)
        datum = json.loads(res.text)
        try:
            file_url = datum['query']['pages'][0]['imageinfo'][0]['url']
        except:
            print(datum)
            break
        print(filename, file_url)
        g.write(countryname.encode('utf8').replace('|', ''))
        g.write(", %s\n" % file_url)
g.close()

#=> (Fichier jawiki-england_nationalflags.Sortie vers txt)

Accédez à l'API à l'aide du module de requêtes.

Recommended Posts