Последние пару дней я думал написать что-нибудь о моем недавнем опыте использования необработанной команды bash и регулярного выражения в моем тексте. Конечно, в Интернете есть более сложные инструменты и библиотеки для обработки текста без написания такого большого количества строк кода. Например, Python имеет встроенный модуль регулярных выражений «re», который имеет множество разнообразных функций для обработки текста. «BeautifulSoup», с другой стороны, имеет хорошие встроенные функции для очистки необработанных веб-страниц. Я использую этот инструмент для более быстрой обработки больших массивов текста и когда мне лень писать коды.

В большинстве случаев я предпочитаю использовать командную строку. Я чувствую себя как дома в командной строке, особенно когда работаю с текстовыми данными. В этом руководстве я использую команды bash и регулярное выражение для обработки необработанных и беспорядочных текстовых данных. Я предполагаю, что читатели уже знакомы с командами regex и bash.

Я показываю, как команды bash, такие как «grep», «sed,», «tr,», «столбец», «sort», «uniq», «awk», могут использоваться с регулярным выражением для обработки сырых и беспорядочных текстов и последующего извлечения информации. В качестве примера я использую полное собрание сочинений Шекспира, предоставленное Project Gutenberg, который сотрудничает с World Library, Inc.

Сначала посмотрите файл

Все произведение Шекспира можно скачать по этой ссылке. Я скачал все произведение Шекспира и поместил его в текстовый файл: Shakespeare.txt. Хорошо, теперь давайте посмотрим на размер файла:

ls -lah shakes.txt
### Display:
-rw-r--r--@ 1 sabber  staff   5.6M Jun 15 09:35 shakes.txt

«Ls» - это команда bash, которая выводит список всех файлов и папок в определенном каталоге. Флаг ‘-l’ отображает типы файлов, владельца, группу, размер, дату и имя файла. Флаг ‘-a’ используется для отображения всех файлов, включая скрытые. Флаг «h» - один из моих любимых флагов, поскольку он отображает размер файла в удобочитаемом формате. Размер shakes.txt - 5,6 мегабайт.

Исследовать текст

Хорошо, теперь давайте прочитаем файл, чтобы увидеть, что в нем. Я использую команды «меньше» и «хвост» для исследования частей файла. Название команд говорит об их функциях. «Less» используется для просмотра содержимого текстового файла по одному экрану за раз. Он похож на «больше», но имеет расширенные возможности, позволяющие перемещаться по файлу как вперед, так и назад. Флаг «-N» может использоваться для определения номеров строк. Аналогичным образом «хвост» показывает последние пару строк файла.

less -N shakes.txt
### Display:
      1 <U+FEFF>
      2 Project Gutenberg’s The Complete Works of William Shakespeare, by William
      3 Shakespeare
      4
      5 This eBook is for the use of anyone anywhere in the United States and
      6 most other parts of the world at no cost and with almost no restrictions
      7 whatsoever.  You may copy it, give it away or re-use it under the terms

Похоже, что первые несколько строк - это не произведение Шекспира, а некоторая информация о проекте Гутенберга. Точно так же в конце файла есть строки, не связанные с творчеством Шекспира. Поэтому я бы удалил все ненужные строки из файла, используя команду «sed», как показано ниже:

cat shakes.txt | sed -e '149260,149689d' | sed -e '1,141d' > shakes_new.txt

Приведенные выше фрагменты кода удаляют строки с 14926 по 149689 в хвосте, а затем удаляют первые 141 строку. Нежелательные строки включают некоторую информацию о законных правах, проекте Гутенберга и содержании работы.

Базовый анализ

Теперь давайте сделаем некоторую статистику файла, используя «pipe |» и «awk».

cat shakes_new.txt | wc | awk '{print "Lines: " $1 "\tWords: " $2 "\tCharacter: " $3 }'
### Display
Lines: 149118 Words: 956209 Character: 5827807

В приведенном выше коде я сначала извлекаю весь текст файла с помощью «cat», а затем перенаправляю в «wc» для подсчета количества строк, слов и символов. Наконец, я использовал awk для отображения информации. Способ подсчета и отображения может быть выполнен множеством других способов. Не стесняйтесь изучить другие возможные варианты.

Обработка текста

Пришло время очистить текст для дальнейшего анализа. Очистка включает преобразование текста в нижний регистр, удаление всех цифр, удаление всех знаков препинания и удаление часто встречающихся слов (стоп-слов). Обработки не ограничиваются этими этапами, и это зависит от цели. Поскольку я собираюсь показать некоторые основы обработки текста, я сосредоточусь только на вышеупомянутых шагах.

Сначала я преобразовываю все символы / слова верхнего регистра в нижний регистр, а затем удаляю все цифры и знаки препинания. Для выполнения обработки я использую команду bash «tr», которая переводит или удаляет символы из текстового документа.

cat shakes_new.txt | tr 'A-Z' 'a-z' | tr -d [:punct:] |  tr -d [:digit:] > shakes_new_cleaned.txt

Приведенный выше фрагмент кода сначала преобразует весь текст в нижний регистр, а затем удаляет все знаки препинания и цифры. Результаты приведенных выше кодов:

