Научная поисковая система на вашем Linux-десктопе



10 коммент.
Некоторое время назад я писал о SWISH++, и вот теперь мне хотелось бы обобщить написанное в более краткой форме. Проблема поиска нужной статьи, если не помнишь точно где она находится в каталогах, действительно серьёзная.


1. Поиск дубликатов
Итак, когда я накачал нужных мне статей из Интернета, я прежде всего смотрю, есть ли они у меня в коллекции с помощью fdupes. Эта программа ищет дубликаты файлов:
$ fdupes -rd .
Точка в конце говорит о том, что искать дубликаты fdupes будет, начиная с текущего каталога, поэтому можно в каталоге со статьями сделать подкаталог 1/ и набросать туда скачанные статьи.

Fdupes сравнивает файлы как побайтово, так и с помощью подсчёта md5-суммы, работает невероятно быстро, сортировка производится в полуавтоматическом режиме: программа выводит в консоли дублирующиеся файлы и спрашивает, какой из них оставить. Об этом уже говорилось в статье о подходах к сортировке PDF-файлов.


2. Индексация текста в PDF-файлах
Сначала из
документов pdf вытаскиваем текст, для чего просим утилиту find найти все файлы PDF и для каждого найденного выполнить pdftotext без выдачи предупреждений и без вставки символов разрыва страницы:
find -name '*.pdf' -exec pdftotext -nopgbrk -q {} \;
Надо отметить, что pdftotext хорошо работает только для английского языка, на котором, в общем, все статьи и написаны.

Теперь индексируем все текстовые файлы - в этом нам поможет собрат SWISH++ по имени index++ для индексации текстовых файлов:
index++ -e "text:*.txt" .
Точка в конце означает, что поиск ведётся с текущего каталога. Подробнее об индексации и автоматизации этого процесса сказано здесь.

В результате в текущем каталоге появится файл swish++.index где, собственно, лежит информация об индексировани файлов. Теперь всё готово для поиска.


3. Ищем в архиве статей нужное
Для поиска используем search++ которая найдёт по нашему запросу в индексированной базе swish++.index файлы. Вот пример поиска статьи по математической морфологии, в которых нет упоминания про медицину:
$ search++ morphology and erosion and dilation not medicine
Мгновение спустя вижу результат (вывод сокращён):
# results: 125
99 ./Krylov2.txt 3771 Krylov2.txt
49 ./13300407.txt 3103 13300407.txt
46 ./morph1.slides.printing.6.txt 4369 morph1.slides.printing.6.txt
37 ./lecture_morphology_sara.txt 6746 lecture_morphology_sara.txt
30 ./SIGGRAPH2002_Sketch-Mitchell.txt 5308 SIGGRAPH2002_Sketch-Mitchell.txt
26 ./MorphologicalImageProcessing.txt 7642 MorphologicalImageProcessing.txt
25 ./phdsymp2002_ledda.txt 8298 phdsymp2002_ledda.txt
23 ./lab2_manual.txt 9313 lab2_manual.txt
23 ./Project 1.txt 9946 Project 1.txt
22 ./morphology.txt 11212 morphology.txt
22 ./edg/morphology.txt 11212 morphology.txt
22 ./slides-6-geometry.txt 11717 slides-6-geometry.txt
22 ./V1BFOGG8.txt 10797 V1BFOGG8.txt
18 ./71650638.txt 13978 71650638.txt
Первая колонка - релевантность, вторая - расположение файла относительно текущей директории, третья - размер файла, четвёртая - имя. Просто и понятно.

Теперь в консольке набираю kdpf
./Krylov2.pdf и смотрю нужную мне статью. И всё.

Ссылки
Собственно, документации о SWISH++ очень мало, так что в основном я решил собрать свои предыдущие записи в один пост:
- поиск и удаление дубликатов файлов с помощью fdupes;
- выделение текста из PDF-файлов и их индексация;
- поиск в индексированных файлах с помощью SWISH++
Читать далее

Чтение MAT-файлов MATLAB в nip2



3 коммент.
То, о чём так долго говорили красные, белые, зелёные, и даже голубые - свершилось. Теперь замечательный графический анализатор nip2 полностью поддерживает чтение MAT-файлов, в которых MATLAB записывает данные рабочего окружения с двойной точностью (double precision). И хотя в основной ветке этой возможности ещё нет, в SVN-репозитории оно уже появилось благодаря скромным усилиям автора этих строк и John Cupitt - одного из авторов nip2 и библиотеки VIPS.

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


Для чего нужно открывать MAT-файлы в nip2
Упреждая возможные вопросы "а зачем нам проприетарный mat когда есть csv" отвечу: запись в открытый формат CSV в матлабе происходит несколько нетривиальным образом и можно записать только одну переменную. Более того, если забыть указать несколько важных параметров, можно сильно потерять в точности сохраняемых данных. И главное, что уже много результатов научных экспериментов сохранено в MAT-формате.

