Enum для суффиксов

Алгоритмы, использующиеся при работе с естественными языками.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Enum для суффиксов

Сообщение Antonariy » 06.12.2009 (Вс) 15:02

Делаю морфологический анализатор эсперанто, для чего хочу кодировать слова примерно в такую структуру:
Код: Выделить всё
Type Word
    Root As String  'корень слова
    Prefix As Byte 'приставка
    Postfix As Byte 'окончание
    Suffixes As Suffixes 'суффиксы
End Type

Enum Suffixes
    sufAD = 1
    sufAC = 2
    sufAĉ = 4
    sufAĵ = 8
    'и т.д. по степеням двойки
End Enum

Суффиксы хочу сохранять с помощью побитового Or, чтобы потом быстро проверять наличие того или иного суффикса с помощью And. Проблема в том, чтобы значение произвольного набора суффиксов гарантированно не содержало значение суффикса, которого там нет. Пока что закодировал суффиксы степенями двойки, однако суффиксов в эсперанто — 45, что дает напрягающе большое число, которое заведомо перекрывает все возможные комбинации.

Очевидно, что часть суффиксов в одном слове вместе встречаться не может. Как, учитывая это правило, выбрать значения суффиксов, чтобы выполнялось условие x or y or ... <> i or j or ...?

Вот полный список суффиксов:
-ac- - наменование семейства (бот.) / fabacoj - бобовые.
-ed- - наименование семейства (зоол.) / cervedoj - оленьи

-ĉj- - образование ласкательных существительных, относящихся к мужчине / paĉjo - папочка
-nj- - образование ласкательных существительных, относящихся к женщине / Manjo - Маша, Маня, Маруся

-iĉ- - мужской пол / katiĉo - кот
-in- - женский пол / katino - кошка

-ig- - сделать каким-то, заставить, побудить / blanka blankigi - белый побелить, bruligi - наточить, сжечь
-iĝ- - сделаться, стать / blankiĝi - побелеть

-ism- - пристрастие / alkoholismo - алкоголизм
-ist- - профессия, принадлежность / vodkisto - водочник

причастия и деепричастия
действительного залога
-ant- - настоящее / drinkanta - пьющий
-int- - прошедшее / drinkinta - пивший
-ont- - будущее / drinkonta - будущий пить
страдательного залога
-at- - настоящее / drinkata - выпиваемая
-it- - прошедшее / drinkita - выпитая
-ot- - будущее / drinkota - будущая выпитой

-ad- - продолжительность / pafo, pafado - выстрел, стрельба; drinki, drinkadi - пить, пьянствовать
-aĉ- - низкое качество, никчёмность, непригодность, пренебрежение, презрение / ĉevalaĉo - кляча, ridaĉi - ухмыляться, кривиться
-aĵ- - воплощение (объект) / aĵo - вещь
-an- - житель нас. пункта, член общества / vodkano - водчанин
-ar- - объявление коллекции (ряд однородных предметов) / vodkaro - ящик водки
-ebl- - пассивная возможность / manĝebla - съедобный
-ec- - воплощение (понятие) / dinkeco - пьянство
-eg- - увеличение / grandega - огромный
-ej- - помещение / vodejo - водчная (рюмочная)
-em- - склонность / drinkemo - пьяница
-end- - обязательство к исполнению / farenda laboro - работа, которая должна быть сделана
-er- - случайный; неопределенный элемент коллекции (частица целого) / fajro, fajrero - огонь, искра
-esk- - подобный
-estr - главная персона, начальник / ŝipestro - капитан корабля
-et- - уменьшительное / vodketo - водочка
-id- - потомок / kato - кошко, katido - котенок
-ik- - область науки или техники, специальность / ĵurnalistiko - журналистика
-il- - инструмент / skribi, skribilo - писать, ручка
-ind- - достойный, заслуживающий / drinkinda vodko - водка, достойная выпивания
-ing- - предмет, в который что-то вствляется / vodkingo - подводочник
-it- - болезнь (мед.), минерал (геол.), соль (хим.) / bronkito - бронхит, magnetito - магнетит, sulfito - сульфит
-iv- - способный, могущий / produktiva - производительный, продуктивный.
-iz- - снабжать, покрывать, добавлять / orizi - покрывать золотом
-obl- - кратное числительное / duobla vodko - двойная водка
-on- - дробное числительное / duono kaj du kvarono de litro de vodko eatas uno litro - половина и две четверти литра водки это один литр
-op- - собирательное числительное / ni drinkas la vodko triope - мы пьем водку втроем
-oz- - обилие, многочисленность (неофиц.) / poroza - пористый (= porhava, porplena), ŝtonoza - каменистый (= ŝtonhava, ŝtonplena, ŝtonriĉa)
-uj- - вместилище, плодовое дерево, страна (устарело)
-ul- - доминирующее свойство / drinkulo - пьяница
-um- - без определённого значения, применяется, когда никакой другой суффикс не подходит по смыслу / aerumi - проветривать

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

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Enum для суффиксов

