Генерация индексов для проекта lindocs.

Может кому покажется интересным.
В качестве индексов в базе данных ссылок в проект lindocs планируется
использовать простые английские слова, аббревиатуры, общепринятые
сокращения. Поэтому, скорее всего, у составителей может возникнуть
проблема с слишком творческим подходом к этому вопросу.
Одним из способов предотвратить это - заранее создать достаточно большую
коллекцию индексных слов. Например, ее можно извлечь из статей
опубликованных на сайте www.opennet.ru, т.к. там материалы уже
проиндексированы (индексы прямо указаны после ключевого слова
"Keywords:" для txt-вариантов статей).
Эти материалы у меня уже скачаны, тогда, объединив сортированную и
несортированную части проекта lindocs, можно написать несложный конвейер
для командной строки. Этот конвейер не только извлекает индексы, но и
выводит некоторую статистику частоты используемых ключевых слов.
$ for i in `find . -name "*.txt"`; do head -n 1 $i; done | \
awk '{ for(i=2;i<=NF;i++) { print $i } }' | \
sort | uniq -c | \
sed 's/^ \{1,\}//g' | \
awk '{ print substr("000",1,3-length($1))$1" "$2 }' | \
sort
Результаты будут примерно такими:
028 php
029 auth
029 database
029 install
029 patch
030 web
032 apache
032 win
034 mysql
044 perl
066 mail
100 freebsd
144 linux
В дальнейшем результаты конвейера можно будет легко вставить в SQLite
базу данных.
Генерация индексов для проекта lindocs. Часть 2
Продолжим сбор статистики по материалам с www.opennet.ru. Напомню, что в
этих материалах упоминаются ключевые слова, указывающие к каким темам
можно отнести тот или иной материал. Данные ключевые слова можно будет
использовать как индексы для проекта lindocs.
Также в данном материале я постараюсь рассмотреть некоторые аспекты
программирования на Shell и Python.
1. Найдем все txt-файлы в текущем каталоге и выведем строчку каждого
файла.
$ find . -name "*.txt" -exec head -n 1 '{}' ';'
2. После выполнения первой команды видно, что не все первые строчки
начинаются с "Keywords:" - не будем выводить такие строки. Построим
конвейер, добавив к предыдущей команде вот такую:
awk '/Keywords\:/ {print}'
3. Также нужно избавиться от строчек, которые содержат в себе только
"Keywords: " и больше никакой полезной информации. Сразу нужно сказать,
что некоторые строчки будут содержать непечатаемый символ 0x0D,
оставшийся в фалйике со времен Windows и DOS (в Unix конец строки 0x0A,
а в Windows 0x0D;0x0A), - это нужно учесть. Изменим предыдущую команду в
конвейере на
sed 's/\x0D//' | awk '/Keywords: [ a-z]/ {print}
4. Начальное слово "Keywords: " при составлении словаря ключевых слов
вообще не нужно, поэтому уберем его. Добавим к конвейеру следующую
команду:
sed 's/Keywords: //'
5. В некоторых строках пробелы стоят в начале и конце строк - уберем и
их, добавив к конвейеру
sed 's/^ //' | sed 's/ $//'
6. В итоге у нас должен получится конвейер следующего вида:
$ find . -name "*.txt" -exec head -n 1 '{}' ';' | sed 's/\x0D//' | \
awk '/Keywords: [ a-z]/ {print}' | \
sed 's/Keywords: //' | sed 's/^ //' | sed 's/ $//'
А результат его работы, примерно, следующего вида:
keyboard scancode print charset
linux rus koi8r unicode locale
linux rus slackware
mozilla print font rus
font size gtk
rus lyx tex
linux suse rus
freebsd rus locale
rus emacs gnus
Дополнение.
Если теперь в конце конвейера добавить команду "wc -l", то можно
получить количество проиндексированных статей (у меня 689).