Периодически возникает необходимость быстро просмотреть эти данные (это изображения) в каком-нибудь просмотрщике без необходимости загружать MATLAB. Таковых просмотрщиков я не знаю - открыть MAT-файл может только GNU/Octave с помощью библиотеки matio. Так что эта возможность очень нужна и востребована.

Установка nip2 и VIPS

Хотя об установке nip2 я уже писал, тем не менее, повторюсь. Сначала нужно скачать отсюда из support-зоны самый свежак. Сначала собираем VIPS и устанавливаем пакет, потом собираем nip2 и тоже устанавливаем. Последние версии (vips7.18.XX) со старыми версиями Питона могут не собраться, так что для этого при сборке пользуем ключ --without-python и собираем.

Для себя и своих студентов я собрал пакеты под Debian Etch и архитектуру i386 (да-да, я в конкретном бронепоезде):
После этого добавляем программу в меню вашего оконного менеджера или запускаем прямо из графической консоли командой nip2.


Просмотр MAT-файлов MATLAB в nip2

Здесь всё довольно просто: в диалоге открытия явно указываем, что хотим просмотреть MATLAB's mat-files и далее открываем такой файл. Пример на скриншоте - легендарная Лена
(а кто такая Лена?)


А теперь примерчик посложнее - загружаем изображение усреднённых темновых шумов цифровой камеры и берём от них Фурье-преобразование (на том же скриншоте открыта в левом нижнем углу неудачная фотография от скоростной съёмки):


Так что наши данные теперь можно просмотреть без томительного ожидания, пока MATLAB откроет эти файлы. Кстати о данных в форматах CSV и MAT...


Данные в CSV и MAT-форматах: особенности записи MATLAB и просмотр nip2
Эту заметку я хотел сделать отдельным постом, но решил выложить здесь же. Появился тут вопрос: как сохраняет MATLAB данные с плавающей точкой в разных форматах. Для этого мы провели маленькое расследование...


Подготовка
Ответ состоит из нескольких частей. Да, Матлаб может сохранять данные в своём формате mat, и его может прочесть та же Octave (теперь и nip2 с использованием библиотеки matio). Для проверки сгенерируем матрицу

>> a = magic(5)

a =

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

>> b =a./3

b =

5.6667 8.0000 0.3333 2.6667 5.0000
7.6667 1.6667 2.3333 4.6667 5.3333
1.3333 2.0000 4.3333 6.6667 7.3333
3.3333 4.0000 6.3333 7.0000 1.0000
3.6667 6.0000 8.3333 0.6667 3.0000

>> b(2,2)=1.09878432753084573248523475
>> b(2,3)=2^20

Видим только первые четыре числа после запятой - это потому, что по умолчанию MATLAB отображает числа в коротком формате. Изменить этот формат можно командой format type.

Чтобы сделать задачу более наглядной, в матрицу записали два числа: одно с разными числами после запятой, а второе - очень большое (2^20). Теперь сохраняем в MAT-файл и CSV командами:
save('magic5x5doubleafterformatlong.mat', 'b'); %% это сохраняется MAT-файл
csvwrite('magic5x5double-afterformatlong.csv',b); %% это сохраняется CSV-файл

Теперь открываем их и сравниваем с исходниками...

Данные в MAT-файле.
В MAT-файлах всё чисто: он сохраняет так же, как и открывает.
>> load('magic5x5doubleafterformatlong.mat')
>> b
b =
1.0e+06 *
Columns 1 through 4
0.00000566666667 0.00000800000000 0.00000033333333 0.00000266666667
0.00000766666667 0.00000109878433 1.04857600000000 0.00000466666667
0.00000133333333 0.00000200000000 0.00000433333333 0.00000666666667
0.00000333333333 0.00000400000000 0.00000633333333 0.00000700000000
0.00000366666667 0.00000600000000 0.00000833333333 0.00000066666667
Column 5
0.00000500000000
0.00000533333333
0.00000733333333
0.00000100000000
0.00000300000000
>> b(2,2)
ans =
1.09878432753085
>> b(2,3)
ans =
1048576

Данные в CSV-файле.
А вот тут начинаются приключения. MATLAB записывает в CSV формат данные с точностью, такой же, как при отображении. То есть, например, при отображении используется вывод только первых 4 чисел после запятой - следовательно, сохранены они в CSV будут так же.

>> b(2,2)

ans =

1.0988

С большими числами тоже самое: они сохраняются в экспоненциальной форме с точностью, установленной для отображения (по умолчанию 4 знака). Это так же видно в CSV-файле (записывает с той точностью, с которой отображает). У одной и той же матрицы, сохранённой в CSV и MAT сходный размер.


>> b(2,3)=2^20

b =

1.0e+06 *

0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 1.0486 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000

>> b(2,3)

ans =

1048600

>> 2^20

ans =

1048576

