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.
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. Eh bien, quand je les mets côte à côte comme ça, je sens que j'ai du riz de pub dans la main.
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 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.
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
À 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.
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.
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]. ** 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.
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.
[^ 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).