Сообщение Alec » 06.12.2009 (Вс) 15:41

Я так понимаю, что -ac- и -ed- (из одного блока), например, не могут встречаться в одном слове, а -ac- и -ĉj- (из разных) могут?
А суффиксы последнего блока могут встречаться вместе?
Если так, то можно блоки закодировать последовательным перечислением (1, 2, 3 и т.д.) а эти перечисления уже объединить в битовую структуру?
Тогда для кодирования блока потребует:
1 элемент - 1 бит
от 2 до 3 элементов - 2 бита
от 4 до 7 элементов - 3 бита
от 8 до 15 элементов - 4 бита и т.д.
Тогда для хранения структуры понадобится 2+2+2+2+2+3+30 = 43 бита (уже меньше :) )

А возможно последний блок как-нибудь тоже разбить на блоки?
Идея в том, чем крупнее получатся блоки со взаимоисключающими элементами, тем компактнее получится структура.
Иногда лучше вовремя остановиться...
И начать заново!

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Enum для суффиксов

Сообщение Debugger » 06.12.2009 (Вс) 16:37

Может, не надо это пихать в enum, а записать в type?
Уж больно навороченный enum получается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Enum для суффиксов

Сообщение Хакер » 06.12.2009 (Вс) 17:10

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

Кроме того, наверняка есть суффиксы, совместимые только с конкретными частями речи. Разбить последнюю группу по таким подгруппам, и дать элементам разных подгрупп одинаковые номера в приделах битфиелда.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Enum для суффиксов

Сообщение Antonariy » 06.12.2009 (Вс) 19:50

Alec писал(а):Я так понимаю, что -ac- и -ed- (из одного блока), например, не могут встречаться в одном слове, а -ac- и -ĉj- (из разных) могут?
Вообще-то тоже нет, но это более частный случай.
Alec писал(а):А суффиксы последнего блока могут встречаться вместе?
Какие-то могут, какие-то нет. В отдельные блоки я вынес те, которые не могут встречаться вместе гарантированно.
Debugger писал(а):Может, не надо это пихать в enum, а записать в type?
Type с сорока пятью полями? Не менее наворочено. Кроме того я собираюсь писать тип Word в базу.
Хакер писал(а):Советую во-первых использовать битфиелды для каждой группы
Не понял. Можно пример?
Хакер писал(а):Кроме того, наверняка есть суффиксы, совместимые только с конкретными частями речи.
В принципе часть речи в эсперанто однозначно определяется по окончанию, однако семантический анализ хочу сделать уже после морфологического, да и окончаний может быть два. Хотелось бы эту задачу решить чисто математически.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Enum для суффиксов

Сообщение Хакер » 06.12.2009 (Вс) 20:22

Antonariy писал(а):Не понял. Можно пример?

Ну в VB их нет в доступном виде. Пример чего ты хотел?
Antonariy писал(а):В принципе часть речи в эсперанто однозначно определяется по окончанию, однако семантический анализ хочу сделать уже после морфологического, да и окончаний может быть два. Хотелось бы эту задачу решить чисто математически.

А это и есть чисто математическое, вернее даже чисто информатическое решение.

Биты всего-лишь развевают неопределённость. Если у тебя есть 32 состояния, ты можешь дать каждому номер и факторизовать его по основанию 2, полученные пять единиц и нулей сопоставить битам, можешь разделить состояния на 4 группы, и для идентификации состояния задавать номер группы (их 4, следовательно требуется 2 бита) и номер элемента группы (в каждой по 8, следовательно требуется 3 бита). Каким бы извращённым не был способ представления какого-то целого числа из промежутка от Математическая формула: \left[0; N\right), как ни крути, для это потребуется Математическая формула: \operatorname{ceil}(\log_2N) бит.

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

Математика, да и только.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Лингвистика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList