Вступление
Мы, конечно, можем писать программы, которые могут выполнять практически все, что мы хотим, но часто в командной строке 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.txtThis Facebook app shows that she is there favorite acress in tonw$ cat sentence.txt | tr ' ' '\n'ThisFacebookappshowsthatsheistherefavoriteacressintonw$ cat sentence.txt | tr ' ' '\n' | sortFacebookThisacressappfavoriteinissheshowsthattheretonw |
Теперь мы можем использовать команду comm для сравнения файла words.txt и словаря. Он производит три столбца вывода: первый дает строки только в первом файле, второй — только строки во втором файле, а третий — общие. Итак, в первом столбце есть то, что нам нужно, потому что это слова в нашем предложении, которые не найдены в словаре. Вот команда, чтобы получить это.
|
1
2
3
4
5
6
7
|
$ comm -23 words.txt /usr/share/dict/wordsFacebookThisacressappshowstonw |
Опции -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 | headI can't believe I wrote all that last year.AcephalousFriday, 07 May 2010 |
Теперь получите одно слово в строке.
|
01
02
03
04
05
06
07
08
09
10
11
|
$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | headIcantbelieveIwroteallthatlast |
Переводчик 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 }' | headAAAABACRADDRESSADPADPNPAERAIGALAN |
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 }' | headaaaababandonedabbeyabilityableabnormalabnormalitiesaboard |
Все сводится к тому, что вам нужно из текста.
Объединение и использование словарей
Давайте проверим приведенное выше предложение, но используя как стандартный словарь, так и словарь, полученный из 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.txtacresstonw |
Та-да! Корпус MASC предоставил нам достаточно примеров других слов, которые This, Facebook, приложение и шоу больше не обнаруживаются как ошибки. Конечно, обнаружение там как ошибки намного сложнее и требует языковых моделей и многого другого.
Вывод
Научитесь использовать командную строку Unix! Этот пост — только начало многих интересных вещей, которые вы можете сделать с помощью Unix pipe. Вот некоторые другие ресурсы:
- Unix для поэтов (классический ресурс Кена Черча)
- Черновик книги «Интенсивная лингвистика данных » Криса Брю и Марка Моенса (никогда не публиковался, но имеет большой раздел по использованию Unix для языковой обработки).
- Слайды, которые я сделал по использованию Unix для подсчета слов в текстах и вычисления вероятностей языковой модели
Счастливого (Unix) взлома!
Ссылка: конвейеры Unix для базового обнаружения орфографических ошибок от нашего партнера JCG Джейсона Болдриджа в блоге Bcomposes .