[PYTHON] Ich bekam das Datum von Kagawas Pub-Reis und zeichnete eine Grafik

Vorwort

Hallo, ich habe in letzter Zeit dank Corona eine Pause von der Schule gemacht und meine freien Tage endlos verbracht, also töte ich meine Zeit, indem ich jeden Tag mit verschiedenen Technologien spiele. Um ehrlich zu sein, macht es viel Spaß. Übrigens fand ich damals etwas, als ich Discord-Bots machte, 2048 implementierte, in esoterischen Sprachen spielte und mit morphologischen Analysen spielte. Ja, derzeit unter Google Drive von der Netorabo-Redaktion /25/news026.html) Dies ist ein ** öffentlicher Kommentar ** der ** hochgelobten Verordnung über Gegenmaßnahmen gegen die Spielsucht der Präfektur Kagawa **. Als ich das fand, dachte ich.

** Es sieht so aus, als würde es Spaß machen, damit zu spielen **.

Da die vom Scanner gelesene Person in PDF-Daten konvertiert wird, kann sie nicht so behandelt werden, wie sie ist. Daher ist es erforderlich, sie in Textdaten zu konvertieren. Die Konvertierung in Textdaten scheint jedoch bereits Spaß zu machen. Ich habe die Bildverarbeitungstechnologie hier noch nicht berührt, daher scheint es, dass neues Wissen erweitert werden kann. Darüber hinaus scheint es, wie ich gehört habe, einige unnatürliche Verzerrungen in den Daten zu geben. Es macht absolut Spaß, dies zu analysieren. Deshalb habe ich mich entschieden zu spielen.

Umgebung

Vorerst im Bild

Verwenden Sie zunächst pdf2image, um die PDF-Datei in ein Bild zu konvertieren. Es ist ein Paket des Codes, der in fast [diesem Artikel] geschrieben wurde (https://qiita.com/kikuyan8540/items/35751c573de014df205b). Es tut mir leid, ich habe nicht das Gefühl, dass ich besseren Code schreiben kann ...

Bildgebung.py


import pathlib
import pdf2image

pdf_files = pathlib.Path('PDF').glob('*.pdf')

for pdf_file in pdf_files:
    base = pdf_file.stem
    img_dir = pathlib.Path(f'Bild/{base}')
    img_dir.mkdir()
    images = pdf2image.convert_from_path(pdf_file, grayscale=True, dpi=200)
    for index, image in enumerate(images):
        image.save(img_dir/pathlib.Path(f'{index + 1}.png'), 'png')
    print(base)  #Zur Überprüfung des Fortschritts

Die Ausführung wird einige Zeit dauern. Warten Sie daher bitte geduldig.

Wenn Sie warten, wird es so sein. image.png Nun, wenn ich sie so nebeneinander lege, habe ich das Gefühl, Pub-Reis in der Hand zu haben.

Vom Bild zur Zeichenkette

Verwenden Sie Tessertact_OCR. Ich verehre am Computer mit der Erwartung, dass er nicht gut erkannt wird. Es ist wichtig, sich so tief wie möglich zu verbeugen. Es wäre schön, ein Angebot zu haben. Wenn Sie das Gefühl haben, dass Ihre Anbetung verstanden wird, versuchen wir, die 14. (entsprechend beschlossene) Genehmigung am 23. Januar anzuerkennen.

C:\Users\usr\Documents\Kagawa>tesseract .\Bild\Zustimmen 0123\14.png .\Zeichenerkennung\test -l jpn
Tesseract Open Source OCR Engine v5.0.0-alpha.20200328 with Leptonica
Warning: Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 344
Detected 201 diacritics

Es sieht so aus, als gäbe es viele Probleme, aber es liegt wahrscheinlich an meinem Verstand, an meinem Verstand. Vergleichen wir nun die Ein- und Ausgabe. Klicken Sie hier für das eingegebene Bild 14.png Hier ist der Ausgabetext.

test.txt


desknefs NEO             -Seite 171

Parlamentarisches Sekretariat(glkeldprefr kagawa lg jp)

 

-------- "

―――(Wird weggelassen, wenn Leerzeilen fortgesetzt werden)―――
 
Bürger: "Stellungnahme / Anfrage der Präfektur Wagawa"<hp- adm@pref. kagawa.Idg.]p>- -
Ziel: gikaiGpref.kagawa.Ig.jp

CC :- "

Gegenstand:Posting von der Seite Einfrieren / Anfrage

Weiße Zeit:23. Januar 2020(Buch) 15:16

―――(Wird weggelassen, wenn Leerzeilen fortgesetzt werden)―――

