[Python] Extrahieren Sie Textdaten aus XML-Daten von 10 GB oder mehr.

Die andere Partei ist eine XML-Datei der "Wikipedia Japanese Version"

Ich habe mich nach langer Zeit entschlossen, die Verarbeitung natürlicher Sprache zu versuchen, [Wikipedia: Datenbank-Download](https://ja.wikipedia.org/wiki/Wikipedia:% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 83% 99% E3% 83% BC% E3% 82% B9% E3% 83% 80% E3% 82% A6% E3% 83% B3% E3% 83% AD% E3% 83% BC% Ich habe "Wikipedia Japanese version" von E3% 83% heruntergeladen 89). Anstatt ein Verbot des Crawls zu beantragen, können Sie in Wikipedia Dumps herunterladen. Großartig ... aber die heruntergeladene Datei ist eine einzelne XML-Datei. Selbstverständlich beträgt die Dateigröße beim Dekomprimieren nach dem Herunterladen mehr als 12 GB.

$ ll
-rwxrwxrwx 1 k k 12927699165 Apr 12 17:17 xml_jawiki-20200401-pages-articles-multistream.xml*

Wenn ich den Kopf versuche ...

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="ja">
  <siteinfo>
    <sitename>Wikipedia</sitename>
    <dbname>jawiki</dbname>
    <base>https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>
    <generator>MediaWiki 1.35.0-wmf.25</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2" case="first-letter">Medien</namespace>
      <namespace key="-1" case="first-letter">Besondere</namespace>
      <namespace key="0" case="first-letter" />
      <namespace key="1" case="first-letter">Hinweis</namespace>
      <namespace key="2" case="first-letter">Nutzer</namespace>
      ...
      <namespace key="2302" case="case-sensitive">Gadget definition</namespace>
      <namespace key="2303" case="case-sensitive">Gadget definition talk</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>Wikipedia:Protokoll hochladen April 2004</title>

Wenn Sie etwas weiter gehen, sehen Sie die gesuchten Textdaten. Beispiel:

    <title>Informationsingenieurswesen</title>
    <ns>0</ns>
    <id>63</id>
    <revision>
      <id>76256715</id>
      <parentid>73769903</parentid>
      <timestamp>2020-02-18T20:19:50Z</timestamp>
      <contributor>
        <username>Fuda Juban-dori</username>
        <id>1352763</id>
      </contributor>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text bytes="5880" xml:space="preserve">'''Informationsingenieurswesen'''(Johokougaku)[[Information]]Über das Feld[[Maschinenbau]]Ist. Was das Gefühl von Worten betrifft[[Information科学]]という語がもっぱらおおまかに「科学」という語が指す範囲を中心としているのに対し、「Maschinenbau」的な分野に重心があるが、内実としてはどれもたいして変わらないことが多い(たとえば、大学の学部学科名などに関しては、個々の大学の個性による違いのほうが、名前による違いより大きい)。日本で、大学のMaschinenbau部などに[[Computerwissenschaften|Computerwissenschaften]]ないしInformation関係の学科を設置する際に、「Maschinenbau」部という語との整合のためだけに便利に使われた、という面が大きい([[Informationsingenieurswesen科]]Siehe Artikel).

Auf Englisch[[:en:Information engineering|information engineering]]Ist[[Softwareentwicklung]]Es ist eine der Methoden in und entspricht nicht der "Informationstechnik" auf Japanisch. Mit ähnlichen Worten[[Informatik]]Es gibt.

==Überblick==
Hier werden wir aus der Einführung von Abteilungen einiger Universitäten (nicht spezialisierte Kommentare in der Forschung usw.) extrahieren. Was ist Informationstechnik?[[Information]]Ist ein akademischer Bereich für den technischen Einsatz von&lt;ref&gt;[http://www.ics.keio.ac.jp/dept/concept.html.ja Information工学科のねらい] [[Keio Universität]] Information工学科&lt;/ref&gt;。Informationの発生([[Data Mining]]、[[Computergrafik]]など)、Informationの伝達([[Computernetzwerk]]など)、Informationの収集([[Computer Vision]]、[[Suchmaschine]]など)、Informationの蓄積([[Datenbank]]、[[Datenkompression]]など)、Informationの処理([[Technische Informatik]]、[[Computerwissenschaften]]、[[Softwareentwicklung]]) Man kann sagen, dass es sich um ein umfassendes technisches Feld handelt&lt;ref&gt;[http://www.osakac.ac.jp/dept/p/zyuken/gakka2.html Information工学とは何か] [[Osaka Telecommunications University]] Information工学科&lt;/ref&gt;。またInformation工学を、物理現象を支配している原理や法則や社会・経済活動をInformationという観点から捉え,コンピュータ上の設計手順に変換することにより自動化する方法を創出する学問分野とする見方もあり、これは英語でいう[[Computing]]Entspricht (Computing)&lt;ref&gt;[http://www.ise.shibaura-it.ac.jp/main02.HTML-Lehrplan] [[Shibaura Institute of Technology]] Information工学科&lt;/ref&gt;.. In jedem Fall ist die obige Erklärung ein Auszug aus der Einführung der Universitätsabteilungen.

Informatik und[[Informationswissenschaft]]・ Als akademische Gesellschaft, die sich mit Informationstechnik befasst, wurde sie früh in den Vereinigten Staaten gegründet.[[Association for Computing Machinery|ACM]]Wörtlich übersetzt ist es "Computational Machinery Society". Internationale Institution[[Informationsverarbeitung Vereinte Nationen]]Zum Zeitpunkt seiner Einweihung im Jahr 1960 war allgemein anerkannt, dass Computer Maschinen sind, die Informationen sowie (Zahlen-) Berechnungen verarbeiten, und Hiroshi Wada auch in Bezug auf die Einweihung japanischer akademischer Gesellschaften.&lt;ref&gt;http://museum.ipsj.or.jp/pioneer/h-wada.html&lt;/ref&gt;「[[Informationsverarbeitende Gesellschaft]]Benannt[[Informationsverarbeitung]]Ist gekommen, um benutzt zu werden. Ebenfalls[[Elektronische Informations- und Kommunikationsgesellschaft]]Verwendet auch "Information" als Wort, um dieses Feld zu beschreiben.

[[Japan Engineers Association]]In Japan gibt es einen "Unterausschuss für Informationstechnik", und die vom Unterausschuss auferlegten Sekundärprüfungen werden nach Abteilungen durchgeführt. Die Abteilung für Computersoftware wird jedoch als "Abteilung für Informationstechnik" bezeichnet.&lt;ref&gt;http://www.engineer.or.jp/c_categories/index02022.html&lt;/ref&gt;([[Ingenieur Informationstechnische Abteilung]])。

*Als Abteilungsname,[[Kyoto Universität]]([[Fakultät für Ingenieurwissenschaften]])und[[Osaka Universität]]([[基礎Fakultät für Ingenieurwissenschaften]]), Das Department of Information Engineering erscheint erstmals 1970. selbes Jahr,[[Tokyo Institute of Technology]]Das Department of Information Science ist ebenfalls verfügbar[[Universität für Telekommunikation]]und[[Yamanashi Universität]]Abteilung für Computerwissenschaften[[Kanazawa Institute of Technology]]Die Abteilung für Informationsverarbeitungstechnik wurde in gegründet.
*Der Name der Fakultät ist die Fakultät für Informationstechnik des Kyushu Institute of Technology, die 1986 gegründet wurde. Zusätzlich zu den beiden Abteilungen für Intelligente Informationstechnik und Elektronische Informationstechnik, die seit 1987 Studenten aufnehmen, die Abteilung für Steuerungssystemtechnik, die Abteilung für Maschinenbau und die Abteilung für biochemische Systemtechnik (derzeit Abteilung für Systemerstellung Informationstechnik, Abteilung für mechanische Informationstechnik, Abteilung für Bioinformatik) Alle fünf Abteilungen sind auf Informationstechnik spezialisiert. Ebenfalls,[[Informationswissenschaft]]Als Fakultät spezialisiert auf[[Informationswissenschaft部]]Existiert und[[Informatik]]Als Fakultät spezialisiert auf[[Informatik部]]Existiert.[[Maschinenbau]]In 1996[[Osaka Institute of Technology]]Wird zuerst installiert.&lt;ref&gt;https://www.oit.ac.jp/is/&lt;/ref&gt;
* &lt;!--Informationstechnik wird oft als Informatik übersetzt.--&gt;&lt;!--←? Informatik ist Informatik--&gt;""[[Fakultät für Informationstechnik]]Der englische Name ist oft Informatik. Dies liegt daran, dass der Begriff Informatik im englischsprachigen Raum überwiegend leicht zu verstehen ist und als akademischer Hintergrund wie "CS-Abschluss" in der IT-Branche behandelt wird. Information Engineering ist 8 ab 2007/Es ist ungefähr 33. Zum Beispiel Information Engineering[[Universität von Cambridge]]Abteilung Informationstechnik&lt;ref&gt;[http://www.eng.cam.ac.uk/research/div-f/ CUED - Division F: Information Engineering]Universität von Cambridge&lt;/ref&gt;。
*In der Graduiertenschule[[Graduiertenschule für Informatik]]Eine solche.

Es scheint, dass ID- und Mitwirkende-Informationen ebenfalls enthalten sind, aber beeilen Sie sich und möchten Sie den Titel und den Text. Es scheint sinnvoll zu sein, in natürlicher Sprache zu verarbeiten, wenn die Länge des Textes länger als ein bestimmtes Niveau ist. Daher scheint es gut, eine Liste mit Titeln und Textlängen zu erstellen. Um nun mit riesigem XML in Python zu arbeiten ... gab es einen Vorgänger: Speichersparmethode beim Lesen von großem XML mit mehreren GB oder mehr mit Python

Oh ja, es ist wichtig, Speicherplatz zu sparen, indem Sie nichts anderes als das neueste Analyseziel in den Speicher lesen. Wenn Sie Daten verarbeiten, die aus dem Speicher überlaufen, ist die Verarbeitung extrem langsam. Daher empfiehlt es sich, die Verarbeitungsgeschwindigkeit für jede festgelegte Anzahl von Fällen aufzuzeichnen. Hier ist das Ergebnis von Versuch und Irrtum beim Nachahmen.

Code

import xml.etree.ElementTree as ET #Verwenden Sie die Standardbibliothek ElementTree

body ="jawiki-20200401-pages-articles"
path =f"../xml_{body}-multistream.xml"
path_w =f"../short_{body}-title.csv"
context = ET.iterparse(path, events=('start', 'end'))

#Überspringen Sie unnötige Knoten wie root
_, r0 = next(context)
_, r1 = next(context)
_, r2 = next(context)

print(r2.text)
count = 0
title =""
import time
start = time.time()
prev = start
with open(path_w, mode='w',encoding="utf-8") as fw:
    for event, elem in context:
        if event=="start" and elem.text:
            txt = elem.text
            if "title" in elem.tag:
                str = f"{elem.tag}".replace("{http://www.mediawiki.org/xml/export-0.10/}","")
                title = txt
            if "text" in elem.tag:
                str = f"{elem.tag}".replace("{http://www.mediawiki.org/xml/export-0.10/}","")
                if len(txt) <= 1000:
                    x= f"{title},{len(txt)}"
                    fw.write(x+"\n")
                    count += 1
                    if count % 1000 == 0: #Geben Sie die Bearbeitungszeit für jeweils 1000 Fälle aus
                        next = time.time()
                        print(count, f"elapsed_time = {next - prev}", x)
                        prev = next

        elem.clear() #Befreie das analysierte Element aus dem Speicher ... ★

print(count)

Kimo ist bei ★. Ohne diesen clear () -Aufruf hat sich die Verarbeitungsgeschwindigkeit meines PCs seit dem Lesen von 40.000 Artikeln stark verlangsamt.

Verarbeitungsergebnis

636000 elapsed_time = 0.635291576385498 Wikipedia:Antrag auf Löschung/Wikipedia:Antrag auf Löschung/Log/18. November 2019,2692
637000 elapsed_time = 0.6260190010070801 Wikipedia:Antrag auf Löschung/Taku Inoue(Begriffsklärung),1112
638000 elapsed_time = 0.6080121994018555 Statische Webseite,7108
639000 elapsed_time = 0.6243636608123779 Bambina(Unterhaltungsbüro),2590
640000 elapsed_time = 0.6858398914337158 Yui Wakui,1106
641000 elapsed_time = 0.632981538772583 Tsukigicho(Ikeda Stadt),6688
642000 elapsed_time = 0.5550098419189453 Simon Suruga,2868
643000 elapsed_time = 1.671999454498291 My Sweet Maiden/Welcome To Our Diabolic Paradise,1955
644000 elapsed_time = 0.6001503467559814 West Koriyama Zweiter Industriepark,1699
645000 elapsed_time = 0.6131837368011475 Template:UEFA U-17 Europameisterschaft 2009 Spanien Nationalmannschaft,1002
646000 elapsed_time = 0.6151120662689209 Gengoya,1496
647000 elapsed_time = 0.6119420528411865 Tsushima City Higashi Grundschule,2119
647933

Process finished with exit code 0

Selbst nach 600.000 Fällen kann es in etwa 1 Sekunde pro 1000 Fälle verarbeitet werden. Gut gut. Die ausgefüllte CSV wird in der Reihenfolge "Titel, Körperlänge" ausgefüllt.

EU (Begriffsklärung),1480
Organismus,5850
Erdkunde,2217
Kinderkultur,3866
Alltagsleben,1764
Informationsingenieurswesen,2650
Kontextfreie Sprache,2367
Reguläre Sprache,1830
Natürliche Sprache,1396
Goda Käse,1142
Theologie,1767
Thailand,1792
Zeitungsstudien,2344
Apotheke,2338
Nematisches LCD,1209
Wikipedia:FAQ,1645
Wikipedia:Bleiben Sie ruhig, auch wenn sich die Diskussion erwärmt,2269
Musiker,4380
Mailingliste,3687
Wikipedia:FAQ bearbeiten,4163
Aufzeichnung,2004
Wikipedia:Bildbereitstellungsanforderung,2714
Wikipedia:Datenbank herunterladen,3331
Japanischer Karikaturist,5433
Liste der Spieletitel,2730
Shin Takahashi,5675
Takeichi Terazawa,3951

Zum Vergleich habe ich auch Titel mit 1000 Zeichen oder weniger extrahiert.

1321000 elapsed_time = 0.3331446647644043 Category:JA Gifu Wohlfahrt Ren,165
1322000 elapsed_time = 0.19999384880065918 Category:Taiwanesische Frauen,165
1323000 elapsed_time = 0.22401905059814453 Togenin,11
1324000 elapsed_time = 0.26406049728393555 Campanian Boden,14
1325000 elapsed_time = 0.2306044101715088 Hirugahara River,934
1326000 elapsed_time = 0.25202035903930664 Strombocia,27
1327000 elapsed_time = 0.1840074062347412 Yumekure,23
1328000 elapsed_time = 0.21496915817260742 Wikipedia-Bibliothek,28
1329000 elapsed_time = 0.22100353240966797 Preisuntergrenze,14
1330000 elapsed_time = 0.19901561737060547 Category:Libanon General Competition Spieler,95
1331000 elapsed_time = 0.20599126815795898 Feder Yokomachi,12
1332000 elapsed_time = 0.24999594688415527 Ambroise Marie Francoine Joseph Pariso de Beauvois,42
1333000 elapsed_time = 0.20502090454101562 Category:Nordirische Schauspielerin des 20. Jahrhunderts,273
1333333

Process finished with exit code 0

... Wenn der Titel Kategorie enthält, scheint es eine andere Verwendung zu geben.

So konnte ich den XML-Daten mit 2 Millionen Titeln in zehn Minuten einen Treffer hinzufügen. Thanks.

Recommended Posts

[Python] Extrahieren Sie Textdaten aus XML-Daten von 10 GB oder mehr.
Extrahieren Sie mit Python Text aus Bildern
So sparen Sie Speicher, wenn Sie in Python großes XML mit mehreren GB oder mehr lesen
Holen Sie sich mehr als 10 Daten aus dem SSM-Parameterspeicher
Extrahieren Sie mit Python Daten von einer Webseite
Daten aus S3 extrahieren
Python: Japanischer Text: Charakteristisch für Sprache aufgrund von Wortähnlichkeit
[Python] Ruft den Gesetzestext aus der e-GOV-Gesetz-API ab
Generieren Sie aus Textdaten ein vertikales Bild eines Romans
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Python: Japanischer Text: Charakteristisch für Sprache aus Wortkontinuität
[Grundlagen der Datenwissenschaft] Sammeln von Daten aus RSS mit Python
Extrahieren Sie die Vorlage der aus Thunderbird gespeicherten EML-Datei mit python3.7
Hinweise zum Importieren von Daten aus MySQL oder CSV mit Python
Extrahieren Sie Klassifizierungsinformationen usw. aus Genbankdaten im XML-Format
[Python] Was machen Sie mit der Visualisierung von 4 oder mehr Variablen?
Extrahieren Sie Text aus [python] pdf und lesen Sie Zeichen mit Open-Jtalk vor
Python: Tags von HTML-Daten ausschließen
Hit Schatzdaten von Python Pandas
Extrahieren Sie bestimmte Daten aus komplexem JSON
Existenz aus Sicht von Python
Geschwindigkeitsvergleich der Python-XML-Perspektive
Verarbeiten Sie Pubmed .xml-Daten mit Python
Extrahieren Sie mit Python Zeichenfolgen aus Dateien
Vergleich von R, Python, SAS, SPSS aus Sicht europäischer Datenwissenschaftler
Extrahieren Sie mit Python Zeilen, die den Bedingungen entsprechen, aus einer Textdatei
[Python] Formatieren Sie Text mit Zeilenvorschubcodes, die aus PDF-Dateien kopiert wurden
Empfangen Sie Textdaten von MySQL mit Python
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Verarbeiten Sie Pubmed .xml-Daten mit Python [Teil 2]
Verwenden Sie den PostgreSQL-Datentyp (jsonb) von Python
Python: Lesen von JSON-Daten von der Web-API
Erfassung von Pflanzenwachstumsdaten Erfassung von Daten von Sensoren
# 5 [python3] Extrahiert Zeichen aus einer Zeichenfolge
Verbinde viel Python oder und und
Extrahieren Sie japanischen Text aus PDF mit PDFMiner
[Python] Webanwendung von 0! Hands-on (4) -Datenformung-
Empfehlung von Altair! Datenvisualisierung mit Python
Nicht logische Operatorverwendung von oder in Python
Holen Sie sich mit Python die Niederschlagswahrscheinlichkeit aus XML
Notizen vom Anfang von Python 2 lernen
[Einführung in Data Scientist] Grundlagen von Python ♬
[Python] (Linie) Extrahieren Sie Werte aus Diagrammbildern
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Verwenden Sie PIL in Python, um nur die gewünschten Daten aus Exif zu extrahieren
Extrahieren Sie Elemente (mithilfe einer Liste von Indizes) wie NumPy aus einer Python-Liste / einem Python