[PYTHON] IQ Bot: adresse au problème où OCR lit / (barre oblique) dans la date comme 1.

IQ Bot vous donne la liberté de choisir le moteur OCR à traiter.

Les fonctionnalités et habitudes du moteur OCR sélectionnables sont résumées dans cet article, mais en fonction du moteur, la date au format "AAAA / MM / JJ" Dans certains cas, le "/" (barre oblique) dans était lu comme "1".

Exemple: ce qui est écrit comme 2020/11/11 est lu comme 2020111111, etc.

Bien sûr, dans un tel cas, il est courant de spécifier le type de date et d'effectuer la Détection d'erreur, mais personnalisé Il est plus efficace d'utiliser la logique pour corriger la forme dans une certaine mesure, puis d'appliquer la détection d'erreur.

C'est pourquoi je publierai la logique personnalisée que j'ai créée pour le numéro du titre.

Si je le divisais en différents cas, le nombre de lignes serait assez grand. Si vous proposez un moyen plus simple, veuillez commenter.

Logique personnalisée pouvant être utilisée si vous lisez la barre oblique de date comme 1

Renvoie la barre oblique de la date qui a été lue comme 1 à la barre oblique



#Une fonction qui remplace le caractère par une barre oblique s'il y a un 1 à la position où la barre oblique doit être
def slashConvert(x,index):
    if x[index] == "1":
        x = x[:index] + "/" + x[index + 1:]
    return x

#Une fonction qui identifie la position où la barre oblique doit entrer et applique la conversion
# x =Valeur d'origine, y=Nombre de chiffres dans l'année(YYYY/MM/4 pour DD,YY/MM/2 pour DD)donner
def date1toSlash(x,y):
    
    #S'il contient déjà deux ou plusieurs barres obliques, retournez tel quel
    if "/" in x:
        if len(x.split("/")) >= 3:
            return x
    
    #Minimum après le numéro de l'année/M/Il devrait y avoir 4 caractères ou plus en D
    #Si cela ne répond pas à cela, revenez tel quel(=Détecté par vérification)
    if len(x) < y + 4:
        return x
    
    #Mettez une barre oblique entre l'année et le mois
    x = slashConvert(x,y)
    
    #Demandez dans quel chiffre se trouve la barre oblique pour placer la barre oblique entre le mois et le jour
    #S'il est inconnu, retournez → tel quel, une valeur incomplète sera renvoyée comme date, afin qu'elle puisse être détectée par vérification côté IQ Bot.
    if len(x) == y + 6:        #6 chiffres autres que l'année= /MM/DD =2 chiffres pour le mois et le jour=Le troisième chiffre de la queue est une barre oblique
        mdIndex = -3
    elif len(x) == y + 5:      #5 chiffres autres que l'année= /M/DD or /MM/D ← Il faut en identifier un
        if 2 <= int(x[y+1]) <= 9:      #Février-septembre si le prochain chiffre de l'année est 2-9=Puisqu'il s'agit d'un mois à un chiffre, M/DD =Le troisième chiffre de la queue est une barre oblique
            mdIndex = -3
        elif x[y+1] == "0":            #Le chiffre suivant de l'année est zéro= MM/RÉ? Mais il est suspect que seul le mois soit rempli de zéro, alors revenez tel quel
            return x
        elif x[-3:-1] == "11":         #Le 3ème chiffre de la queue et le 2ème chiffre de la queue sont "11" (c'est-à-dire que les 4 derniers chiffres sont?11?)dans le cas de
            if x[-4:] == "1110":       #1 pour 1110/Il est décidé d'être 10, mais ...
                mdIndex = -3
            else:                      #Autre que ce qui précède (1111 etc.) 1/Est-ce 11?/Je ne peux pas juger si c'est 1, alors je reviens juste
                return x
        elif (x[-3] == "1") and (x[-2] != "1"):   #1 si la partie date est 1120/Déterminé à 20
            mdIndex = -3
        elif (x[-2] == "1") and (x[-3] != "1"):   #12 si la partie date est 1211/Déterminé à 1
            mdIndex = -2
        else:                  #Aucun modèle autre que celui ci-dessus n'est attendu
            return x
    else:                      #Un modèle à 4 chiffres autre que l'année qui vient à l'autre= /M/Puisqu'il s'agit d'un D, le deuxième chiffre à partir du bas est une barre oblique
        mdIndex = -2
        
    x = slashConvert(x,mdIndex)
    
    return x

#Lors de l'application aux éléments de champ et le nombre de chiffres dans l'année est de 4
field_value = date1toSlash(field_value,4)

#Lors de l'application aux éléments de tableau et le nombre de chiffres dans l'année est de 2 chiffres
df['Nom de colonne'] = df['Nom de colonne'].apply(date1toSlash,y=2)

Le code à appliquer au tableau ci-dessus est supposé être pris en sandwich entre Magic Code.

Recommended Posts

IQ Bot: adresse au problème où OCR lit / (barre oblique) dans la date comme 1.