Научиться хранить разборы глоссированного текста (ссылка) в виде объектов в питоне.
Используйте вот этот класс, который мы обсуждали на семинаре в качестве основы. Его можно менять, но на его структуру надо опираться.
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 – причастие прошедшего времени