[Inhalt von Meinungen und Anfragen]
[Meinungsfeld zur Homepage der Präfekturversammlung]-                                」
Die Präfekturversammlung wird Sie weiterhin auf leicht verständliche Weise über die Situation der Versammlung informieren.
Ich werde. Bitte teilen Sie uns Ihre Meinungen und Eindrücke vom Besuch der Kongress-Website mit.
Nein. Wir werden Ihre Meinungen als wertvolle Stimmen von allen bezeichnen.
Ich werde das machen.
bitte beachten Sie$--- ---.

@Wir können keine Petitionen per E-Mail oder E-Mail über einzelne Mitglieder des Landtages annehmen.

【(Wohnsitz] ---
【E-Maill . ,
[Betreff] Meinungen zu öffentlichen Kommentaren

[Meinungen / Eindrücke]

Telefonnummer der Altersachse

Ich stimme dem Artikel über Gegenmaßnahmen gegen die Spielsucht zu.
Ich mache mir Sorgen, dass überall Kinder Spiele und Smartphones spielen

 

[ADDR]192. 168.7. 21

[DATE]2020/01/23 15:16: 42
[USERAGENT]Mozilla/5.0 (Windows NT 10.0: Win64: x64) AppleWeb
Kit/537.36 (KHTML, like Gecko) Chrome/70.0.3538. 102 faP/53 oder 3
6 TOg9. 18362

Äh ~~~~~~~ Es gibt einige sehr instabile Orte, aber ich kann das Datum, an dem ich mit dieser Zeit spielen möchte, problemlos ermitteln, daher bin ich vorerst in Ordnung.

Holen Sie sich alles auf einmal

PyOCR ist an der Reihe. Zeichen, die dem regulären Ausdruck von / ^ ([^ 0-9 \ n] * \ d) {12} [^ 0-9 \ n] * $ / entsprechen (eine Zeile mit 12 "nur" Zahlen) Extrahieren Sie die Spalte. Die Zahlen scheinen ziemlich genau erkannt zu werden, so dass Sie sie nicht so sehr vermissen werden. Das erfasste Datum wird in den vier Textdateien "Zustimmen", "Nicht zustimmen", "Unternehmer" und "Vorschlag" gespeichert. Dieser Code, der basierend auf diesem Artikel geschrieben wurde, wurde mit mysteriöser Kraft geschrieben, um ein Wunder zu bewirken und die Spezifikationen des Computers zu vervierfachen. Glaube und tue.

OCR.py


from PIL import Image
import sys
import pyocr
import pyocr.builders
from pathlib import Path
import re
count = 0
tool = pyocr.get_available_tools()[0]
folders = list(Path("Bild").glob("*")) #Bildフォルダのパスをすべて取得
agr, opp, bsp, rec = open("Zustimmen.txt", "w"), open("Opposition.txt", "w"), open("Geschäftsperson.txt", "w"), open("Empfehlung.txt", "w")  #Initialisieren Sie die Textdatei einmal
agr,opp,bsp,rec.close()
dic = {"Loben": "Loben成.txt", "Anti": "Anti対.txt", "Ding": "Ding業者.txt", "Vorschlag": "Vorschlag言.txt"}  #Switch Ein Wörterbuch zum Schreiben von Textsachen
for fol in folders:
    with open(dic[str(fol)[3]],"a") as fil: #Beurteilen Sie die zu öffnende Datei mit dem "4. Zeichen" des Ordnerpfads
        for path in (Path(fol).glob("*")):
            count += 1
            text = tool.image_to_string(
                Image.open(path),
                lang="jpn",
                builder=pyocr.builders.TextBuilder(tesseract_layout=6)
            )
            match = re.search(r'^([^0-9\n]*\d){12}[^0-9\n]*$', text, re.MULTILINE)
            if match != None:  #Bei Dokumenten, die mehrere Seiten umfassen, ist möglicherweise nirgendwo auf der Seite ein Datum angegeben.
                match = match.group()
                fil.write(match + "\n")
            print(count) #Zur Überprüfung des Fortschritts

Mir ist übrigens kein Wunder passiert, die Ausführungszeit ist zu lang Vielleicht gibt es eine Möglichkeit, dies etwas früher zu beenden

Akquisitionsergebnis

Als Ergebnis der Ausführung dieses Programms sieht beispielsweise der Inhalt von "Agree.txt" so aus.

Zustimmen.txt



