Language processing 100 knock 2020 a été publié, je vais donc l'essayer immédiatement.
Dans le chapitre 3, nous extrairons et formaterons les informations nécessaires à l'aide d'expressions régulières d'articles de Wikipédia.
Pour obtenir des informations sur le balisage Wikipedia, voir Aide: Référence rapide - Wikipédia, API Des informations peuvent être trouvées dans API: Image Information-MediaWiki. Cependant, comme les informations de balisage sont incomplètes, vous pouvez voir les données ou la [page Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%AE%E3%83] Il est nécessaire d'identifier le modèle en regardant% AA% E3% 82% B9).
Il existe un fichier jawiki-country.json.gz qui exporte les articles Wikipédia au format suivant.
Lisez le fichier JSON de l'article Wikipedia et affichez le texte de l'article sur "UK". Dans les problèmes 21-29, exécutez sur le texte de l'article extrait ici.
code
import gzip
import json
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
print(eng[0]['text'])
Résultat de sortie (partie)
{{redirect|UK}}
{{redirect|Royaume-Uni|Pays honorables au printemps et à l'automne|Anglais(Printemps et automne)}}
{{Otheruses|pays européen|Cuisine locale des préfectures de Nagasaki et Kumamoto|Igirisu}}
{{Informations de base Pays
|Nom abrégé=Angleterre
︙
Notez que jawiki-country.json
est JSON Lines.
Extrayez la ligne qui déclare le nom de la catégorie dans l'article.
code
import gzip
import json
import regex as re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
texts = eng_data['text'].split('\n')
#Extraire des lignes contenant des catégories
cat_rows = list(filter(lambda e: re.search('\[\[Catégorie:|\[\[Category:', e), texts))
print('\n'.join(cat_rows))
Résultat de sortie
[[Category:Angleterre|*]]
[[Category:Pays membres du Royaume-Uni]]
[[Category:Royaume du Royaume-Uni|*]]
[[Category:Pays membres du G8]]
[[Category:Pays membres de l'Union européenne|Ancien]]
[[Category:Nation marine]]
[[Category:Pays souverain existant]]
[[Category:Pays insulaire]]
[[Category:Une nation / territoire créé en 1801]]
Help:Graphique simplifié- WikipediaAlors"[[Category:Aidez-moi|HiyoHayami]]Bienquecesoitenfait"[[Catégorie:Aidez-moi|HiyoHayami]]Ilyaaussiunmodèle(bienquecelaneseproduisepasdansunarticlebritannique).
Extrayez les noms des catégories d'articles (par nom et non par ligne).
code
import gzip
import json
import regex as re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
texts = eng_data['text'].split('\n')
#Extraire des lignes contenant des catégories
cat_rows = list(filter(lambda e: re.search('\[\[Catégorie:|\[\[Category:', e), texts))
#Extraire uniquement le nom de la catégorie de la ligne contenant la catégorie
cat_rows = list(map(lambda e: re.search('(?<=(\[\[Catégorie:|\[\[Category:)).+?(?=(\||\]))', e).group(), cat_rows))
print('\n'.join(cat_rows))
Résultat de sortie
Angleterre
Pays membres du Royaume-Uni
Royaume du Royaume-Uni
Pays membres du G8
Pays membres de l'Union européenne
Nation marine
Pays souverain existant
Pays insulaire
Une nation / territoire créé en 1801
Il existe une [re] standard (https://docs.python.org/ja/3/library/re.html) en tant que bibliothèque d'expressions régulières, mais j'obtiens une erreur «look-behind requiert un modèle de largeur fixe» dans le look-ahead. Utilisez regex pour cela.
Affichez le nom de la section et son niveau (par exemple, 1 si "== nom de la section ==") inclus dans l'article.
code
import json
import re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
texts = eng_data['text'].split('\n')
#Extraire des lignes contenant des sections
sec_rows = list(filter(lambda e: re.search('==.+==', e), texts))
# =Calculez le niveau à partir du nombre de
sec_rows_num = list(map(lambda e: e + ':' + str(int(e.count('=') / 2 - 1)), sec_rows))
# =Et supprimez les blancs
sections = list(map(lambda e: e.replace('=', '').replace(' ', ''), sec_rows_num))
print('\n'.join(sections))
Résultat de sortie (partie)
Nom du pays:1
histoire:1
La géographie:1
Grandes villes:2
climat:2
︙
Extrayez tous les fichiers multimédias référencés dans l'article.
code
import json
import regex as re
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
texts = eng_data['text'].split('\n')
#Extraire des lignes contenant des fichiers
file_rows = list(filter(lambda e: re.search('\[\[Fichier:|\[\[File:|\[\[file:', e), texts))
#Extraire uniquement le nom du fichier de la ligne contenant le fichier
file_rows = list(map(lambda e: re.search('(?<=(\[\[Fichier:|\[\[File:|\[\[file:)).+?(?=(\||\]))', e).group(), file_rows))
print('\n'.join(file_rows))
Résultat de sortie
Royal Coat of Arms of the United Kingdom.svg
United States Navy Band - God Save the Queen.ogg
Descriptio Prime Tabulae Europae.jpg
Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg
London.bankofengland.arp.jpg
Battle of Waterloo 1815.PNG
Uk topo en.jpg
BenNevis2005.jpg
Population density UK 2011 census.png
2019 Greenwich Peninsula & Canary Wharf.jpg
Leeds CBD at night.jpg
Palace of Westminster, London - Feb 2007.jpg
Scotland Parliament Holyrood.jpg
Donald Trump and Theresa May (33998675310) (cropped).jpg
Soldiers Trooping the Colour, 16th June 2007.jpg
City of London skyline from London City Hall - Oct 2008.jpg
Oil platform in the North SeaPros.jpg
Eurostar at St Pancras Jan 2008.jpg
Heathrow Terminal 5C Iwelumo-1.jpg
UKpop.svg
Anglospeak.svg
Royal Aberdeen Children's Hospital.jpg
CHANDOS3.jpg
The Fabs.JPG
Wembley Stadium, illuminated.jpg
Help:Graphique simplifié- WikipediaAlors "[[Fichier:Wikipedia-logo-v2-ja.png|thumb|Texte explicatif]]Bien que ce soit en fait "[[File:Wikipedia-logo-v2-ja.png|thumb|Texte explicatif]]」「[[file:Wikipedia-logo-v2-ja.png|thumb|Texte explicatif]]Il y a aussi un modèle.
Extrayez les noms de champs et les valeurs du modèle «informations de base» inclus dans l'article et stockez-les sous forme d'objet dictionnaire.
code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
text = eng_data['text']
#Extraire les informations de base
basic_text = re.search('{{Informations de base[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Répertorier par sauts de ligne et supprimer les parties inutiles
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Changer de type d'écriture
basic_dict = {}
for basic in basic_ary:
key, *values = basic.split('=')
key = key.replace(' ', '').replace('|', '')
basic_dict[key] = ''.join(values).strip()
pprint.pprint(basic_dict)
Résultat de sortie (partie)
{'GDP/Homme': '36,727<ref name"imf-statistics-gdp" />',
'Valeur du PIB': '2316,2 milliards<ref name"imf-statistics-gdp" />',
'Valeur du PIB RFG': '2433,7 milliards<ref name"imf-statistics-gdp" />',
︙
'Nom du premier ministre': '[[Boris Johnson]]',
'Titre de premier ministre': '[[Premier ministre britannique|premier ministre]]',
'Capitale': '[[Londres]](Enréalité)'}
Au moment du traitement 25, supprimez le balisage d'accentuation MediaWiki (accentuation faible, accentuation, accentuation forte) de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).
code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
text = eng_data['text']
#Extraire les informations de base
basic_text = re.search('{{Informations de base[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Répertorier par sauts de ligne et supprimer les parties inutiles
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Changer de type de dictionnaire
basic_dict = {}
for basic in basic_ary:
#Divisé en clés et valeurs
key, *values = basic.split('=')
#Façonner la clé
key = key.replace(' ', '').replace('|', '')
#Rejoignez parce que les valeurs sont répertoriées
value = ''.join(values).strip()
#Suppression du balisage en surbrillance
value = value.replace("'''''", '').replace("'''", '').replace("''", '')
basic_dict[key] = value
pprint.pprint(basic_dict)
Résultat de sortie (partie)
{'GDP/Homme': '36,727<ref name"imf-statistics-gdp" />',
'Valeur du PIB': '2316,2 milliards<ref name"imf-statistics-gdp" />',
'Valeur du PIB RFG': '2433,7 milliards<ref name"imf-statistics-gdp" />',
︙
'Forme établie 4': 'Changement du nom de pays actuel "Grande-Bretagne et Royaume-Uni d'Irlande du Nord"',
︙
'Nom du premier ministre': '[[Boris Johnson]]',
'Titre de premier ministre': '[[Premier ministre britannique|premier ministre]]',
'Capitale': '[[Londres]](Enréalité)'}
Aide: Référence rapide --Wikipedia "Différenciation des autres (oblique) ) »,« Emphase (gras) »et« Oblique et emphase »sont compris ici comme« balisage d'accentuation ».
En plus des 26 processus, 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).
code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
text = eng_data['text']
#Extraire les informations de base
basic_text = re.search('{{Informations de base[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Répertorier par sauts de ligne et supprimer les parties inutiles
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Changer de type d'écriture
basic_dict = {}
for basic in basic_ary:
#Divisé en clés et valeurs
key, *values = basic.split('=')
#Façonner la clé
key = key.replace(' ', '').replace('|', '')
#Rejoignez parce que les valeurs sont répertoriées
value = ''.join(values).strip()
#Suppression du balisage en surbrillance
value = value.replace("'''''", '').replace("'''", '').replace("'", '')
#Obtenir la chaîne de lien interne
targets = re.findall('((?<=({{)).+?(?=(}})))', value)
#Formatage de la chaîne de lien interne
if targets:
for target in targets:
value = re.sub('{{.+?}}', target[0].split('|')[-1], value, count=1)
#Obtenir la chaîne de lien interne
targets = re.findall('((?<=(\[\[)).+?(?=(\]\])))', value)
#Formatage de la chaîne de lien interne
if targets:
for target in targets:
value = re.sub('\[\[.+?\]\]', target[0].split('|')[-1], value, count=1)
basic_dict[key] = value
pprint.pprint(basic_dict)
Résultat de sortie (partie)
{'GDP/Homme': '36,727<ref name"imf-statistics-gdp" />',
'Valeur du PIB': '2316,2 milliards<ref name"imf-statistics-gdp" />',
'Valeur du PIB RFG': '2433,7 milliards<ref name"imf-statistics-gdp" />',
︙
'Forme établie 3': 'Création du Royaume-Uni de Grande-Bretagne et d'Irlande<br />(Loi commune 1800)',
︙
'Nom du premier ministre': 'Boris Johnson',
'Titre de premier ministre': 'premier ministre',
'Capitale': 'Londres (virtuellement)'}
Help:Graphique simplifié- WikipediaAlors "[[Le titre de l'article|Caractère d'affichage]]Il existe des modèles tels que ", mais en réalité,"{{Le titre de l'article|Caractère d'affichage}}Il semble y avoir un modèle de ".
En plus des 27 processus, supprimez autant que possible le balisage MediaWiki des valeurs de modèle et formatez les informations de base sur le pays.
code
import json
import regex as re
import pprint
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
text = eng_data['text']
#Extraire les informations de base
basic_text = re.search('{{Informations de base[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Répertorier par sauts de ligne et supprimer les parties inutiles
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Changer de type d'écriture
basic_dict = {}
for basic in basic_ary:
#Divisé en clés et valeurs
key, *values = basic.split('=')
#Façonner la clé
key = key.replace(' ', '').replace('|', '')
#Rejoignez parce que les valeurs sont répertoriées
value = ''.join(values).strip()
#Suppression du balisage en surbrillance
value = value.replace("'''''", '').replace("'''", '').replace("'", '')
#Obtenir la chaîne de lien interne
targets = re.findall('((?<=({{)).+?(?=(}})))', value)
#Formatage de la chaîne de lien interne
if targets:
for target in targets:
value = re.sub('{{.+?}}', target[0].split('|')[-1], value, count=1)
#Obtenir la chaîne de lien interne
targets = re.findall('((?<=(\[\[)).+?(?=(\]\])))', value)
#Formatage de la chaîne de lien interne
if targets:
for target in targets:
value = re.sub('\[\[.+?\]\]', target[0].split('|')[-1], value, count=1)
#Suppression de balises
value = value.replace('<br />', '')
value = re.sub('<ref.+?</ref>', '', value)
value = re.sub('<ref.+?/>', '', value)
basic_dict[key] = value
pprint.pprint(basic_dict)
Résultat de sortie (partie)
{'GDP/Homme': '36,727',
'Valeur du PIB': '2316,2 milliards',
'Valeur du PIB RFG': '2433,7 milliards',
︙
'Nom du premier ministre': 'Boris Johnson',
'Titre de premier ministre': 'premier ministre',
'Capitale': 'Londres (virtuellement)'}
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)
code
import json
import regex as re
import requests
eng_data = {}
with gzip.open('jawiki-country.json.gz', mode='rt') as f:
jsons = []
#Puisque les données d'origine sont JSON Lines ≠ JSON, lisez ligne par ligne
lines = f.readlines()
for line in lines:
jsons.append(json.loads(line))
#Extrait UK
eng = list(filter(lambda e: e['title'] == 'Angleterre', jsons))
eng_data = eng[0]
#Extraire le texte
text = eng_data['text']
#Extraire les informations de base
basic_text = re.search('{{Informations de base[\s\S]+?}}\n\n', text).group().replace('\n*', '*')
#Répertorier par sauts de ligne et supprimer les parties inutiles
basic_ary = basic_text.split('\n')
del basic_ary[0]
del basic_ary[-3:]
#Changer de type d'écriture
basic_dict = {}
for basic in basic_ary:
#Divisé en clés et valeurs
key, *values = basic.split('=')
#Façonner la clé
key = key.replace(' ', '').replace('|', '')
#Rejoignez parce que les valeurs sont répertoriées
value = ''.join(values).strip()
#Suppression du balisage en surbrillance
value = value.replace("'''''", '').replace("'''", '').replace("'", '')
#Obtenir la chaîne de lien interne
targets = re.findall('((?<=({{)).+?(?=(}})))', value)
#Formatage de la chaîne de lien interne
if targets:
for target in targets:
value = re.sub('{{.+?}}', target[0].split('|')[-1], value, count=1)
#Obtenir la chaîne de lien interne
targets = re.findall('((?<=(\[\[)).+?(?=(\]\])))', value)
#Formatage de la chaîne de lien interne
if targets:
for target in targets:
value = re.sub('\[\[.+?\]\]', target[0].split('|')[-1], value, count=1)
#Suppression de balises
value = value.replace('<br />', '')
value = re.sub('<ref.+?</ref>', '', value)
value = re.sub('<ref.+?/>', '', value)
basic_dict[key] = value
#Appel API
session = requests.Session()
params = {
'action': 'query',
'format': 'json',
'prop': 'imageinfo',
'titles': 'File:' + basic_dict['Image du drapeau'],
'iiprop': 'url'
}
result = session.get('https://ja.wikipedia.org/w/api.php', params=params)
res_json = result.json()
print(res_json['query']['pages']['-1']['imageinfo'][0]['url'])
Résultat de sortie
https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg
Ce que vous pouvez apprendre au chapitre 3
Recommended Posts