Die gesamten Wiktionary-Daten sind zu groß, um eine bestimmte Sprache zu untersuchen. Daher habe ich ein Skript erstellt, um die Sprache als Vorprozess anzugeben und zu extrahieren.
Dies ist eine Reihe von Artikeln.
Das Skript für diesen Artikel befindet sich im folgenden Repository.
Es ist verschwenderisch, den vollständigen Text zu verarbeiten, um eine bestimmte Sprache zu untersuchen. Extrahieren Sie, indem Sie die Sprache als Vorverarbeitung angeben.
Die Textdatei hat die Größe, dass sie von einem Editor geöffnet werden kann, was die Handhabung erleichtert. Informationen können durch gewöhnliche Textverarbeitung extrahiert werden, ohne eine spezielle Methode zur Beschleunigung wie zuvor zu entwickeln.
Wiktionary Verwenden Sie die englische Version der Dump-Datei.
Die Dump-Daten werden komprimiert mit bzip2 bereitgestellt. Wir werden die Version vom 1. Mai 2020, die zum Zeitpunkt des Schreibens des Artikels verfügbar ist, in einem komprimierten Zustand ohne Dekomprimierung verwenden. (Es wird ungefähr 6 GB sein, wenn es erweitert wird)
Andere Datumsversionen können ebenfalls verwendet werden.
https://dumps.wikimedia.org/enwiktionary/
enwiktionary-20200501-pages-articles-multistream.xml.bz2 890.8 MB
Mit dem Speicherauszug wird ein Index bereitgestellt, der jedoch nicht erforderlich ist, da er unabhängig neu erstellt wird.
Die heruntergeladene xml.bz2 sollte irgendwo aufbewahrt werden. Es kann überall sein, aber dieses Mal werde ich einen dedizierten Ordner in meinem Home-Verzeichnis erstellen.
Untersuchen Sie die Länge des Streams, während Sie die Daten erweitern. Überprüfen Sie die Seiteninformationen (entsprechend dem Index) und die Sprachüberschriften parallel zu den erweiterten Daten.
https://github.com/7shi/wiktionary-tools/blob/master/python/tools/db-make.py
Die schnellste Methode unter den in Erster Artikel erstellten Skripten wurde vereinheitlicht.
Ausführungsergebnis
$ 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...
Acht Dateien werden generiert.
Dateiname | Inhalt |
---|---|
db-settings.tsv | Einstellungsinformationen (Dateiname) |
db-streams.tsv | Stream-Informationen (ID, Offset, Länge) |
db-namespaces.tsv | Namespaces (ns-Tag) |
db-pages.tsv | Seiteninformationen (ID, Stream, Namespace, Titel, Übertragung, Namespace) |
db-idlang.tsv | Sprache (ID) in Seite (ID) enthalten |
db-langname.tsv | Korrespondenztabelle mit Sprach-ID und Sprachname (einschließlich Alias) |
db-langcode.tsv | Korrespondenztabelle zwischen Sprachcode und Sprachname |
db-templates.tsv | Eingebettete Vorlagen |
Verwenden Sie das vorbereitete SQL, um SQLite zu füllen. Es ist ein einfaches SQL, daher denke ich, dass es eine schnelle Möglichkeit ist, dies zu lesen, um die Tabellenstruktur zu sehen.
$ 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'...
Die Vorbereitung ist abgeschlossen.
Sobald Sie die Daten ausgefüllt haben, benötigen Sie das generierte db- *. Tsv nicht mehr, aber es ist eine gute Idee, es beizubehalten, wenn Sie Befehle wie "grep" und SQLite betrachten.
Ideen für die Parallelisierung einführen.
db-make.py (Auszug)
with concurrent.futures.ProcessPoolExecutor() as executor:
for pgs, idl in executor.map(getlangs, f(getstreams(target))):
f
und getstreams
sind Generatoren. executor.map
parallelisiert getlangs
und sieht aus wie ein Generator für den Hauptprozess.
getstreams ist ein Prozess, der nicht parallelisiert werden kann. Daten, die nach "f" und "Ausbeute" gefiltert sind, werden an "getlangs" übergeben. f
ist mehr als nur ein Filter, es zeigt Fortschrittsinformationen an und verarbeitet Daten, die Sie nicht an getlangs
übergeben.
Sie finden den Sprachnamen in der generierten Datei db-langname.tsv.
Wir haben SQL vorbereitet, das Rangfolgen in absteigender Reihenfolge der Anzahl der aufgezeichneten Wörter erstellt.
$ 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
Ich habe ein Skript vorbereitet, das den Sprachnamen angibt und in eine Datei mit dem Namen language name.txt
extrahiert.
https://github.com/7shi/wiktionary-tools/blob/master/python/tools/collect-lang.py
Die Verarbeitungsgeschwindigkeit wird berücksichtigt, z. B. das gleichzeitige Lesen kontinuierlicher Streams und das Parallelisieren der Datenerweiterung. Das Skript ist etwas kompliziert.
Der extrahierte Text enthält Seitenumbrüche als Kommentare. Der Titel entspricht dem Stichwort.
<!-- <title>Titel</title> -->
Extrahieren Sie Englisch als Beispiel.
$ 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
Überprüfen Sie die Anzahl der Zeilen und die Dateigröße.
$ wc -l English.txt
14461960 English.txt
$ wc --bytes English.txt
452471057 English.txt
Die Anzahl der auf Englisch aufgezeichneten Wörter ist die größte, aber nach der Extraktion ist sie ungefähr 430 MB groß und kann mit einem Editor geöffnet werden.
Es können mehrere Sprachnamen angegeben werden.
$ 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
Die neu hinzugefügte künstliche Sprache und der rekonstruierte Vorläufer können vom vorherigen Skript nicht extrahiert werden, da das Wiktionary anders gespeichert ist.
Diese haben ihre eigenen Seiten für jedes Wort.
Verwenden Sie das Skript, um herauszufinden, welche Sprachen verfügbar sind.
$ python search-title.py enwiktionary.db
reading `pages`... 6,860,637 / 6,860,637
search-title.tsv wird ausgegeben. Die Wörter werden aus dem Titel der Seite entfernt und in absteigender Reihenfolge des Erscheinungsbilds angeordnet.
$ 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/
Ich habe ein Skript vorbereitet, um den Titel mit einem regulären Ausdruck anzugeben und zu extrahieren.
https://github.com/7shi/wiktionary-tools/blob/master/python/tools/collect-title.py
Wir achten nicht auf die Verarbeitungsgeschwindigkeit unter der Annahme, dass wir nicht so viele Seiten verarbeiten werden.
Hier ist ein Anwendungsbeispiel. Sie müssen den Namen der Ausgabedatei angeben.
Indogermanisch
$ 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 (künstliche Sprache)
$ 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
Da das Skript nur reguläre Ausdrücke verarbeitet, können alle Seiten extrahiert werden, die einen bestimmten Sprachnamen enthalten.
Novial (künstliche Sprache)
$ python collect-title.py enwiktionary.db Novial2.txt Novial
reading `pages`... 6,860,557 / 6,860,557
Sorting...
writing `pages`... 148 / 148
Wir haben eine Vorlage als Referenz für das Schreiben Ihres eigenen Skripts vorbereitet. Lesen Sie alle Daten, während Sie den Fortschritt anzeigen.
$ 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