# Домашнее задание по классам ## Цель Научиться хранить разборы глоссированного текста ([ссылка](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 – причастие прошедшего времени