Скорее всего, то, что вы пытаетесь сделать, невозможно сделать отлично, и очень сложно сделать достаточно хорошо, чтобы удовлетворить вас. Я объясню ниже.
Но есть хороший шанс, что вы не должны это делать в первую очередь. pdfminer
очень настраивается, и что-то вроде просто указания меньшего значения -M
даст вам текст, который вы хотели в первую очередь. Вам нужно сделать несколько проб и ошибок, но если это сработает, это будет намного легче, чем пытаться послепродавать вещи после факта.
Если вы хотите сделать это, вам нужно придумать правило, которое определяет, какие пространства являются «случайными лишними пробелами» и которые являются вещественными пространствами, прежде чем код, который в Python. И я не знаю, что существует такое правило.
В вашем примере вы можете обрабатывать наиболее из них, просто превратив несколько пространств в одиночные пробелы и одиночные пробелы в ничто. Должно быть очевидно, как это сделать. Даже если вы не можете думать умного решения, тройная замена будет работать нормально:
s = re.sub(r'\s\s+', r'<space>', s)
s = re.sub(r'\s', r'', s)
s = re.sub(r'<space>', r' ', s)
Однако это правило не совсем верно, потому что в JO HN , PHD
, пробел после запятой не является случайной экстра пространство, но оно не отображается как два или более пробелов. И то же самое для пространства в «1234 S». И, скорее всего, то же самое верно и во многих других случаях для ваших реальных данных.
Другое несколько близкое правило заключается в том, что вы удаляете только пробелы между буквами. Опять же, если это работает, его легко закодировать. Например:
s = re.sub(r'(\w)\s(\w)', r'\1\2', s)
s = re.sub (г '\ s +', г»», s)
Но теперь оставляет пробел перед запятой после SMITH
и JOHN
.
Может быть, вам нужно положить в немного информации об английской пунктуации-полоске пространство вокруг знаков препинания, а затем добавить обратно в пространствах после запятой или точки, вокруг цитаты и т.д.
Или ... ну, никто, кроме вы можете узнать, как выглядят ваши данные и понять это.
Если вы не можете придумать хорошее правило, единственный вариантом является созданием некоторых сложными эвристическими вокруг глядя возможными слов в словаре и гадать, какой из них является более вероятным, который до сих пор не получит все правильно (например, откуда вы узнаете, является ли «B OO KM AR K» «КНИЖНОЙ МАРК» или «БУКМАРК»?), но это лучшее, что вы могли бы сделать.
Какое правило вы указываете, что вы оставляете пробел между 'S' и' N', но удаляете одно из 'N' и' O'? – abarnert
Нет, потому что для того, чтобы алгоритм определил, какие пробелы удалить, чтобы создать «слова», ему нужно было бы понять эти слова. Является ли PDF образным, а не глифным? –