Статьи

Unix-конвейеры для базового обнаружения орфографических ошибок

Вступление

Мы, конечно, можем писать программы, которые могут выполнять практически все, что мы хотим, но часто в командной строке Unix есть все, что нужно для выполнения ряда полезных операций без написания строки кода. Сегодня в моем классе Applied NLP я показываю, как можно получить высоконадежный словарь из основного текста с помощью ряда каналов Unix, и я публикую это здесь, чтобы студенты могли вернуться к нему позже и увидеть некоторые указатели на другие полезные ресурсы Unix.

Примечание. Для получения справки по любой из команд просто введите «man <command>» в командной строке Unix.

Проверка на орфографические ошибки

Мы работаем над автоматической коррекцией орфографии как упражнение в классе, с особым акцентом на следующее предложение: Это приложение Facebook показывает, что она там любимый адрес в TONW. Итак, это имеет контекстную ошибку правописания ( там ), ошибка, которая может быть допустимым английским словом, но не ( acress ) и ошибкой, которая нарушает английские звуковые паттерны ( tonw ).

Одним из ключевых компонентов для исправления орфографии является словарь слов, которые, как известно, действительны в языке. Давайте предположим, что мы работаем с английским здесь. В большинстве систем Unix вы можете подобрать словарь английского языка в / usr / share / dict / words , хотя найденные вами слова могут различаться в зависимости от платформы. Если вы ничего не можете найти там, есть много списков слов, доступных в Интернете, например, ознакомьтесь с проектом Wordlist для загрузок и ссылок. Мы можем легко использовать словарь и Unix для проверки слов в приведенном выше предложении, которые не встречаются в словаре. Сначала сохраните предложение в файл.

1
$ echo 'This Facebook app shows that she is there favorite acress in tonw' > sentence.txt

Далее необходимо получить уникальные типы слов (а не токенов) отсортированного лексикографического порядка. Следующий конвейер Unix выполняет это.

1
$ cat sentence.txt | tr ' ' '\n' | sort | uniq > words.txt

Чтобы сломать это:

  • Команда cat выводит файл на стандартный вывод.
  • Команда tr «переводит» все пробелы в новые строки. Итак, это дает нам одно слово в строке.
  • Команда sort сортирует строки лексикографически.
  • Команда uniq делает эти строки уникальными, удаляя соседние дубликаты. (Это ничего не делает для этого конкретного предложения, но я добавлю его туда, если вы попробуете другие предложения, например, с несколькими токенами типа «the».)

Вы можете увидеть эти эффекты, выполняя каждый из них, постепенно наращивая конвейер.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ cat sentence.txt
This Facebook app shows that she is there favorite acress in tonw
$ cat sentence.txt | tr ' ' '\n'
This
Facebook
app
shows
that
she
is
there
favorite
acress
in
tonw
$ cat sentence.txt | tr ' ' '\n' | sort
Facebook
This
acress
app
favorite
in
is
she
shows
that
there
tonw

Теперь мы можем использовать команду comm для сравнения файла words.txt и словаря. Он производит три столбца вывода: первый дает строки только в первом файле, второй — только строки во втором файле, а третий — общие. Итак, в первом столбце есть то, что нам нужно, потому что это слова в нашем предложении, которые не найдены в словаре. Вот команда, чтобы получить это.

1
2
3
4
5
6
7
$ comm -23 words.txt /usr/share/dict/words
Facebook
This
acress
app
shows
tonw

Опции -23 указывают, что мы должны подавить столбцы 2 и 3 и показывать только столбец 1. Если мы просто используем -2 , мы получаем слова в предложении с не-словарными словами слева и словарными словами справа (попробуйте Это).

Проблема, конечно, в том, что в любом списке слов будут пробелы. Этот словарь не имеет более новых терминов, таких как Facebook и приложение . У этого также нет заглавной Это. Вы можете игнорировать регистр с помощью опции -i, и это исчезнет. У него нет показов, чего нет в словаре, так как это форма перегиба глагола. Мы могли бы исправить это с помощью некоторого морфологического анализа, но вместо этого давайте пойдем ленивым путем и просто возьмем больший список слов.

Извлечение высоконадежного словаря из корпуса

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

Во-первых, давайте получим некоторые данные. Open American National Corpus только что выпустил v3.0.0 своего Аннотируемого субкорпуса (MASC), который вы можете получить по этой ссылке.