Именно так оно и происходит по умолчанию: MATLAB просто округляет числа при записи в CSV до четырёх значащих чисел. Для того, чтобы запись происходила с нужной нам точностью в CSV, следует использовать команду dlmwrite и явно указывать точность. Например так:

>> dlmwrite('magic5x5double1-dlmwrite-precision12f.csv', b, 'precision', '%12.12f')

Это записывает матрицу в CSV формат с переменной b и обеспечивает точность 12 значащих чисел. Так что стоит аккуратнее обходиться с командами записи: csvwrite вам запишет, конечно, переменную, но с малой точностью. Это может стать источником трудноуловимых проблем.


Отображение данных в MAT и CSV форматах в nip2
Теперь, возвращаясь к теме поста, в последних версиях (nip2 и vips > 7.18.2) замечательного графического анализатора nip2 можно просматривать не только данные в CSV, но и в MAT-файлах. Это очень и очень удобная возможность: например, усреднённое изображение в MAT-файле можно проанализировать и посмотреть без необходимости загружать лишний раз MATLAB. Особенно это актуально, если изображение в MAT-файле больших размеров. Точность просмотра CSV и MAT-данных составляет 5 значащих цифр.
Читать далее

MOCP - Music On Console player, или Играй, гармонь!



20 коммент.
Время от времени нужно выходить в консоль и гасить иксы - для изменения иксовых же настроек или обновлений, связанных с иксовыми пакетами. И сидеть в это время в тишине совсем не хочется. Конечно, можно запустить XMMS на ноутбуке и проигрывать музыку оттуда, но есть решение лучше: MOCP. Запустил MOCP в консольке, скрыл - и музыка заиграла. Вышел из иксов что-то поправить в консоли - а гармонь-то поёт :-)

Если б гармошка умела
всё говорить, не тая...
(с) Песня, из которой слов не выкинуть

Об этом замечательном плеере уже писал Андрей aka vonderer здесь. Из той песни тоже слов не выкинуть, но я немного подробнее остановлюсь на управлении плеером. Как любое хорошее приложение, оно управляется горячими клавишами, и основные клавиатурные сокращения такие:
  • ENTER – переключиться в директорию и\или начать воспроизведение песни
  • o – проиграть URL (например, интернет-радиостанции)
  • p или пробел – пауза
  • s – стоп
  • l – переключиться между одно- и двухпанельным режимом
  • a – добавить текущий файл в список воспроизведения
  • A – добавить текущую директорию в список воспроизведения
  • C – очистить список воспроизведения
  • q – отключить консольный интерфейс (сервер MOC будет продолжать воспроизведение, к нему можно подключиться снова, набрав mocp)
  • Q – отключение MOC-сервера (прекращение воспроизведения)

Так же можно воспользоваться более широкими возможностями по управлению плеером с помощью следующих клавиатурных сокращений:
  • n -- проиграть следующую песню из списка
  • b -- проиграть предыдущую песню из списка
  • S -- воспроизведение в произвольном порядке
  • R -- повторяет выбранную песню циклически
  • u -- перемещает элемент списка воспроизведения вверх
  • j -- перемещает элемент списка воспроизведения вниз
  • g или / -- ищет заданную строку в именах фалов песен
  • r -- перечитать директорию заново
  • f -- переключить режим отображения с имён файлов на теги
  • TAB -- переключение между списком воспроизведения и файлами песен
  • H -- показывает скрытые файлы
  • Ctrl-t -- показать или убрать длительность песни в списке
  • Ctrl-f -- показать или убрать формат песни
  • U -- переместиться на уровень выше в директории
  • a -- добавить файл к списку воспроизведения
  • A -- добавить каталог к списку воспроизведения
  • C -- очистить список воспроизведения
  • V -- сохранить список воспроизведения
  • d -- удалить отмеченные песни из списка воспроизведения

Наконец, управление громкостью
  • < -- уменьшить громкость на 1%
  • , -- уменьшить громкость на 5%
  • >— увеличить громкость на 1%
  • . — увеличить громкость на 5%
Если вы запамятовали какую-нибудь команду, то получить справку по клавиатурным сокращениям можно клавишей "?"

Язык осин и берёз MOCP по умолчанию отображает славяно-греко-латинской мешаниной, что легко поправить. Для этого копируем пример конфига отсюда:
$ cp /usr/share/doc/moc/examples/config.example.gz ~/.moc/
$ cd ~/.moc
# chown $USER config.example.gz
Где $USER - имя пользователя в системе. После этого разархивируем конфиг:
$ gunzip config.example.gz
$ mv config.example config
И правим его своим любимым текстовым редактором. Чтобы заставить MOCP дружить с кириллицей в ID3v1-заголовках, необходимо найти строку:

#ID3v1TagsEncoding = WINDOWS-1250

и превратить ее в

ID3v1TagsEncoding = WINDOWS-1251
И всё, играй, гармонь!
Читать далее