[PYTHON] Extrahieren Sie eine bestimmte Sprache aus Wiktionary

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.

  1. Erkundung effizienter Verarbeitungsmethoden für Wiktionary
  2. Vergleichen Sie die Wiktionary-Verarbeitungsgeschwindigkeit zwischen F # und Python
  3. Wiktionary-Sprachcode abrufen
  4. Extrahieren Sie eine bestimmte Sprache aus Wiktionary ← Dieser Artikel
  5. Untersuchen Sie unregelmäßige englische Verben mit Wiktionary

Das Skript für diesen Artikel befindet sich im folgenden Repository.

Überblick

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.

Vorbereitung

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)

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.

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.

Parallelisierung und Generator

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.

Sprache Name

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

Sprachextraktion

Ich habe ein Skript vorbereitet, das den Sprachnamen angibt und in eine Datei mit dem Namen language name.txt extrahiert.

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

Separate Sprache

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.

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

Skriptvorlage

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

Extrahieren Sie eine bestimmte Sprache aus Wiktionary
Extrahieren Sie bestimmte Daten aus komplexem JSON
Daten aus S3 extrahieren
Extrahieren Sie die Merkmalsmenge (Identität) aus dem Text.
Tabelle aus Wikipedia extrahieren
Extrahieren Sie Weiterleitungen aus Wikipedia-Dumps
Finden Sie alle Muster, um eine bestimmte Zahl aus dem Satz zu extrahieren
Extrahieren Sie Seiten aus Wikipedia-Dumps
Extrahieren Sie mit Python Text aus Bildern
Extrahieren Sie bestimmte mehrere Spalten mit Pandas
Extrahieren Sie mit Python Zeichenfolgen aus Dateien