# Домашнее задание по классам

## Цель

Научиться хранить разборы глоссированного текста ([ссылка](https://raw.githubusercontent.com/vantral/files/main/sentence.txt)) в виде объектов в питоне.

## Дано

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

```python
class Word:

    allowed_languages = ['русский', 'английский']


    def __init__(self, glossed: str, gloss: str, language: str):
        self.glossed = glossed
        self.gloss = gloss

        language = language.lower()

        if language not in self.allowed_languages:
            decision = input(
                'Языка нет в списке доступных. '\
                'Желаете его добавить? [д/н]'
                )
            if decision.lower() in ['да', 'д']:
                self.allowed_languages.append(language)
                self.language = language
            else:
                raise ValueError(
                    f'Выберите поддерживаемый язык, список '\
                    f'поддерживаемых языков: {self.allowed_languages}'
                    )
    

    def count_morphemes(self, delimiters: List[str]) -> int:
        delimiters = delimiters.replace('-', '') + '-'
        return len(re.split(f'[{delimiters}]', self.glossed))


    def __len__(self) -> int:
       word = re.sub(r'[-.=:]', '', self.glossed)
       return len(word)


    def __str__(self) -> str:
        return f'{self.glossed}\n{self.gloss}'
    
    __repr__ = __str__
```

## Что нужно сделать

Заведите класс `Sentence` для предложения. Храните в нём слова текста и какую-нибудь релевантную для предложения информацию. Мы не предлагаем, но и не ограничиваем конкретную реализацию. Но важно, чтобы по экземпляру предложения можно было получить доступ к конкретным словоформам из него. Кроме этого мы просим вас реализовать 2 разумных для этого класса метода: подумайте, что может быть интересно получать из предложения. Методы начинающиеся с двух нижних подчёркиваний не считаются (то есть метод `__len__` можно реализовать, но он не будет учтён).

После этого обработайте предложения из файла и покажите работу вашего метода на них.

## Дополнительно

Заведите отдельные классы `Noun` и `Verb` для имени существительного и глагола, унаследованные от класса `Word`. По экземпляру класса должно быть понятно, к какой части речи относится слово. Храните отдельным атрибутом эту информацию. При этом сделайте так, чтобы при попытке получить этот атрибут у класса `Word` программа не падала с ошибкой, а выдавала что-то разумное.

Для классов `Noun` и `Verb` заведите отдельные методы, которые работают следующим образом:

| метод                | что делает                                                                                                                                                 |
|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Noun.get_number()    | выдаёт, в каком числе стоит имя: `SG` (отсутствие маркера) или `PL` (наличие маркера плюралиса)                                                            |
| Noun.get_poss()      | выдаёт, какой посессивный маркер находится на имени; посессивный маркер всегда начинается с POSS; если такого нет, то вернуть `None`                         |
| Noun.get_case()      | выдаёт, в каком падеже стоит имя; падеж – это такая морфема, которая идёт сразу после числа, но до посессивности                                     |
| Verb.get_agreement() | выдаёт, какая морфема согласования висит на глаголе; согласовательные маркеры всегда выглядят одинаково 1SG, 2SG и т. д.; если такого нет, то вернуть `None` |

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

Простые признаки, по которым можно понять, что какое-то слово является глаголом или именем:

Только имя: может нести на себе маркер посессивности

Только глагол: может быть в форме конверба (CVB), иметь маркер согласования (без POSS), иметь маркер времени (PST, FUT, NFUT)

Про некоторые слова вы не сможете понять, к какой части речи они относятся, это нормально. В таких случаях их нужно заносить в класс `Word`. Скорее всего у вас не получится сделать так, чтобы в классе `Noun`/`Verb` были все существительные/глаголы и только они. Опирайтесь на данные подсказки, а за дополнительные рассуждения можно получить один бонусный балл.

## Критерии оценивания

* +2 балла: есть рабочие классы `Sentence` и `Word`, из экземпляра класса `Sentence` можно получать слова
* по +1 баллу: каждый метод класса `Sentence`
* +2 балла: обработаны предложения из текстового файла и показана работа методов
* +1 балл: есть классы `Noun` и `Verb`, унаследованные от `Word` и хранящие часть речи + код не падает, если попросить у `Word` часть речи
* по +0.5 балла: каждый метод для `Noun` и `Verb`
* +1 балл: придуманно более умное разделение на части речи с опорой на реальные предложения

## Дедлайн

5 марта, 23:59

## Список глосс из текста (если кому-то важно)

1pl – первое лицо множественное число

1sg – первое лицо единственное число

3pl – третье лицо множественное число

3sg – третье лицо единственное число

acc – аккузатив

ad – некоторая актантная деривация (в зависимости от контекста то пассив, то каузатив)

ag.prof – некоторая номинализация

caus – каузатив

dat – датив

dem.dist – дистантный демонстратив

dem.q – основа демонстратива, использующегося в вопросах и косвенной речи

emph – эмфаза

exc – (мы) эксклюзивное (не включает адресата)

freq – фреквентатив (аспект со значением часто)

fst – фальстарт

idk – неизвестная морфема

inc – (мы) инклюзивное (включает адресата)

loc – локатив

nfut – небудущее время

obl – основа косвенных падежей

pl – множественное число

poss.1sg – посессивность первого лица единственного числа (мой)

poss.3pl – посессивность третьего лица множественного числа (их)

poss.3sg – посессивность третьего лица единственного числа (его/её)

prog – прогрессив

pst – прошедшее время

ptc.pst – причастие прошедшего времени