Skip to content

Instantly share code, notes, and snippets.

@vantral
Last active February 22, 2023 19:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vantral/c1df22d7b7cfbc569fe46b65bb56edac to your computer and use it in GitHub Desktop.
Save vantral/c1df22d7b7cfbc569fe46b65bb56edac to your computer and use it in GitHub Desktop.

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

Цель

Научиться хранить разборы глоссированного текста (ссылка) в виде объектов в питоне.

Дано

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

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 – причастие прошедшего времени

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment