Intereting Posts
Запись файлов grep за последние 30 минут Как пройти «Загрузка исходного Ramdisk» зависает после перехода с x86_64 на i686 cpu Какой процесс прослушивает порт? Установка udisks2 ejects sdcard используя чтение внутри if clause – bash Как проверить, сколько файлов было создано за одну неделю? Подробная история всех команд / действий (также в графическом интерфейсе) Что произойдет, если в каталоге есть несколько программ FUSE? Debian – Вне диапазона после установки dd и cat, сообщающие, что на устройстве не осталось места Использование Awk для поиска журнала Bro для IP-адресов / ключевых слов, найденных в текстовом файле в Интернете Можно ли хранить crontab пользователя в репозитории git пользователя в OpenBSD? не может wget rpm oracle на centos linux Заменить значение в одинарных кавычках в строке, содержащей определенное слово, используя команду sed Удалить последние символы перед разделителем

Создать собственный список слов

Я хочу создать пользовательский список (научных) слов для таких целей, как проверка орфографии и OCR, основанная на моей коллекции научных статей в формате pdf. Используя pdftotext я могу легко создать текстовый файл, содержащий нужные слова для моего научного поля. Однако файл будет загрязнен

  • слова, которые не являются специфическими для науки (и которые также содержатся в общем словаре)
  • слова, которые являются результатом неправильного преобразования, например, формул (включая слова, которые включают специальные символы и т. д.),

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

Это звучит как хороший план для вас? Существуют ли существующие инструменты для этой задачи? Как бы вы это сделали?

Чтобы выбрать слова не менее 4 символов, найденные не менее 5 раз и не найденные в / usr / share / dict / words в файлах PDF в текущем каталоге.

  find . -name '*.pdf' -exec pdftotext {} - \; | tr -cs '[:alpha:]' '[\n*]' | tr '[:upper:]' '[:lower:]' | grep -E '.{4}' | sort | uniq -c | awk '$1 > 4 {print $2}' | comm -23 - <(tr '[:upper:]' '[:lower:]' < /usr/share/dict/words|sort -u) 

Вам нужна оболочка с поддержкой замещения процесса ( ksh , zsh или bash ).

Если вы все равно будете использовать perl , вы также можете сделать все это в perl :

 find . -name '*.pdf' -exec pdftotext {} - \; | perl '-Mopen ":locale"' -nle ' s/^\S+//;s/\S+$//;y/ \t/ /s; next unless length > 40; $w{lc$_}++ for /[[:alpha:]]{4,}/g; END{open W,"</usr/share/dict/words"; while(<W>){chomp;delete $w{lc$_}}; print for grep {$w{$_}>4} keys %w}' 

Звучит как очень типичный план. Для этого я использовал бы скрипты shell. Вы не имеете дело с чрезмерно большим количеством текста, поэтому производительность должна быть адекватной, а скрипты оболочки легко писать и повторно запускать. Мой первый разрез был бы таким скриптом:

 pdf2text files | tr -cs '[A-Za-z]' '\n' | tr '[AZ]' '[az]' | awk '{ if (length > 6) {print $1;}}' | fgrep -v -f /usr/share/groff/current/eign | sort | uniq -c | awk '{print $2, $1}' | sort -nr +1 -2 | head -20 

Это даст вам 20 наиболее часто встречающихся слов, длина которых больше 6.

Вы можете добавить шаги, выполнить шаги, настроить параметры, чтобы узнать, что вы получаете.

fgrep является единственным нечетным и требует установки GNU troff . Файл / usr / share / groff / current / eign – это что-то вроде 100 наивысших частотных слов на английском языке. Флаг «-v» передает только те слова, которые не отображаются в файле «eign», поэтому он использует «eign» в качестве стоп-листа. Если вам не нравится, что GNU troff как обычные слова, вы можете сделать свой собственный и использовать этот файл на шаге fgrep .