2016-07-23 9 views
0

Текст горного выпуска: от названий разделов, подписи к рисункам и в других местах, во многих PDF файлов я получаю предложений типа:Perl регулярное выражение, чтобы удалить пространство из OCR текста, импортированного из pdftotext

"T h e n as data we give the t r a j e c t o r i e s o f the particles between ..." 

Я предполагаю, что это OCR вопрос с pdftotext.

Я могу удалить пробелы в gappy-тексте только с помощью последовательности цепочек регулярных выражений, которая сначала увеличивает пробелы, но это зависит от границ слов в оригинальном тексте OCR, находящемся на расстоянии от двойного расстояния. например, вот простой пример:

$ perl -e '$t="The \ \ \ \ t h i n g w r o n g h e r e is we have a gap s."; print "$t\n"; 
$t=~s/(\s{2,})/$1 /g; print "$t\n"; 
$t=~s/(\w)\s?/$1/g;  print "$t\n"; 
$t=~s/\s+/ /g;   print "$t\n";' 

The  t h i n g w r o n g  h e r e is we have a gap s. 
The   t h i n g  w r o n g  h e r e  is we have  a gap s. 
The   t h i n g  w r o n g  h e r e  is we have  a gap  s. 
The   thing wrong here is we have  a gap  s. 
The thing wrong here is we have a gap s. 

период окончания срока действия «пробел». преднамеренно, он не должен закрываться.

Вопрос 1. Есть ли более элегантный набор регулярных выражений для этого?

Вопрос 2. Какую черту можно сделать только с однократным удалением текста OCR? Я предполагаю, что можно просто решить это, как правило, для очистки текста формы: «В качестве данных мы приводим траектории частиц между ...» , когда границы слов не понятны с использованием какого-либо сверхмощного модуля, который ищет словарь слова в строке с единственными буквами. Есть ли такой модуль? (Я искал, но пока не нашел его.)

+0

Вы пытаетесь манипулировать естественным языком с помощью регулярных выражений. Трудно, в лучшем случае, и в пространстве, в котором вы работаете, вероятно невозможно. Соблюдайте осторожность, здесь есть драконы ... –

+0

http://stackoverflow.com/questions/1136990/how-can-i-extract-text-from-a-pdf-file-in-perl – xxfelixxx

+0

http: // search.cpan.org/~cdolan/CAM-PDF-1.60/bin/getpdftext.pl – xxfelixxx

ответ

0

Для первой проблемы (с большим количеством пробелов) вы можете легко решить ее с помощью s/\s+/ /g. Что касается второй проблемы, я не уверен, есть ли такая библиотека.

0

Ответ 1:

  • Любой на основе Regex решение не даст вам хорошее решение для одной проблемы пространства.

Ответ 2:

  • По вопросу, как, - "T курица в качестве данных мы даем trajectoriesof частицы между"

  • Сначала вы можете удалить все пробелы из предложения и затем используйте - Word Segmentation Solution от Norvig.

Пример:

from __future__ import division 
from collections import Counter 
import re, nltk 

WORDS = nltk.corpus.abc.words() 
COUNTS = Counter(WORDS) 

def pdist(counter): 
    "Make a probability distribution, given evidence from a Counter." 
    N = sum(counter.values()) 
    return lambda x: counter[x]/N 

P = pdist(COUNTS) 

def Pwords(words): 
    "Probability of words, assuming each word is independent of others." 
    return product(P(w) for w in words) 

def product(nums): 
    "Multiply the numbers together. (Like `sum`, but with multiplication.)" 
    result = 1 
    for x in nums: 
     result *= x 
    return result 

def memo(f): 
    "Memoize function f, whose args must all be hashable." 
    cache = {} 
    def fmemo(*args): 
     if args not in cache: 
      cache[args] = f(*args) 
     return cache[args] 
    fmemo.cache = cache 
    return fmemo 

def splits(text, start=0, L=20): 
    "Return a list of all (first, rest) pairs; start <= len(first) <= L." 
    return [(text[:i], text[i:]) 
      for i in range(start, min(len(text), L)+1)] 

@memo 
def segment(text): 
    "Return a list of words that is the most probable segmentation of text." 
    if not text: 
     return [] 
    else: 
     candidates = ([first] + segment(rest) 
         for (first, rest) in splits(text, 1)) 
     return max(candidates, key=Pwords) 

text = "T h e n as data we give the t r a j e c t o r i e s o f the particles between" 
text = text.replace(" ", "") 
print segment(text) 
# ['Then', 'as', 'data', 'we', 'give', 'the', 'trajectories', 'of', 'the', 'particles', 'between'] 

=> Лучшее решение будет найти, почему вы получаете пробелы в pdftotext модуля. Если в pdftotext есть проблема, которую вы не можете решить, попробуйте изучить другие библиотеки для OCR.