Создать тему  Создать ответ 
Поиск в сканированных словарях
12-08-2012, 15:42    
Сообщение: #1
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

Поиск в сканированных словарях
Сразу ограничение: Windows.

Цель прекрасна. Есть отсканированный словарь. Мы хотим задавать слова, и чтобы словарь сам открывался на нужной странице. В таком случае словарь становится не менее удобным, чем электронный.

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

Делать индекс — занятие долгое и нудное, и компьютеру его не порчишь. Конечно, можно и нужно искать способы рационализации этой работы. Тем не менее, вопрос создания индексов мы рассматривать не будем.

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

Через некоторое время ожидается английская документация. Пока постараемся обойтись примерами и вопросами/ответами.

В программировании я дилетант, и это вообще мой первый опыт ООП. Поэтому сильно не пинайте. А замечаниям и советам буду очень благодарен.
Найти все сообщения
Цитировать это сообщение
12-08-2012, 15:44    
Сообщение: #2
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Излагаю в расчёте на людей, не знакомых с Python’ом.

Требования: Windows
1. Установить Python 3.* (http://www.python.org/getit/)ю
2. Установить SumatraPDF (http://blog.kowalczyk.info/software/suma...iewer.html)
3. Распаковать прилагающийся архив туда где Python сможет его найти (например, в C:\Python 3.*\).

Python 3 — потому что мы нацелены в будущее. :) SumatraPDF — симпатичный лёгкий просмотрщик, удобный для наших целей. Кроме прочего, удобно, что нн открывает и PDF, и DJVU (и ещё несколько форматов). Кстати, в SumatraPDF нажатие клавиш j и k эквивалентно стрелкам вниз и вверх — попробуйте, очень удобно.

И можно работать.

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

Нам нужно написать для этого словаря модуль на Python.

Модуль — это текстовый файл с расширением .py в кодировке utf-8.

В качестве примера рассмотрим модуль cceld.py, позволяющий работать с Copious and Critical English-Latin Dictionary.
Код:
from lookup import SDic, SimpleIndex

index = SimpleIndex('cceld.txt', firstpage=21);
dic = SDic(
        filename ='C:/Users/Станислав/Documents/Языки/Латинский язык/Словари/copiouscriticale00smit(index).pdf',
        index = index)

# simple console interface

if __name__ == "__main__":
    print('This is the Copious and Critical English-Latin Dictionary')
    print('Blank line exits')
    while True:
        entry = input('> ')
        if entry == '':
            break
        dic.lookup(entry)

Пояснения.

Первой строчкой мы загружаем самодельные классы для работы со словарями (SDic) и индексами (SimpleIndex). Эту строчку трогать не надо.

Затем мы создаём индекс index на основе текстового файла ccld.txt, который лежит в той же папке, где и скрипт. Наверно, ваш файл будет называться по-другому. :) Конечно, файл с индексом может лежать где угодно, и тогда нужно указывать полный путь. Аргумент firstpage важен: он указывает страницу PDF-файла, на которой располагается первое слово из индекса.

Затем мы создаём словарь dic, указывая полный путь к файлу словаря. Аргумент index = index означает, что в качестве индекса передаётся созданный выше index. (Если бы мы назвали его ind, было бы index = ind.)

Обратите внимание: в полном имени файла используются слэши, а не бэкслэши, и не нужны никакие дополнительные кавычки кроме ' в начале и конце.

Имеет смысл использовать стандартное имя переменной для словарей в подобных модулях (например, dic). Это делает более удобным использование модулей в других скриптах.

На этом модульная часть закончилась. Словарь готов для использования Python-ом.

Этот модуль можно использовать и как скрипт, то есть запускать двойным щелчком. За это отвечает написанное ниже строки # simple console interface. Параллельно отметим, что решётка служит в Python-е знаком комментария.

Интерфейс такой: появляется консоль и предлагает писать слова. Вы вводите слово, нажимаете Enter, и — о чудо! — открывается словарь на нужной странице. После этого можно вводить другое слово, и ad infinitum. Если просто нажать Enter (ввод пустой строки), консоль закрывается.

Реализацию этого «простого консольного интерфейса» мы разбирать не будем: её достаточно просто копипастить. Ну, конечно, изменяя строчку, которой словарь представляется.

Надо отметить, что в Python-е очень важны отступы. Отступы всегда кратны четырём пробелам.


