[PYTHON] Extraire une langue spécifique du Wiktionnaire

L'ensemble des données du Wiktionnaire est trop volumineux pour étudier une langue particulière, j'ai donc créé un script pour spécifier et extraire la langue en tant que pré-processus.

Ceci est une série d'articles.

  1. Explorer des méthodes de traitement efficaces pour Wiktionary
  2. Comparez la vitesse de traitement de Wiktionnaire entre F # et Python
  3. Obtenir le code de langue du Wiktionnaire
  4. Extrayez une langue spécifique du Wiktionnaire ← Cet article
  5. Enquête sur les verbes irréguliers en anglais avec Wiktionary

Le script de cet article est publié dans le référentiel suivant.

Aperçu

Il est inutile de traiter le texte intégral pour étudier une langue particulière. Extraire en spécifiant la langue comme prétraitement.

Le fichier texte est dimensionné pour être ouvert par un éditeur, ce qui facilite sa manipulation. Les informations peuvent être extraites par un traitement de texte ordinaire sans concevoir de méthode spéciale pour accélérer comme auparavant.

Préparation

Wiktionary Utilisez la version anglaise du fichier de vidage.

Les données de vidage sont fournies compressées avec bzip2. Nous utiliserons la version du 1er mai 2020, disponible au moment de la rédaction de l'article, dans un état compressé sans décompression. (Ce sera environ 6 Go une fois étendu)

Le fichier xml.bz2 téléchargé doit être conservé quelque part. Cela peut être n'importe où, mais cette fois je vais créer un dossier dédié dans mon répertoire personnel.

Examinez la longueur du flux lorsque vous développez les données. Vérifiez les informations de page (équivalentes à l'index) et les en-têtes de langue en parallèle à partir des données développées.

Résultat d'exécution


$ python db-make.py ~/share/wiktionary/enwiktionary-20200501-pages-articles-multistream.xml.bz2
934,033,103 / 934,033,103 | 68,608
checking redirects...
reading language codes...
checking language names...
writing DB files...

Huit fichiers seront générés.

Nom du fichier Contenu
db-settings.tsv Informations de configuration (nom de fichier)
db-streams.tsv Informations sur le flux (ID, décalage, longueur)
db-namespaces.tsv Espaces de noms (balise ns)
db-pages.tsv Informations sur la page (ID, flux, espace de noms, titre, transfert, espace de noms)
db-idlang.tsv Langue (ID) incluse dans la page (ID)
db-langname.tsv Table de correspondance de l'ID de langue et du nom de la langue (y compris l'alias)
db-langcode.tsv Table de correspondance entre le code de la langue et le nom de la langue
db-templates.tsv Modèles intégrés

Utilisez le SQL préparé pour remplir SQLite. C'est un SQL simple, donc je pense que c'est un moyen rapide de lire ceci pour voir la structure de la table.

$ sqlite3 enwiktionary.db ".read db.sql"
importing 'db-settings.tsv'...
importing 'db-streams.tsv'...
importing 'db-namespaces.tsv'...
importing 'db-pages.tsv'...
importing 'db-idlang.tsv'...
importing 'db-langname.tsv'...
Importing 'db-langcode.tsv'...
Importing 'db-templates.tsv'...

La préparation est terminée.

Une fois que vous avez rempli les données, vous n'avez pas besoin du db- *. Tsv généré, mais c'est une bonne idée de le conserver si vous regardez des commandes telles que grep ainsi que SQLite.

Parallélisation et générateur

Présentation d'idées pour la parallélisation.

db-make.py (extrait)


    with concurrent.futures.ProcessPoolExecutor() as executor:
        for pgs, idl in executor.map(getlangs, f(getstreams(target))):

