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.
Le script de cet article est publié dans le référentiel suivant.
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.
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)
D'autres versions de date peuvent également être utilisées.
https://dumps.wikimedia.org/enwiktionary/
enwiktionary-20200501-pages-articles-multistream.xml.bz2 890.8 MB
Un index est fourni avec le vidage, mais il n'est pas nécessaire car il sera recréé indépendamment.
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.
https://github.com/7shi/wiktionary-tools/blob/master/python/tools/db-make.py
La méthode la plus rapide parmi les scripts créés dans Premier article a été unifiée.
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.
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
.
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
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
.
https://github.com/7shi/wiktionary-tools/blob/master/python/tools/collect-lang.py
La vitesse de traitement est prise en compte, comme la lecture simultanée de flux continus et la parallélisation de l'expansion des données. Le script est un peu compliqué.
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
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.
https://github.com/7shi/wiktionary-tools/blob/master/python/tools/collect-title.py
Nous ne prêtons pas attention à la vitesse de traitement en supposant que nous ne traiterons pas autant de pages.
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
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