1

大きなテキスト ファイルを解析するコードを作成しようとしています。ただし、上記のテキスト ファイルを取得するために、元の PDF ファイルを pdfminer で実行します。これは機能しますが、多くのランダムなスペースを含むテキスト ファイルも返します (以下を参照)。

SM ITH ,  JO HN , PHD
1234 S  N O RT H  AV E

単語が区切られないように、Python で特定のスペースのみを削除する簡単な方法はありますか? 上記のサンプルの場合、次のようにしたい

SMITH, JOHN, PHD
1234 S NORTH AVE

ありがとう。

4

2 に答える 2

3

ほとんどの場合、あなたがやろうとしていることを完全に行うことは不可能であり、あなたを満足させるのに十分なほどうまく行うことは非常に困難です. 以下に説明します。

しかし、そもそもそうすべきではない可能性が十分にあります。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、コンマの後のスペースはランダムな余分なスペースではなく、2 つ以上のスペースとして表示されないからです。「1234 S」のスペースも同様です。そして、おそらく、実際のデータの他の多くのケースでも同じことが当てはまります。

別のやや厳密なルールは、文字間の単一のスペースのみを削除することです。繰り返しますが、それが機能する場合、コーディングは簡単です。例えば:

s = re.sub(r'(\w)\s(\w)', r'\1\2', s)

    s = re.sub(r'\s+', r' ', s)

しかし、これでコンマの前にスペースが残り、SMITHJOHN.

英語の句読点について少し情報を入力する必要があるかもしれません — 句読点の周りのスペースを取り除き、コンマやピリオドの後ろ、引用符の周りなどにスペースを追加します.

または… まあ、データがどのように見えるかを知り、それを理解できるのはあなただけです。


適切なルールを思いつくことができない場合、唯一のオプションは、辞書で可能な単語を調べて、どちらがより可能性が高いかを推測することに関する複雑なヒューリスティックを構築することです。 「B OO KM AR K」が「BOOK MARK」なのか「BOOKMARK」なのかわかりますか?) でも、それが最善の方法です。

于 2013-10-04T00:36:59.083 に答える