Как отделить ошибочно объединенные слова в тексте OCRed? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть текст длинного документа, который был распознан кем-то другим, который содержит много случаев, когда интервал не был распознан должным образом, и два слова соединяются вместе (например: Divisionbetween, hasalready, Everyoneelse).Существует ли относительно быстрый способ использования awk, sed и т. П. Для поиска строк, которые не являются словами, и проверки возможности их разделения на допустимые слова?

Или есть какой-то другой быстрый способ их исправить?Например, я заметил, что Chrome может помечать объединенные слова как орфографические ошибки, и когда вы щелкаете правой кнопкой мыши, предложенное исправление почти всегда совпадает с тем, которое я хочу, но я не знаю быстрого способа просто исправить их все(а их тысячи).

Спасибо!

1 Ответ

1 голос
/ 09 мая 2019

Мэтт, вы, вероятно, будете создавать ошибки, пока исправляете других, пытающихся сделать это с помощью инструментов командной строки, но если у вас есть словарь слов, вы можете сделать что-то подобное, используя GNU awk для patsplit() и несколькоchar RS в случае, если любой из ваших файлов имеет окончания строки DOS:

$ cat words
bar
disco
discontent
exchange
experts
foo
is
now
of
tent
winter

$ cat file
now is the freezing winter
of ExPeRtSeXcHaNgE discontent

.

$ cat tst.awk
BEGIN {
    RS = "\r?\n"
    minSubLgth = 2
    minWordLgth = minSubLgth * 2
}
NR==FNR {
    realWords[tolower($0)]
    next
}
{
    n = patsplit($0,words,"[[:alpha:]]{"minWordLgth",}+",seps)
    printf "%s", seps[0]
    for (i=1; i<=n; i++) {
        word = words[i]
        lcword = tolower(word)
        if ( !(lcword in realWords) ) {
            found = 0
            for (j=length(lcword)-minSubLgth; j>=minSubLgth; j--) {
                head = substr(lcword,1,j)
                tail = substr(lcword,j+1)
                if ( (head in realWords) && (tail in realWords) ) {
                    found = 1
                    break
                }
            }
            word = (found ? "[[[" substr(word,1,j) " " substr(word,j+1) "]]]" : "<<<" word ">>>")
        }
        printf "%s%s", word, seps[i]
    }
    print ""
}

.

$ awk -f tst.awk words file
now is the <<<freezing>>> winter
of [[[ExPeRtS eXcHaNgE]]] discontent

для идентификации без учета регистрабуквенные строки, которых нет в списке слов, а затем итеративно создают пары подстрок из каждой из них и проверяют, находятся ли эти подстроки в "realWords []".Это будет несколько медленно и приблизительно, и будет работать только тогда, когда объединены 2 слова, а не 3 или более, но, возможно, это будет достаточно хорошо.Подумайте об алгоритме, так как он может или не может быть лучшим способом разбиения подстрок (я не особо задумывался над этим), настройте, чтобы не искать слова с количеством букв меньше (я использовал 4 выше), а неразделить на подстроки, состоящие из менее чем некоторого другого количества букв (я использовал 2 выше), и вы можете или не хотите выделять слова, которые не появляются в realWords[], но вы также не можете разбить на подстроки, которые присутствуют либо(freezing выше).

FWIW Я скачал список слов с https://github.com/dwyl/english-words/blob/master/words_alpha.txt (возможно, вы захотите поискать в Google список получше, так как этот, кажется, содержит некоторые не слова, такие как wasn и ll) и, используя версию текста в вашем вопросе с удаленными некоторыми дополнительными пробелами, вы можете увидеть некоторые вещи, которые он может поймать, некоторые не могут решить, а некоторые - неправильно:

$ cat file
I have the textof a long document that was OCRed by someoneelse that contains
a lot ofinstances where the spacingwasn't recognized properly and two words
are run together (ex: divisionbetween, hasalready, everyoneelse). Is there a
relatively quickway using awk, sed, or the like tofind strings that are not
words andcheck if they can separatedintolegitimate words?

Or is there someother quick way to fix them? Forinstance, Inotice that
Chrome is able toflag the combined words asmisspellings and when you right
click, thesuggested correction is pretty much always the oneIwant, but I
don't know a quickway to just auto-fix themall(and there are thousands).

$ awk -f tst.awk words_alpha.txt file
I have the [[[text of]]] a long document that was [[[OC Red]]] by [[[someone else]]] that contains
a lot [[[of instances]]] where the [[[spacing wasn]]]'t recognized properly and two words
are run together (ex: [[[division between]]], [[[has already]]], [[[everyone else]]]). Is there a
relatively [[[quick way]]] using awk, sed, or the like [[[to find]]] strings that are not
words [[[and check]]] if they can <<<separatedintolegitimate>>> words?

Or is there [[[some other]]] quick way to fix them? [[[For instance]]], [[[Ino tice]]] that
Chrome is able [[[to flag]]] the combined words [[[as misspellings]]] and when you right
click, [[[the suggested]]] correction is pretty much always the <<<oneIwant>>>, but I
don't know a [[[quick way]]] to just auto-fix [[[thema ll]]](and there are thousands).

FWIW, который потребовал около полсекунды для запуска на Cygwin на моем [слабом] ноутбуке.

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