### Display before:
      1 From fairest creatures we desire increase,
      2 That thereby beauty’s rose might never die,
      3 But as the riper should by time decease,
      4 His tender heir might bear his memory:
      5 But thou contracted to thine own bright eyes,
      6 Feed’st thy light’s flame with self-substantial fuel,
      7 Making a famine where abundance lies,
      8 Thy self thy foe, to thy sweet self too cruel:
      9 Thou that art now the world’s fresh ornament,
     10 And only herald to the gaudy spring,
     11 Within thine own bud buriest thy content,
     12 And, tender churl, mak’st waste in niggarding:
     13   Pity the world, or else this glutton be,
     14   To eat the world’s due, by the grave and thee.

### Display after:
      1 from fairest creatures we desire increase
      2 that thereby beautys rose might never die
      3 but as the riper should by time decease
      4 his tender heir might bear his memory
      5 but thou contracted to thine own bright eyes
      6 feedst thy lights flame with selfsubstantial fuel
      7 making a famine where abundance lies
      8 thy self thy foe to thy sweet self too cruel
      9 thou that art now the worlds fresh ornament
     10 and only herald to the gaudy spring
     11 within thine own bud buriest thy content
     12 and tender churl makst waste in niggarding
     13   pity the world or else this glutton be
     14   to eat the worlds due by the grave and thee

Токенизация - это одна из основных предварительных обработок при обработке естественного языка. Токенизация может выполняться как на уровне слова, так и предложения. В этом руководстве я покажу, как токенизировать файл. В приведенном ниже коде я сначала извлекаю очищенный текст с помощью «cat», затем использую «tr» и два его флага: «s» и «c», чтобы преобразовать каждое слово в строки.

cat shakes_new_cleaned.txt | tr -sc ‘a-z’ ‘\12’ > shakes_tokenized.txt
### Display (First 10 words)
      1 from
      2 fairest
      3 creatures
      4 we
      5 desire
      6 increase
      7 that
      8 thereby
      9 beautys
     10 rose

Теперь, когда у нас есть токенизированные слова, мы можем ответить на вопрос, например, какое слово является наиболее / наименее частым во всем произведении Шекспира? Для этого я сначала использую команду «sort» для сортировки всех слов, затем я использую команду «uniq» с флагом «-c», чтобы узнать частоту каждого слова. «Uniq -c» - это то же самое, что «groupby» в Pandas или SQL. Наконец, отсортируйте слова по их частоте в возрастающем (наименее частое) или убывающем (наиболее частое) порядке.

cat shakes_tokenized.txt | sort | uniq -c | sort -nr > shakes_sorted_desc.txt
### Display
29768 the   28276 and  21868 i   20805 to  18650 of  15933 a      14363 you   13191 my   11966 in  11760 that
cat shakes_tokenized.txt | sort | uniq -c | sort -n > shakes_sorted_asc.txt
### Display
1 aarons       1 abandoner    1 abatements     1 abatfowling          1 abbominable  1 abaissiez    1 abashd         1 abates              1 abbeys       1 abbots

Приведенные выше результаты позволяют сделать некоторые интересные наблюдения. Например, десять наиболее часто встречающихся слов - это местоимения, предлоги или союзы. Если мы хотим получить более абстрактную информацию о произведении, мы должны удалить все стоп-слова (предлоги, местоимения, союзы, модальные глаголы и т. Д.). Также это зависит от назначения объекта. Могут быть интересны только предлоги. В этом случае можно оставить все предлоги. С другой стороны, наименее частые слова - это отказ, смягчение, смущение.

Удаление стоп-слов

На следующем этапе я покажу использование awk для удаления всех стоп-слов в командной строке. В этом уроке я использовал Список английских игнорируемых слов NLTK. Я также добавил в список еще пару слов. Подробности следующих кодов можно найти в ответах this StackOverflow. Подробную информацию о различных параметрах awk можно также найти в руководстве по awk (man awk в командной строке).

awk ‘FNR==NR{for(i=1;i<=NF;i++)w[$i];next}(!($1 in w))’ stop_words.txt shakes_tokenized.txt > shakes_stopwords_removed.txt

Хорошо, после удаления стоп-слов давайте отсортируем слова в порядке возрастания и убывания, как указано выше.

cat shakes_stopwords_removed.txt | sort | uniq -c | sort -nr > shakes_sorted_desc.txt
### Display most frequent
3159 lord   2959 good  2924 king  2900 sir
2634 come   2612 well  2479 would 2266 love
2231 let    2188 enter
cat shakes_stopwords_removed.txt | sort | uniq -c | sort -n > shakes_sorted_asc.txt
### Display least frquent
1 aarons       1 abandoner    1 abatements     1 abatfowling          1 abbominable  1 abaissiez    1 abashd         1 abates              1 abbeys       1 abbots

Мы видим, что чаще всего Шекспир употребляет слово «Господь», за которым следует «добрый». Слово «Любовь» также входит в число самых частых слов. Наименее частые слова остаются прежними. Студент, изучающий лингвист или литературу, может интерпретировать информацию или лучше понять эту простую аналитику.

Давай обсудим

Поскольку мы закончили с необходимой обработкой и очисткой, в следующем уроке я расскажу, как выполнять расширенную аналитику. А до тех пор, если у вас есть какие-либо вопросы, не стесняйтесь их задавать. Пожалуйста, комментируйте, если вы видите опечатки, ошибки или у вас есть предложения получше. Вы можете связаться со мной:

Email: [email protected]
LinkedIn: https://www.linkedin.com/in/sabber-ahamed/
Github: https://github.com/msahamed
Medium: https://medium.com/@sabber/