Как исправить неправильные json, содержащие лишние кавычки при возврате с помощью ocr engine? - PullRequest
0 голосов
/ 01 апреля 2020

Наш механизм ocr возвращает результаты в виде json данных: {"WordText":"\"*EET","Left":88.0,"Top":153.0,"Height":7.0,"Width":21.0}

Обратите внимание, что значение для «WordText» содержит двойную кавычку после обратного знака sh. Когда я обрабатываю это с json .dumps, появляется ошибка «Ожидается разделитель». Механизм OCR создает большое количество ошибок такого типа, когда в тексте встречается двойная кавычка. Кажется, что нет никакого способа изменить вывод OCR, поэтому мне нужно написать код постобработки для исправления этих ошибок.

Я был бы рад исключить любые двойные кавычки, которые не идут сразу после двоеточие, или перед запятой, но понятия не имею, как это сделать эффективно в python или регулярных выражениях.

У кого-нибудь есть предложение или инструмент, который устранит этот тип проблемы json?

1 Ответ

0 голосов
/ 01 апреля 2020

Помогает ли это для дополнительного экранирования ...

Дамп к JSON добавляет дополнительные двойные кавычки и экранирование кавычек

Это не может быть идеально (я чувствую, что это довольно грубо с использованием двух шаблонов регулярных выражений), но для данного JSON из ...

{"WordText":"\"*EET", "Left":88.0,"Top":153.0,"Height":7.0,"Width":21.0},
{"WordText":""4512","Left":1.0,"Top":94.0,"Height":7.0,"Width":24.0},
{"WordText":"IV"L","Left":98.0,"Top":135.0,"Height":6.0,"Width":13.0}

Этот код ...

import pandas as pd
import re

pattern1 = re.compile(r'(?i)(\"\"|\"\\\")') # replace with: "
pattern2 = re.compile(r'(?i)(\w)(\")(\w)') # replace with: \1\3

data = '''
[{"WordText":"\"*EET", "Left":88.0,"Top":153.0,"Height":7.0,"Width":21.0},
{"WordText":""4512","Left":1.0,"Top":94.0,"Height":7.0,"Width":24.0},
{"WordText":"IV"L","Left":98.0,"Top":135.0,"Height":6.0,"Width":13.0}]
'''

data = pattern1.sub(r'"', data)
data = pattern2.sub(r'\1\3', data)

#load it into a pandas dataframe just to prove it is valid
df = pd.read_json(data)

print(df)

Выходы .. .

  WordText  Left  Top  Height  Width
0     *EET    88  153       7     21
1     4512     1   94       7     24
2      IVL    98  135       6     13

Может быть, посмотрите на эту дополнительную экранирующую ссылку в начале ответа и посмотрите, есть ли там проблема. Это также может быть полезно ...

как удалить заднюю sla sh из JSON файла

**

ОБНОВЛЕНИЕ :

**

Вот новый код с примером поврежденного JSON, исправляемого двумя шаблонами регулярных выражений. У меня нет вашего JSON, но он показывает, что регулярное выражение должно помочь в коррупции, описанной до сих пор. Я прокомментировал код, чтобы помочь объяснить это

Код:

import pandas as pd
import re

# compile a pattern to match "\"text" OR ""text" which needs replacing with a single doublequote
pattern1 = re.compile(r'(?i)(\"\"|\"\\\")')

# compile a second pattern to match "te"xt" which needs to be replacing with nothing/blank/just remove
pattern2 = re.compile(r'(?i)\b(\")\b')

# if this was the input (good_data) it would work without any clean up
good_data = '''
{"Sub_ID":["1","2","3","4","5","6","7","8" ],
        "Name":["Erik", "Daniel", "Michael", "Sven",
                "Gary", "Carol","Lisa", "Elisabeth" ],
        "Salary":["723.3", "515.2", "621", "731", 
                  "844.15","558", "642.8", "732.5" ],
        "StartDate":[ "1/1/2011", "7/23/2013", "12/15/2011",
                     "6/11/2013", "3/27/2011","5/21/2012", 
                     "7/30/2013", "6/17/2014"],
        "Department":[ "IT", "Management", "IT", "HR", 
                      "Finance", "IT", "Management", "IT"],
        "Sex":[ "M", "M", "M", 
              "M", "M", "F", "F", "F"]}
'''

# copied good_data and corrupted it with "\"Erik", ""Gary", and "Mana"gement"
bad_data = '''
{"Sub_ID":["1","2","3","4","5","6","7","8" ],
        "Name":["\"Erik", "Daniel", "Michael", "Sven",
                ""Gary", "Carol","Lisa", "Elisabeth" ],
        "Salary":["723.3", "515.2", "621", "731", 
                  "844.15","558", "642.8", "732.5" ],
        "StartDate":[ "1/1/2011", "7/23/2013", "12/15/2011",
                     "6/11/2013", "3/27/2011","5/21/2012", 
                     "7/30/2013", "6/17/2014"],
        "Department":[ "IT", "Management", "IT", "HR", 
                      "Finance", "IT", "Mana"gement", "IT"],
        "Sex":[ "M", "M", "M", 
              "M", "M", "F", "F", "F"]}
'''

# run the bad_data through the find and replace for the two patterns
# first one finds such mistakes as "\"text" OR ""text" and replaces with a single doublequote
bad_data = pattern1.sub(r'"', bad_data)

# second pattern finds a doublequote on its own in the middle of a word like "te"xt" and removes it
bad_data = pattern2.sub(r'', bad_data)

# read the fixed bad_data into a pandas dataframe to check it's valid
df = pd.read_json(bad_data)

# print out the df
print(df)

Выходы:

   Sub_ID       Name  Salary   StartDate  Department Sex
0       1       Erik  723.30    1/1/2011          IT   M
1       2     Daniel  515.20   7/23/2013  Management   M
2       3    Michael  621.00  12/15/2011          IT   M
3       4       Sven  731.00   6/11/2013          HR   M
4       5       Gary  844.15   3/27/2011     Finance   M
5       6      Carol  558.00   5/21/2012          IT   F
6       7       Lisa  642.80   7/30/2013  Management   F
7       8  Elisabeth  732.50   6/17/2014          IT   F

Если вы закомментируете регулярное выражение, заменяет строки ...

bad_data = pattern1.sub(r'"', bad_data)
bad_data = pattern2.sub(r'', bad_data)

... и получите pandas для чтения JSON ошибок с ...

ValueError: Unexpected character found when decoding array value (2)

... что ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...