Category: история

Странная разница в скорости pickle.load в Python 2 и 3

В ходе экспериментов с оптимизацией загрузки словаря в проекте ruword2tags столкнулся с неожиданным эффектом.
Контекст такой:
Collapse )
5) Неожиданный эффект заключается в том, что во 2й версии питона pickle.load работает примерно 60 секунд, в 3й - 6 секунд.

Рекурсивный обход графа в тезаурусе одним SQL запросом

Допустим, мы хотим получить список слов (словарных статей), которые связаны с некоторым заданным словом отношениями синонимии или некоторыми морфологическими преобразованиями (например, белый-белеть).

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

Можно ли одним SQL запросом увидеть список связанных слов с учетом рекурсивного характера алгоритма обхода?

Для решения нужно использовать такую полезную вещь, как Common Table Expressions и их разновидность для рекурсивного обхода деревьев - см. http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL. Само по себе CTE является просто локально определенным и именованным view в рамках конкретного запроса, вводимым с помощью ключевого слова with. Если добавить сюда возможность внутри CTE сослаться в FROM на это же самое CTE, то получается полноценное решение задачи без каких-либо процедурных костылей.

Вот запрос, работающий в FireBird версии 2.5 (насчет более ранних версий нужно проверять, но скорее всего в 2.1 этот фокус тоже работает):

Collapse )

Изменение порядка связывания в синтаксическом графе

В нисходящем парсере сейчас реализован "традиционный" порядок связывания подлежащего и сказуемого. А именно - глагол, который является headword в глагольном сказуемом, становится корнем, подлежащее привязывается к нему ребром типа SUBJECT.

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

Итак, вот пример предложения:

Стёклышко ловило луч солнца, подбрасывало его как на ладони и кидало в самую неожиданную сторону

Одно подлежащее, три глагольных сказуемых, каждое со своими уточняющими ветками.

Если идти обычным путем, то получается вот такой граф:

Collapse )

ЯМЫЛАРФУ: новый лексер в работе

Закончил отладку нового лексера. В отличие от старого алгоритма он позволяет естественным образом, то есть не прибегая к "костылям" и обходным решениям, выполнять очень интересные действия с текстом.

Далее - пример разбора на слова цепочки ЯМЫЛАРАМУ. Верхний регистр тут использован потому, что обычно языки с таким типом сегментации не имеют различия символов по верхнему-нижнему регистру, и в силу некоторых внутренних решений натуральным считается верхний регистр.

Без пробелов, разделяющих слова в печатном письменном тексте, задача разбора цепочки букв становится достаточно нетривиальной. Как ее можно решить?

Collapse )