Skip to content

Instantly share code, notes, and snippets.

@Sapunov
Last active December 5, 2018 08:46
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 Sapunov/6c25414ce71b760ee166942d753e0d70 to your computer and use it in GitHub Desktop.
Save Sapunov/6c25414ce71b760ee166942d753e0d70 to your computer and use it in GitHub Desktop.

Контрольная работа № 1

Для работы нужно использовать частотный словарь русского языка - https://goo.gl/1Q6fxq

В файле на каждой строчке записано слово, морфологическая информация о нем (часть речи, число и т.д.) в виде списка тегов, а затем его частотность в ipm (items per million).

Пример морфологической информации:

а|союз|9808.61 - союз

абажур|сущ неод ед муж им|7.77 - существительное, неодушевленное, единственное число, мужской род, именительный падеж


Все решение контрольной работы принимается единым файлом.

Каждое задание должно быть оформлено в виде отдельной функции. Разрешается и приветствуется использование вспомогательных функций.

Пример итогового файла:

FILENAME = 'freq.txt'


def task_01():
    '''Решение для первого задания, которое просто что-то печатает и ничего не возвращает'''
    pass


def task_02():
    '''Решение для второго задания, которое просто что-то печатает и ничего не возвращает'''
    pass


def task_03():
    '''Решение для третьего задания, которое просто что-то печатает и ничего не возвращает'''
    pass

Оценки

5 баллов - одна задача

8 баллов - две задачи

10 баллов - три задачи

Задание 1

Программа должна открыть частотный словарь в кодировке UTF-8 и корректно вывести на экран только те строчки, которые подходят под условия:

  • длина слова строго больше 2 символов
  • 2 первые буквы слова равны двум последним буквам слова

Например, строка ажиотаж|сущ неод ед муж им|3.06. Тут у слова первые 2 буквы равны двум последним - аж.

Задание 2

Программа должна распечатать через запятую все существительные женского рода единственного числа, ipm которых строго больше 100.

После списка на отдельной строке напечатать самый большой ipm, который есть у выведенных слов.

Задание 3

Программа должна спрашивать у пользователя слова, пока тот не введёт пустое слово.

После этого она должна для каждого слова распечатать:

  • само слово
  • морфологическую информацию о слове
  • ipm слова

Если слово не встретилось в словаре, то нужно вывести сообщение о том, что слово не нашлось. Если пользователь пишет с телефона и ввел слово с большой буквы, то оно все равно должно найтись.

# Путь к файлу должен быть свой. У меня такой:
FILENAME = '../freq.txt'
###############################################################################
# Общая функция для всех заданий
###############################################################################
def get_lines(filename):
'''
Читает файл и возвращает все его строки в виде списка
'''
lines = []
with open(filename, encoding='utf-8') as fid:
for line in fid:
line = line.strip()
lines.append(line)
return lines
###############################################################################
# Все для решения первого задания
###############################################################################
def task_01():
'''
Решение первого задания
'''
lines = get_lines(FILENAME)
for line in lines:
word, morph, ipm = line.split('|')
if len(word) > 2 and word[:2] == word[-2:]:
print(line)
###############################################################################
# Все для решения второго задания
###############################################################################
def task_02():
'''
Решение второго задания
'''
max_ipm = 0
filtered_words = []
lines = get_lines(FILENAME)
for line in lines:
word, morph, ipm = line.split('|')
ipm = float(ipm)
morph = morph.split()
if 'сущ' in morph and 'жен' in morph and 'ед' in morph and ipm > 100:
filtered_words.append(word)
if ipm > max_ipm:
max_ipm = ipm
print(', '.join(filtered_words))
print('Самый большой ipm:', max_ipm)
###############################################################################
# Все для решения третьего задания
###############################################################################
def find_word_index(input_word, words):
'''
Ищет переданное слово в списке words и возвращает его индекс.
Если слово не найдено, возвращает -1
'''
input_word = input_word.lower()
for i, word in enumerate(words):
if input_word == word:
return i
return -1
def get_words(lines):
'''
Проходит по списку строк из файла и формирует список только слов без
морфологической информации и ipm.
'''
words = []
for line in lines:
word, morph, ipm = line.split('|')
words.append(word)
return words
def task_03():
'''
Решение для 3 задания
'''
lines = get_lines(FILENAME)
words = get_words(lines)
while True:
input_word = input('Введите слово:')
if not input_word:
break
result_index = find_word_index(input_word, words)
if result_index >= 0:
print(lines[result_index])
else:
print('Ничего не нашлось :(')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment