[PYTHON] J'ai eu la date du riz du pub de Kagawa et j'ai dessiné un graphique

Préface

Salut, j'ai pris une pause de l'école ces derniers temps grâce à Corona, et j'ai passé mes jours libres sans fin, donc je tue mon temps en jouant avec diverses technologies chaque jour. Pour être honnête, c'est très amusant. D'ailleurs, à l'époque, j'ai trouvé quelque chose en créant des bots Discord, en implémentant 2048, en jouant dans des langages ésotériques et en jouant avec l'analyse morphologique. Oui, actuellement sur Google Drive [par le service éditorial de Netorabo](https://nlab.itmedia.co.jp/nl/articles/2004 /25/news026.html) Ceci est un ** commentaire public ** de la ** Préfecture de Kagawa Net Game Addiction Countermeasures Ordinance **, qui a été très acclamée. Quand j'ai trouvé ça, j'ai pensé.

** On dirait que c'est amusant de jouer avec ça **.

Étant donné que la personne lue par le scanner est convertie en données sur PDF, elle ne peut pas être traitée comme des données telles quelles, il est donc nécessaire de les convertir en données texte, mais le processus de conversion en données texte semble déjà amusant. Je n'ai pas encore touché à la technologie de traitement d'image ici, il semble donc que de nouvelles connaissances peuvent être élargies. De plus, d'après ce que j'ai entendu, il semble qu'il y ait des biais non naturels dans les données. C'est absolument amusant d'analyser cela. C'est pourquoi j'ai décidé de jouer.

Environnement

Pour le moment à l'image

Tout d'abord, utilisez pdf2image pour convertir le PDF en image. C'est un pakuri du code écrit dans presque cet article. Je suis désolé, je n'ai pas l'impression de pouvoir écrire un meilleur code ...

Imagerie.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'image/{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)  #Pour vérifier les progrès

L'exécution prendra un certain temps, veuillez donc patienter.

Si vous attendez, ce sera comme ça. image.png Eh bien, quand je les mets côte à côte comme ça, je sens que j'ai du riz de pub dans la main.

De l'image à la chaîne de caractères

Utilisez Tessertact_OCR. J'adore à l'ordinateur avec l'espoir qu'il ne sera pas reconnu d'une bonne manière. Il est important de s'incliner le plus profondément possible. Ce serait bien d'avoir une offre. Si vous sentez que votre culte est compris, essayons de reconnaître la 14e approbation (convenablement décidée) le 23 janvier.

C:\Users\usr\Documents\Kagawa>tesseract .\image\D'accord 0123\14.png .\Reconnaissance des caractères\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

On dirait qu'il y a beaucoup de problèmes, mais c'est probablement à cause de mon esprit, à cause de mon esprit. Comparons maintenant l'entrée et la sortie. Cliquez ici pour l'image saisie 14.png Voici le texte de sortie.

test.txt


desknefs NEO             -Épisode 171

Secrétariat parlementaire(glkeldprefr kagawa lg jp)

 

-------- "

―――(Omis car les lignes vides continuent)―――
 
Citoyen: "Page d'opinion / d'enquête de la préfecture de Wagawa"<hp- adm@pref. kagawa.Idg.]p>-
destination: gikaiGpref.kagawa.Ig.jp

CC :- "

matière:Publication à partir de la page de congélation / demande

Temps blanc:23 janvier 2020(Livre) 15:16

―――(Omis car les lignes vides continuent)―――

[Contenu des opinions et demandes de renseignements]
[Boîte d'avis sur la page d'accueil de l'Assemblée préfectorale]-                                」
L'assemblée préfectorale continuera à vous informer de la situation de l'assemblée d'une manière facile à comprendre.
Je vais. Veuillez nous faire part de vos opinions et impressions sur la visite du site Web du Congrès.
Non. Nous qualifierons vos opinions de voix valables de tous.
Je le ferai.
Notez s'il vous plaît$---

@Nous ne pouvons pas accepter de pétition par e-mail ou par e-mail concernant des membres individuels de la Diète.

【(Résidence] ---
【E-Maill . ,
[Subject] Avis sur les commentaires publics

[Opinions / impressions]

Numéro de téléphone de l'axe des âges

Je suis d'accord avec l'article Net Game Addiction Countermeasures.
Je crains qu'il y ait des enfants qui jouent à des jeux et des smartphones partout où je vais

 

[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 ou 3
6 TOg9. 18362

Euh ~~~~~~~ Il y a des endroits très instables, mais je peux obtenir la date avec laquelle je prévois de jouer cette fois-ci sans aucun problème, donc je vais bien pour le moment.

Obtenez tout en même temps

C'est au tour de PyOCR. Caractères qui correspondent à l'expression régulière de / ^ ([^ 0-9 \ n] * \ d) {12} [^ 0-9 \ n] * $ / (une ligne contenant 12 "seulement" nombres) Extrayez la colonne. Les chiffres semblent être reconnus assez précisément, vous ne les manquerez donc pas beaucoup. La date acquise est stockée dans quatre fichiers texte, «D'accord», «Pas d'accord», «Opérateur commercial» et «Proposition». Ce code, qui a été écrit sur la base de cet article, est écrit avec une puissance mystérieuse pour provoquer un miracle et quadrupler les spécifications de l'ordinateur. Croyez et faites.

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("image").glob("*")) #imageフォルダのパスをすべて取得
agr, opp, bsp, rec = open("Se mettre d'accord.txt", "w"), open("Opposition.txt", "w"), open("homme d'affaires.txt", "w"), open("Recommandation.txt", "w")  #Initialisez le fichier texte une fois
agr,opp,bsp,rec.close()
dic = {"Louange": "Louange成.txt", "Anti": "Anti対.txt", "Chose": "Chose業者.txt", "Proposition": "Proposition言.txt"}  #Changer de dictionnaire pour écrire des choses textuelles
for fol in folders:
    with open(dic[str(fol)[3]],"a") as fil: #Déterminez quel fichier ouvrir avec le "4ème caractère" dans le chemin du dossier
        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:  #Pour les documents qui s'étendent sur plusieurs pages, il se peut qu'il n'y ait aucune date sur la page.
                match = match.group()
                fil.write(match + "\n")
            print(count) #Pour vérifier les progrès

Au fait, aucun miracle ne m'est arrivé, le temps d'exécution est trop long Il y a peut-être un moyen de terminer cela un peu plus tôt

Résultat d'acquisition

À la suite de l'exécution de ce programme, par exemple, le contenu de "Agree.txt" ressemble à ceci.

Se mettre d'accord.txt



Date et l'heure:23 janvier 2020(bois) 11:39 ー ー
Date et l'heure:23 janvier 2020(bois) 11:49 ー ー
-Temps:23 janvier 2020(Livre) 11:50                              .
Date et l'heure:23 janvier 2020(bois) 11:55 ---
Date et l'heure:23 janvier 2020(bois) 13:49
Date et l'heure:23 janvier 2020(Livre) 15:16 ---.
.Date et l'heure:23 janvier 2020(bois) 15:31
Date et l'heure:23 janvier 2020(bois) 15:51   .---
Date et l'heure:23 janvier 2020(bois) 15:58                            .
Date et l'heure:23 janvier 2020(bois) 17:55    .                 ----
Date et l'heure:23 janvier 2020(bois) 20:23       .
Date et l'heure:23 janvier 2020(bois) 12:22
Date et l'heure:23 janvier 2020(bois) 20:31      -"・
Date et l'heure:23 janvier 2020(bois) 13:dix ---.
Date et l'heure:23 janvier 2020(bois) 16:27                            ]      」
Date et l'heure:23 janvier 2020(bois) 17:03
Date et l'heure:23 janvier 2020(bois) 18:09             ]---
Date et l'heure:23 janvier 2020(bois) 21:41
22812 050 Présentation de retour IO008 "1-
Date et l'heure:24 janvier 2020(Argent) 08:49 ー ー
.Date et l'heure:24 janvier 2020(Argent) 12:40                .
Date et l'heure:24 janvier 2020(Argent) 13:28
Date et l'heure:24 janvier 2020(Argent) 13:31
Date et l'heure:24 janvier 2020(Argent) 13:34                    -
Date et l'heure:24 janvier 2020(Argent) 13:35
.Date et l'heure:24 janvier 2020(Argent) 14:01    ]-
.Date et l'heure:24 janvier 2020(Argent) 15:08 ー ー.
.. Date et l'heure: "24 janvier 2020(Argent) 08:49  .---
Date et l'heure:24 janvier 2020(Argent) 15:33 ー ー
Date et l'heure:24 janvier 2020(Argent) 15:34
Date et l'heure:24 janvier 2020(Argent) 15:37 ・
Date et l'heure:24 janvier 2020(Argent) 15:44 ・
Date et l'heure:24 janvier 2020(Argent) 16:03            」      -       -
Date et l'heure:24 janvier 2020(Argent) 16:13 ー ー
-Date et l'heure:24 janvier 2020(Argent) 16:14
Date et l'heure:24 janvier 2020(Argent) 16:16     -"-
Date et l'heure:24 janvier 2020(Argent) 16:39    -
-.À l'époque:24 janvier 2020(Argent) 08:50 ー ー
Date et l'heure:24 janvier 2020(Argent) 16:47      -
(Ce qui suit est omis)

Il semble que certaines «choses qui ne sont pas des dates» soient mélangées, mais il semble qu'elles fonctionnent généralement. Au fait, il n'y avait que quelques "non-dates" dans l'ensemble, donc je les ai supprimées manuellement, ce qui était un moment.

Normalisation

Si cela reste tel quel, le bruit sera terrible, alors normalisez les données. Unifiez facilement avec "une combinaison de tous les nombres de la date". Le nombre de caractères doit être fixé à 12, vous devriez donc pouvoir normaliser avec cela.

Normalisation.py


import re

for name in ["Se mettre d'accord","Opposition","homme d'affaires","Recommandation"]:
    with open(name + ".txt") as fil:
        contents = fil.read()
    match = re.findall(r'([0-9]|\n)', contents, re.MULTILINE)
    with open(name + "_Normalisation.txt","w") as fil:
        fil.write("".join(match))

Se mettre d'accord_Normalisation.txt



202001231139
202001231149
202001231150
202001231155
202001231349
202001231516
202001231531
202001231551
202001231558
202001231755
202001232023
202001231222
202001232031
202001231310
(Ce qui suit est omis)

C'est un sentiment agréable.

Dessinez un nuage de points

Enfin, dessinez un diagramme de dispersion. La période de recrutement pour le riz de pub est de ** 1/23 à 2/6 ** (n'est-ce pas court? Ceci), donc traçons la ** répartition des votes en faveur ** pendant cette période pour le moment. Trouvez la meilleure réponse dans cette question sur teratile.

Génération de graphes.py


import matplotlib.pyplot as plt
from matplotlib import dates as mdates
from datetime import datetime as dt
date = []
time = []
x = []
y = []
with open("Se mettre d'accord_Normalisation.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("Graphique.png ")

Voici le graphique de sortie [^ 1]. グラフ.png ** De toute évidence, quelque chose se passe. ** ** Comme mentionné dans les notes, ce graphique est gravé avec «mois et heure» pour les lignes verticales et «minutes» pour les lignes horizontales. Après tout, ces deux lignes clairement sombres sont probablement dues à l'affichage du riz de pub à une vitesse si élevée qu'il peut être vu en continu même par incréments de "minute". Eh bien, c'est intéressant.

finalement

C'était super bien. J'arrête parce que j'ai sommeil aujourd'hui, mais le riz de pub est toujours ouvert au public donc je pense que vous devriez y jouer si vous avez le temps.

Diverses choses auxquelles j'ai fait référence

[^ 1]: Je n'ai pas défini le libellé parce que je suis somnolent, mais pour l'expliquer, l'axe des x représente "minutes" (0-59), et l'axe des y représente "mois et jours" (1) par incréments d'une heure. Il semble représenter / 23/00 au 2/6/23).

Recommended Posts

J'ai eu la date du riz du pub de Kagawa et j'ai dessiné un graphique
Mémo d'auto-apprentissage "Deep Learning from scratch" (partie 8) J'ai dessiné le graphique du chapitre 6 avec matplotlib
Je me suis perdu dans le labyrinthe
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.
J'ai écrit une classe en Python3 et Java
Dessinez plusieurs photos de plusieurs dossiers sur un graphique
J'ai créé un graphique à barres empilées avec matplotlib de Python et ajouté une étiquette de données
J'ai comparé la vitesse de la référence du python dans la liste et la référence de l'inclusion du dictionnaire faite à partir de la liste dans.
[Python] Représentation du nombre de plaintes des compagnies d'assurance-vie dans un graphique à barres
Dessine un graphique avec Julia ... j'ai essayé une petite analyse
J'ai essayé de représenter graphiquement les packages installés en Python
Créez un graphique à l'aide du bouton et du curseur de l'intrigue
J'ai écrit python3.4 dans .envrc avec direnv et je l'ai autorisé, mais j'ai eu une erreur de syntaxe
Créez un script pour votre compétence Pepper dans une feuille de calcul et chargez SayText directement à partir du script
Je veux voir le graphique en 3D! Je peux réaliser un tel rêve.
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai un sqlite3.OperationalError
[Ajout] git est vulnérable! Je dois mettre à jour! Mais yum n'a pas la dernière version, et je l'ai obtenue à la source! Quand les notes
Enregistrez le modèle pystan et les résultats dans un fichier pickle
J'ai essayé l'algorithme de super résolution "PULSE" dans un environnement Windows
J'ai essayé de faire un classement en grattant l'équipe des membres de l'organisation
Mémo que je suis resté coincé dans l'introduction de Mezzanine
J'ai eu une erreur dans vim ou zsh dans la série Python 3.7
J'ai essayé d'illustrer le temps et le temps du langage C
[Python] J'ai installé le jeu depuis pip et j'ai essayé de jouer
J'ai essayé de programmer le test du chi carré en Python et Java.
J'ai créé une classe en Python et essayé de taper du canard
Obtenez la date et l'heure actuelles en Python, en tenant compte du décalage horaire
J'ai implémenté N-Queen dans différentes langues et mesuré la vitesse
Trouvons un graphique de la distribution de Poisson et de la distribution cumulative de Poisson en Python et Java, respectivement.
J'ai écrit un script qui divise l'image en deux
Je veux obtenir des informations de fstab à la destination de la connexion ssh et exécuter la commande
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
Je veux créer un graphique avec des lignes ondulées au milieu avec matplotlib (je veux manipuler l'impression)
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
Quand j'ai coupé le répertoire pour UNIX Socket sous / var / run avec systemd, je suis resté coincé dans un piège et que faire