«f» et «getstreams» sont des générateurs. ʻExecutor.map met en parallèle getlangs` et ressemble à un générateur du processus principal.

getstreams est un processus qui ne peut pas être parallélisé. Les données filtrées par «f» et «yield» sont transmises à «getlangs». f est plus qu'un simple filtre, il affiche les informations de progression et traite les données que vous ne transmettez pas à getlangs.

Nom de la langue

Vous pouvez trouver le nom de la langue dans le fichier db-langname.tsv généré.

Nous avons préparé du SQL qui crée des classements par ordre décroissant du nombre de mots enregistrés.

$ sqlite3 enwiktionary.db ".read rank.sql" > rank.tsv
$ head -n 10 rank.tsv
1       English 928987
2       Latin   805426
3       Spanish 668035
4       Italian 559757
5       Russian 394340
6       French  358570
7       Portuguese      282596
8       German  272451
9       Chinese 192619
10      Finnish 176100

Extraction de la langue

J'ai préparé un script qui spécifie le nom de la langue et l'extrait dans un fichier appelé nom de la langue.txt.

Le texte extrait comporte des sauts de page comme commentaires. Le titre correspond au mot-clé.

<!-- <title>Titre</title> -->

Extrayez l'anglais à titre d'exemple.

$ time python collect-lang.py enwiktionary.db English
reading positions... 928,987 / 928,987
optimizing... 49,835 -> 6,575
reading streams... 6,575 / 6,575
English: 928,988

Vérifiez le nombre de lignes et la taille du fichier.

$ wc -l English.txt
14461960 English.txt
$ wc --bytes English.txt
452471057 English.txt

Le nombre de mots enregistrés en anglais est le plus grand, mais après extraction, il fera environ 430 Mo et pourra être ouvert avec un éditeur.

Il est possible de spécifier plusieurs noms de langue.

$ python collect-lang.py enwiktionary.db Arabic Estonian Hebrew Hittite Ido Interlingua Interlingue Novial "Old English" "Old High German" "Old Saxon" Phoenician Vietnamese Volapük Yiddish
reading positions... 143,926 / 143,926
optimizing... 25,073 -> 10,386
reading streams... 10,386 / 10,386
Arabic: 50,380
Estonian: 8,756
Hebrew: 9,845
Hittite: 392
Ido: 19,978
Interlingua: 3,271
Interlingue: 638
Novial: 666
Old English: 10,608
Old High German: 1,434
Old Saxon: 1,999
Phoenician: 129
Vietnamese: 25,588
Volapük: 3,918
Yiddish: 6,324

Langue distincte

Les langues artificielles nouvellement ajoutées et les ancêtres reconstruits ne peuvent pas être extraits avec le script précédent en raison de la méthode de stockage différente de Wiktionary.

Ceux-ci ont leurs propres pages pour chaque mot.

Utilisez le script pour découvrir les langues disponibles.

$ python search-title.py enwiktionary.db
reading `pages`... 6,860,637 / 6,860,637

search-title.tsv est affiché. Les mots sont supprimés du titre de la page et classés par ordre d'apparition décroissant.

$ grep Appendix search-title.tsv | head -n 5
3492    Appendix:Lojban/
3049    Appendix:Proto-Germanic/
2147    Appendix:Klingon/
1851    Appendix:Quenya/
888     Appendix:Proto-Slavic/
$ grep Reconstruction search-title.tsv | head -n 5
5096    Reconstruction:Proto-Germanic/
3009    Reconstruction:Proto-Slavic/
1841    Reconstruction:Proto-West Germanic/
1724    Reconstruction:Proto-Indo-European/
1451    Reconstruction:Proto-Samic/

J'ai préparé un script pour spécifier le titre avec une expression régulière et l'extraire.

Voici un exemple d'utilisation. Vous devez spécifier le nom du fichier de sortie.

Indo-européen


$ python collect-title.py enwiktionary.db PIE.txt "^Reconstruction:Proto-Indo-European/"
reading `pages`... 6,860,557 / 6,860,557
Sorting...
writing `pages`... 1,726 / 1,726

Tokipona (langage artificiel)


$ python collect-title.py enwiktionary.db Toki_Pona.txt "^Appendix:Toki Pona/"
reading `pages`... 6,860,637 / 6,860,637
Sorting...
writing `pages`... 130 / 130

Étant donné que le script ne gère que les expressions régulières, il est possible d'extraire toutes les pages contenant un nom de langue particulier.

Novial (langage artificiel)


$ python collect-title.py enwiktionary.db Novial2.txt Novial
reading `pages`... 6,860,557 / 6,860,557
Sorting...
writing `pages`... 148 / 148

Modèle de script

Nous avons préparé un modèle comme référence lors de la rédaction de votre propre script. Lisez toutes les données tout en affichant la progression.

$ python db-template.py enwiktionary.db
reading `settings`... 1 / 1
reading `streams`... 68,609 / 68,609
reading `namespaces`... 46 / 46
reading `pages`... 6,860,557 / 6,860,557
reading `idlang`... 6,916,807 / 6,916,807
reading `langname`... 3,978 / 3,978
reading `langcode`... 8,146 / 8,146
reading `templates`... 32,880 / 32,880

Recommended Posts

Extraire une langue spécifique du Wiktionnaire
Extraire des données spécifiques d'un JSON complexe
Extraction de données depuis S3
Extrayez la quantité de caractéristiques (identité) du texte.
Extraire le tableau de wikipedia
Extraire les redirections des vidages Wikipedia
Trouvez tous les modèles pour extraire un nombre spécifique de l'ensemble
Extraire des pages des vidages Wikipedia
Extraire du texte d'images avec Python
Extraire plusieurs colonnes spécifiques avec des pandas
Extraire des chaînes de fichiers avec Python