http://www.anc.org/masc/MASC-3.0.0.tgz

Чтобы получить его и настроить для дальнейшей обработки, сделайте следующее:

1
2
3
4
$ mkdir masc
$ cd masc
$ wget http://www.anc.org/masc/MASC-3.0.0.tgz
$ tar xzf MASC-3.0.0.tgz

(Если у вас нет wget , вы можете просто скачать файл MASC в браузере, а затем переместить его.)

Далее мы хотим получить весь текст из каталога data / writing . Команда find очень удобна для этого.

1
$ find data/written -name '*.txt' -exec cat {} \; > all-written.txt

Чтобы увидеть, сколько там, используйте команду wc .

1
2
$ wc all-written.txt
   43061  400169 2557685 all-written.txt

Итак, есть 43 тыс. Строк и 400 тыс. Токенов. Это немного мало для того, что мы пытаемся сделать, но этого будет достаточно для примера.

Опять же, я создам конвейер Unix для извлечения типов слов с высокой достоверностью из этого корпуса. Я буду использовать команду head, чтобы показать только часть вывода на каждом этапе.

Вот сырье.

1
2
3
4
5
6
$ cat all-written.txt | head
 
I can't believe I wrote all that last year.
Acephalous
 
Friday, 07 May 2010

Теперь получите одно слово в строке.

01
02
03
04
05
06
07
08
09
10
11
$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | head
 
I
can
t
believe
I
wrote
all
that
last

Переводчик tr используется очень грубо: в основном все, что не является буквенным символом ASCII, превращается в новую строку. Опции -cs указывают на то, что они принимают дополнение (противоположное) аргумента ‘A-Za-z’ и сжимают дубликаты (например, A42 становится A с одной новой строкой, а не с тремя).

Далее мы сортируем и uniq , как указано выше, за исключением того, что мы используем опцию -c для uniq, чтобы она производила подсчет.

01
02
03
04
05
06
07
08
09
10
11
$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | sort | uniq -c | head
   1
 737 A
  22 AA
   1 AAA
   1 AAF
   1 AAPs
  21 AB
   3 ABC
   1 ABDULWAHAB
   1 ABLE

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

01
02
03
04
05
06
07
08
09
10
11
$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | sort | uniq -c | awk '{ if($1>4) print $2 }' | head
A
AA
AB
ACR
ADDRESS
ADP
ADPNP
AER
AIG
ALAN

Awk упрощает обработку строк файлов и предоставляет индексы для первого столбца ($ 1), второго ($ 2) и т. Д. Вы можете сделать гораздо больше, но это показывает, как вы можете условно выводить некоторую информацию из каждой строки, используя awk.

Конечно, вы можете изменить порог. Вы также можете перевести все слова в нижний регистр, вставив еще один вызов tr в канал, например:

01
02
03
04
05
06
07
08
09
10
11
$ cat all-written.txt | tr 'A-Z' 'a-z' | tr -cs 'a-z' '\n' | sort | uniq -c | awk '{ if($1>8) print $2 }' | head
a
aa
ab
abandoned
abbey
ability
able
abnormal
abnormalities
aboard

Все сводится к тому, что вам нужно из текста.

Объединение и использование словарей

Давайте проверим приведенное выше предложение, но используя как стандартный словарь, так и словарь, полученный из MASC. Сначала выполните следующую команду.

1
$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | sort | uniq -c | awk '{ if($1>4) print $2 }' > /tmp/masc_vocab.txt

Затем в каталоге, где вы сохранили word.txt , выполните следующие действия.

1
2
3
4
$ cat /usr/share/dict/words /tmp/masc_vocab.txt | sort | uniq > big_vocab.txt
$ comm -23 words.txt big_vocab.txt
acress
tonw

Та-да! Корпус MASC предоставил нам достаточно примеров других слов, которые This, Facebook, приложение и шоу больше не обнаруживаются как ошибки. Конечно, обнаружение там как ошибки намного сложнее и требует языковых моделей и многого другого.

Вывод

Научитесь использовать командную строку Unix! Этот пост — только начало многих интересных вещей, которые вы можете сделать с помощью Unix pipe. Вот некоторые другие ресурсы:

Счастливого (Unix) взлома!

Ссылка: конвейеры Unix для базового обнаружения орфографических ошибок от нашего партнера JCG Джейсона Болдриджа в блоге Bcomposes .