Показаны сообщения с ярлыком классы. Показать все сообщения
Показаны сообщения с ярлыком классы. Показать все сообщения

понедельник, 26 апреля 2010 г.

Сохраняем в логи содержимое объектов

Иногда в процессе отладки требуется узнать состояние определенных объектов в программе, однако не всегда возможно в нужный момент подключиться к работающей программе при помощи отладчика. Так вот, здесь предлагается готовый алгоритм для сохранения содержимого объектов (с использованием reflection). В итоге получится что-то вроде:


суббота, 28 апреля 2007 г.

Модель предложения в переводчике

Вроде бы про слова более-менее рассказал, теперь очередь за предложениями. Итак, предложения (строки) бывают двух видов TMStr и TRStr.
  • TMStr - описание английского предложения
  • TRStr - результат перевода на русский
TMStr является одним из базовых классов. Умеет:
  1. Добавлять/удалять связи между словами
  2. Добавлять/удалять слова (с учетом/коррекцией связей между словами)
  3. Сегментировать часть предложения

Сначала поговорим про сегментирование и вообще о том, что такое сегменты в системе.

Сегмент - это группа слов, по отношению к предложению представляемая как одно слово. Для чего это нужно?

Возьмем, например, такое предложение: I am looking at the big, fast river.

В нем можно выделить следующие участки: I am looking [at [the [big, [fast river]]]]. Вот именно по выделенным участкам и будет произведено сегментирование (свертка). В результате предложение выродится в: I am looking river (естественно, river приобретет ряд дополнительных параметров(свойств), которые будут установлены в процессе свертки предложения).

Для чего это нужно? Для упрощения алгоритма синтаксического анализа (по-крайней мере - моей реализации этого алгоритма). После проведения свертки для определения подлежащего/сказуемого нам достаточно проверить простое правило вида: местоимение/существительное+глагол_ing+уловия_для_дополнений (ну, на самом деле проверяемые правила несколько сложнее, но принцип именно такой). Таким образом мы преобразовали сложное предложение в более простое, тем самым упростив синтаксические правила, которые необходимо проверять на предложениях. Более того - теперь для описания синтаксической структуры предложений вида Present Continuous достаточно всего 3-х правил (обычная форма, вопросительная форма, пассив), а не бесконечного количества :)

При создании сегмента (свертке) указывается какое их слов в будущем сегменте является главным. Снаружи сегмента будет видно именно это слово, со всеми его параметрами.

Допускается (даже желательна) вложенность сегментов (см. пример выше).

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

Класс TRStr не умеет работать с сегментами - только разворачивать по данным из TMStr, кроме того производится корректировка ссылок между словами. Именно этот класс содержит результаты перевода, именно по нему генерируется выходной текст для пользователя.

Ну и напоследок - немного о том как реализован TMStr.

  1. список всех слов в предложении
  2. список индексов
  3. список сегментов

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

Реальная последовательность слов хранится в списке индексов (каждый индекс указывает на слово в списке слов).

Список сегментов - содержит только сегменты самого верхнего уровня.

Сегменты обладают примерно такой же структурой что и TMStr, т.е. также содержат индексы слов, список слов (это ссылка на основной список слов в TMStr) и список сегментов.

Удалять/добавлять слова можно только в TMStr, в сегменты - нельзя (ну если только вручную...).

При создании сегмента в его список индексов переносятся индексы из основного списка индексов предложения. Сами слова никуда не перемещаются.

Связи между словами бывают четырех видов:

  1. между словами в предложении
  2. связь ведет от слова к слову-сегменту
  3. связь ведет от слова-сегмента к слову
  4. связь ведет от слова-сегмента к слову-сегменту

Соответственно, при каких-либо модификациях предложения связи корректируются.

Уф... Ну вроде бы пока - все.

понедельник, 23 апреля 2007 г.

Основы-2

Продолжим :) Ранее я уже упоминал элементы алгоритмя перевода. На всякий случай еще раз:
  1. лексический анализ
  2. морфологический анализ
  3. фразеологический анализ
  4. синтаксический анализ
  5. семантический анализ

Сразу хочу сообщить - я не лингвист. Я простой программист :) Поэтому мои подходы к решению лингвистических задач несколько хм... отличаются от общепринятых. Прошу сильно не бить :)

Я решал проблему перевода по самому простому пути. А именно - на каждый этап перевода был сделан отдельный алгоритм. Прежде чем переходить к самим алгоритмам я думаю стоит написать что именно каждый из них должен делать.

  1. лексический анализатор - получает на входе текст и выделяет в нем слова, предложения, и абзацы.
  2. морфологический анализатор - получает на входе слова и определяет их исходную форму. В моей версии алгоритма перевода - на этом этапе еще и определяются все переводы слов.
  3. фразеологический анализатор - получает на входе слова и принимает решение об объединении некоторых из них в одно слово.
  4. синтаксический анализатор - получает на входе предложения (массив слов) и определяет отношения между словами, корректирует характеристики и части речи слов.
  5. семантический анализатор - отсутствует на данный момент :(

Наверное теперь самое время определиться - что же такое слово/предложение/текст?

Слово описывается специальным классом TMWord и содержит следующие основные элементы:

  • оригинальная форма (то, как слово было написано в тексте)
  • исходная форма (то, как слово записано в словаре)
  • части речи слова
  • параметры слова
  • переводы слова

Не секрет, что слова в английском языке (как и в русском, вообщем-то) при одинаковом написании могут быть различных частей речи. Соответственно, части речи слова - это список всех возможных в предложении частей речи данного слова

Каждый вариант перевода слова описывается:

  • русское слово
  • часть речи
  • параметры слова
  • шаблон склонения

Параметры слова - это синтаксические и семантические характеристики слова. Например, для глаголов - это переходный/непереходный, совершенный/несовершенный и т.п.

Параметры на данный момент делятся на три вида:

  • применимые к английским словам
  • применимые к русским слова
  • применимые ко всем языкам

Таким образом, параметры слова в предложении - это совокупность всех параметров всех вариантов перевода данного слова в предложении.

Ну со словом вроде более-менее определились. Перейдем к предложению. Я думаю ни для кого не секрет, что предложение - это группа слов :) Английское предложение описывает специальный класс TMStr, русское - TRStr. Ну, об их особенностях поговорим позже...

Текст обычно состоит из абзацев, абзацы из предложений. Эту структуру описывает класс TTextParser. Фактически - это третий самый главный базовый класс (первые два - это TMWord и TMStr). Все взаимодействие GUI-модулей с текстом идет через него.