Прикрепления
.zip  lookup.zip (Размер: 419.21 Кб / Загрузок: 136)
Найти все сообщения
Цитировать это сообщение
12-08-2012, 15:51    
Сообщение: #3
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Я ещё напишу пару примеров. Если кто-то станет пробовать — пишите, что получается, а что нет, и задавайте вопросы.
Найти все сообщения
Цитировать это сообщение
12-08-2012, 15:55    
Сообщение: #4
I. G.

Розовый кардинал
Сообщений: 1626
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
(12-08-2012 15:44)Quasus писал(а):  Излагаю в расчёте на людей, не знакомых с Python’ом.

Надо отметить, что в Python-е очень важны отступы. Отступы всегда кратны четырём пробелам.
Жив ли после этого Python? :s


狐狸
Найти все сообщения
Цитировать это сообщение
12-08-2012, 15:58    
Сообщение: #5
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Знаете ли вы? Python не любит Python.
:)
Найти все сообщения
Цитировать это сообщение
12-08-2012, 16:06    
Сообщение: #6
I. G.

Розовый кардинал
Сообщений: 1626
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Error: Not Found
The requested URL /software/sumatrapdf/download-free-pdf-viewer.html) was not found on this server.


狐狸
Найти все сообщения
Цитировать это сообщение
12-08-2012, 16:10    
Сообщение: #7
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Исправил.
Найти все сообщения
Цитировать это сообщение
12-08-2012, 16:12    
Сообщение: #8
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Сейчас тестовый словарик сделаю.
Найти все сообщения
Цитировать это сообщение
12-08-2012, 16:30    
Сообщение: #9
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Вот. Лучше один раз увидеть.


Прикрепления
.zip  test.zip (Размер: 29.99 Кб / Загрузок: 128)
Найти все сообщения
Цитировать это сообщение
12-08-2012, 18:07    
Сообщение: #10
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: Поиск в сканированных словарях
Приведу пример скрипта, реализующего удобный консольный интерфейс к нескольким словарям.

Предположим, мы написали для некоторых словарей модули old.py, gaffiot.py, forcellini.py, cceld.py и noel.py, и эти файлы лежат в одной папке. Предполагается, что словарь в каждом модуле назван dic. В той же папке можно создать файл latindics.py со следующим содержанием:

Код:
import old, gaffiot, forcellini, cceld, noel

dics = {'o': old.dic,
    'g': gaffiot.dic,
    'f': forcellini.dic,
    'c': cceld.dic,
    'n': noel.dic}
# default dictionary
symb = 'o'

def help():
    print('o : OLD')
    print('f : Forcellini')
    print('g : Gaffiot')
    print('c : Copious and Critical')
    print('n : Noel')
    print('<dict> <word> : look up <word> in <dict>')
    print('/<dict> : look up the last word in <dict>')
    print('/help : help')
    print('/exit : exit')
    print('Blank line exits.')
    print()

help()

word = ''
while True:
    cmd = input(symb + '> ')
    if cmd == '':
        break
    # command
    elif cmd[0] == '/':
        cmd = cmd[1:]
        cmdlist = cmd.split()
        n = len(cmdlist)
        if n == 0:
            continue
        elif n == 1:
            if cmdlist[0] == 'exit':
                break
            elif cmdlist[0] == 'help':
                help()
                continue
            elif cmdlist[0] in dics:
                symb = cmdlist[0]
            else:
                continue
        else:
            if cmdlist[0] in dics:
                symb = cmdlist[0]
                word = cmdlist[1]
            else:
                continue
    else:
        cmdlist = cmd.split()
        n = len(cmdlist)
        if n == 1:
            word = cmdlist[0]
        else:
            if cmdlist[0] in dics:
                symb = cmdlist[0]
                word = cmdlist[1]
            else:
                word = cmdlist[0]
    dics[symb].lookup(word)

# Close open files
for _, dic in dics.items():
    dic.close()

Интерфейс следующий. При запуске появляется краткая справка, и за ней промпт
o>
предлагающий посмотреть слово в оксфордском словаре. Можно набрать слово и посмотреть. Чтобы переключить словарь, достаточно перед очередным вводимым словом поставить символ нужного словаря: например, чтобы посмотреть у Форчеллини слово feles, достаточно набрать
o> f feles
после чего промпт примет вид
f>
Команды вида /o, /f и т. п. позволяют посмотреть последнее введённое слово в соответствующем словаре. Кроме того, есть команды /help и /exit; также можно выйти, введя пустую строку.

Думаю, не составит труда модифицировать этот скрипт для своих словарей.
Найти все сообщения
Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)