Datum (und Uhrzeit:23. Januar 2020(Holz) 11:39 ー ー
Datum (und Uhrzeit:23. Januar 2020(Holz) 11:49 ー ー
-Zeit:23. Januar 2020(Buch) 11:50                              .
Datum (und Uhrzeit:23. Januar 2020(Holz) 11:55 ---
Datum (und Uhrzeit:23. Januar 2020(Holz) 13:49
Datum (und Uhrzeit:23. Januar 2020(Buch) 15:16 ---.
.Datum (und Uhrzeit:23. Januar 2020(Holz) 15:31
Datum (und Uhrzeit:23. Januar 2020(Holz) 15:51   .--- ---.
Datum (und Uhrzeit:23. Januar 2020(Holz) 15:58                            .
Datum (und Uhrzeit:23. Januar 2020(Holz) 17:55    .                 ---- ---.
Datum (und Uhrzeit:23. Januar 2020(Holz) 20:23       .
Datum (und Uhrzeit:23. Januar 2020(Holz) 12:22
Datum (und Uhrzeit:23. Januar 2020(Holz) 20:31      -"・
Datum (und Uhrzeit:23. Januar 2020(Holz) 13:10 ---.
Datum (und Uhrzeit:23. Januar 2020(Holz) 16:27                            ]      」
Datum (und Uhrzeit:23. Januar 2020(Holz) 17:03
Datum (und Uhrzeit:23. Januar 2020(Holz) 18:09             ]--- ---.
Datum (und Uhrzeit:23. Januar 2020(Holz) 21:41
22812 050 Präsentation zurücksenden IO008 "1-
Datum (und Uhrzeit:24. Januar 2020(Geld) 08:49 ー ー
.Datum (und Uhrzeit:24. Januar 2020(Geld) 12:40                .
Datum (und Uhrzeit:24. Januar 2020(Geld) 13:28
Datum (und Uhrzeit:24. Januar 2020(Geld) 13:31
Datum (und Uhrzeit:24. Januar 2020(Geld) 13:34                    -
Datum (und Uhrzeit:24. Januar 2020(Geld) 13:35
.Datum (und Uhrzeit:24. Januar 2020(Geld) 14:01    ]- -
.Datum (und Uhrzeit:24. Januar 2020(Geld) 15:08 ー ー.
.. Datum (und Uhrzeit: "24. Januar 2020(Geld) 08:49  .--- ---.
Datum (und Uhrzeit:24. Januar 2020(Geld) 15:33 ー ー
Datum (und Uhrzeit:24. Januar 2020(Geld) 15:34
Datum (und Uhrzeit:24. Januar 2020(Geld) 15:37 ・
Datum (und Uhrzeit:24. Januar 2020(Geld) 15:44 ・
Datum (und Uhrzeit:24. Januar 2020(Geld) 16:03            」      -       -
Datum (und Uhrzeit:24. Januar 2020(Geld) 16:13 ー ー
-Datum (und Uhrzeit:24. Januar 2020(Geld) 16:14
Datum (und Uhrzeit:24. Januar 2020(Geld) 16:16     -"-
Datum (und Uhrzeit:24. Januar 2020(Geld) 16:39    -
-.Damals:24. Januar 2020(Geld) 08:50 ー ー
Datum (und Uhrzeit:24. Januar 2020(Geld) 16:47      -
(Folgendes wird weggelassen)

Es scheint, dass einige "Dinge, die keine Daten sind" eingemischt sind, aber es scheint, dass sie im Allgemeinen funktionieren. Übrigens gab es im Ganzen nur wenige "Nicht-Daten", also habe ich sie manuell entfernt, was ein Moment war.

Normalisierung

Wenn dies so bleibt, wird das Rauschen schrecklich sein, also normalisieren Sie die Daten. Vereinfachen Sie einfach mit "einer Kombination aller Zahlen im Datum". Die Anzahl der Zeichen sollte auf 12 festgelegt sein, damit Sie sich damit normalisieren können.

Normalisierung.py


import re

for name in ["Zustimmen","Opposition","Geschäftsperson","Empfehlung"]:
    with open(name + ".txt") as fil:
        contents = fil.read()
    match = re.findall(r'([0-9]|\n)', contents, re.MULTILINE)
    with open(name + "_Normalisierung.txt","w") as fil:
        fil.write("".join(match))

Zustimmen_Normalisierung.txt



202001231139
202001231149
202001231150
202001231155
202001231349
202001231516
202001231531
202001231551
202001231558
202001231755
202001232023
202001231222
202001232031
202001231310
(Folgendes wird weggelassen)

Es ist ein gutes Gefühl.

Zeichnen Sie ein Streudiagramm

Zeichnen Sie abschließend ein Streudiagramm. Die Rekrutierungsfrist für Pub-Reis beträgt ** 1/23 bis 2/6 ** (ist das nicht kurz?). Zeichnen wir also vorerst die ** Verteilung der Stimmen für ** in diesem Zeitraum. Die beste Antwort finden Sie in diese Frage auf teratile.

Graphgenerierung.py


import matplotlib.pyplot as plt
from matplotlib import dates as mdates
from datetime import datetime as dt
date = []
time = []
x = []
y = []
with open("Zustimmen_Normalisierung.txt", "r") as fil:
    for line in fil:
        date.append(line[4:10])
        time.append(line[10:12])
for d in date:
    y.append(dt.strptime(d, "%m%d%H"))
for d in time:
    x.append(dt.strptime(d, "%M"))
ax = plt.subplot()
ax.scatter(x, y, alpha=0.1,c='red',s=40)
ax.set_xlim([dt.strptime('00', '%M'),
             dt.strptime('59', '%M')])
ax.set_ylim([dt.strptime('01/23', '%m/%d'), dt.strptime('02/06', '%m/%d')])
plt.xticks(rotation=90)
plt.savefig("Graph.png ")

Hier ist das Ausgabediagramm [^ 1]. グラフ.png ** Offensichtlich passiert etwas. ** ** ** Wie in den Anmerkungen erwähnt, ist in diesem Diagramm "Monat und Zeit" für vertikale Linien und "Minuten" für horizontale Linien eingraviert. Schließlich sind diese beiden deutlich dunklen Linien wahrscheinlich auf das Versenden von Pub-Reis mit einer so hohen Geschwindigkeit zurückzuführen, dass er selbst in Schritten von "Minuten" kontinuierlich sichtbar ist. Nun, es ist interessant.

Schließlich

Es war viel Spaß. Ich kündige, weil ich heute müde bin, aber Pub-Reis ist immer noch für die Öffentlichkeit zugänglich. Ich denke, Sie sollten damit spielen, wenn Sie Zeit haben.

Verschiedene Dinge, auf die ich mich bezog

[^ 1]: Ich habe die Beschriftung nicht mehr festgelegt, weil ich müde bin, aber um es zu erklären, steht die x-Achse für "Minuten" (0-59) und die y-Achse für "Monate und Tage" (1) in Schritten von 1 Stunde. Es scheint / 23/00 bis 2/6/23 zu repräsentieren).

Recommended Posts

Ich bekam das Datum von Kagawas Pub-Reis und zeichnete eine Grafik
"Deep Learning from Grund" Memo zum Selbststudium (Teil 8) Ich habe die Grafik in Kapitel 6 mit matplotlib gezeichnet
Ich habe mich im Labyrinth verlaufen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
Ich habe eine Klasse in Python3 und Java geschrieben
Zeichnen Sie mehrere Fotos in einem Diagramm aus mehreren Ordnern
Ich habe ein gestapeltes Balkendiagramm mit matplotlib von Python erstellt und eine Datenbeschriftung hinzugefügt
Ich habe die Geschwindigkeit der Referenz des Pythons in der Liste und die Referenz der Wörterbucheinbeziehung aus der In-Liste verglichen.
[Python] Darstellung der Anzahl der Beschwerden von Lebensversicherungsunternehmen in einem Balkendiagramm
Zeichne ein Diagramm mit Julia ... Ich habe eine kleine Analyse versucht
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Erstellen Sie ein Diagramm mit der Plot-Schaltfläche und dem Schieberegler
Ich habe python3.4 in .envrc mit direnv geschrieben und es zugelassen, aber ich habe einen Syntaxfehler erhalten
Erstellen Sie ein Skript für Ihre Pepper-Fertigkeit in einer Tabelle und laden Sie SayText direkt aus dem Skript
Ich möchte die Grafik in 3D sehen! Ich kann einen solchen Traum wahr werden lassen.
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe einen sqlite3.OperationalError
[Addition] git ist anfällig! Ich muss aktualisieren! Aber yum hat nicht die neueste Version und ich habe sie von der Quelle bekommen! Wenn Notizen
Speichern Sie das Pystan-Modell und erhalten Sie eine Pickle-Datei
Ich habe den Super-Resolution-Algorithmus "PULSE" in einer Windows-Umgebung ausprobiert
Ich habe versucht, eine Rangliste zu erstellen, indem ich das Mitgliederteam der Organisation abgekratzt habe
Mezzanine-Einführungsnotiz, dass ich im Fluss stecken geblieben bin
Ich habe einen Fehler in vim oder zsh in der Python 3.7-Serie
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
[Python] Ich habe das Spiel von pip installiert und versucht zu spielen
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit in Python unter Berücksichtigung des Zeitunterschieds
Ich habe N-Queen in verschiedenen Sprachen implementiert und die Geschwindigkeit gemessen
Zeichnen wir ein Diagramm der Poisson-Verteilung und der kumulativen Poisson-Verteilung in Python bzw. Java.
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Ich möchte Informationen von fstab am ssh-Verbindungsziel abrufen und den Befehl ausführen
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
Als ich das Verzeichnis für UNIX Socket unter / var / run mit systemd geschnitten habe, steckte ich in einer Falle und was zu tun ist