Как сделать опрос в беседе в вк: Опросы в ВК — как создать + ТОП-6 идей

Как сделать интеллектуального чат-бота для проведения опросов/интервью / Хабр

В современном мире всё большую популярность приобретает методика под названием customer development для тестирования идей и гипотез о будущем продукте. Методику придумал «крёстный отец Кремниевой долины» Стив Бланк.
Одним из числа сильных инструментов в «разработке клиентов» является интервью, когда вы можете побеседовать с респондентом. Однако им не всегда можно воспользоваться ввиду разных причин, которые условно можно свести к объёму бюджета и имеющемуся времени. Но во многих ситуациях можно воспользоваться опросом. Причём опросом, который можно автоматизировать за счёт применения чат-бота и нейронной сети для определения смысла слов, которые написал респондент в ответ на заданный вопрос.

В этой статье сконцентрируюсь на алгоритме работы чат-бота для проведения опроса. Как сделать чат-бота для VK писал в отдельной статье на Хабре. Использовал: Python, MySQL, API VK и готовую нейросеть от RusVectores.

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

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

Содержание

  • Нейросеть для понимания смысла текста, вводимого пользователем

  • База данных для хранения вопросов интервью

  • Описание алгоритма работы чат-бота

Нейросеть для понимания смысла текста, вводимого пользователем

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

В данном решении была использована готовая нейросеть от сервиса RusVectores, обученная на корпусе НКРЯ с использованием алгоритма word2vec CBOW с длиной вектора 300.

НКРЯ – это совокупность русскоязычных текстов, Национальный Корпус Русского Языка в полном объёме. Содержит 270 миллионов слов, объём словаря 189 193 слова.

Word2vec CBOW — алгоритм, благодаря которому слово на естественном языке представляется в виде числового вектора. Т.е. определяет «координату» слова в «смысловом пространстве». CBOW – это аббревиатура Continuous Bag of Words. Она обозначает алгоритм, который есть в word2vec. Данный алгоритм называют моделью «мешка слов», он предсказывает слово по контексту. Ещё один алгоритм в word2vec — Skip-gram предсказывает контекст по слову.

С помощью данных алгоритмов генерируют близкие по смыслу слова при запросе в поисковой системе, сравнивают документы по смыслу, определяют смысловую близость слов и предложений.

Более подробно о word2vec можно почитать в статье «Немного про word2vec: полезная теория».

О векторном представлении слов (эмбеддинге) хорошо и с примерами описано в статье «Что такое эмбеддинги и как они помогают машинам понимать тексты».

Представление слова в виде вектора позволяет оценивать его смысловую близость с другими словами, так же представленными в виде вектора. Для оценки близости слов можно вычислить косинус угла между их векторами. Чем ближе к 1 будет косинус угла между векторами слов, тем они ближе по смыслу. Единице будет соответствовать косинус угла 0 градусов, т. е. когда векторы слов совпадают.

Чтобы создать такой набор векторов почти для 200 000 слов и постоянно иметь к ним доступ, нужно располагать вычислительными мощностями. Т.к. у меня таких мощностей нет, я воспользовался доступным онлайн сервисом RusVectores.

База данных для хранения вопросов

Для проведения опроса я подготовил табличку с вопросами и разместил её в базе данных MySQL. Как видно из рисунка ниже, вопросы имеют ответвления, похожие на древовидную структуру или структуру графа.

Структура вопросов

В базе данных таблица с вопросами выглядит так (фрагмент):

Фрагмент таблицы в БД с вопросами

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

Описание алгоритма работы чат-бота

Начало опроса

По договорённости с пользователем он заходит на страницу сообщества в ВК и инициирует диалог, нажав кнопку «Сообщение».

Бот здоровается и спрашивает разрешения начать опрос. Текст приветствия задавал в разделе «Управление»→ «Сообщения» на странице сообщества в ВК.

Если пользователь ответил что-то близкое по смыслу со словом «да», то бот начинает задавать вопросы. Как определить, что пользователь одобрил старт интервью? Для этого как раз нужна нейросеть, чтобы определить смысловую близость введённых пользователем слов к словам: да, можем, можно, начинай, ок. Для этого воспользуемся API сервиса RusVectores.

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

фрагменты кода из bot_methods. py

модуля, в котором реализованы все методы бота

def _identify_phrase(user_id, user_message):
    """
    identify start question or greeting
    return number of phrase in database
    """
    # identification variable, on start set "I don't know"
    identi = 'I dont know'
    # find in database current position in conversation between user and chatbot
    identi = get_current_position_in_conversation(user_id)
    if identi != 'err':
        # if the conversation has just begun
        if identi == '0':
            # define greetings
            similarity = _get_similarity(user_message, u'привет здравствуйте добрый')
            if similarity > 0.5:
                identi = "greetings"
            else:
                # define start interview or not
                identi = _start_or_not(user_message)
        # if the conversation continues
        elif identi == '1':
            # define start interview or not
            identi = _start_or_not(user_message)
        else:
            pass
            
    return identi

Вначале определим возможность начать опрос исходя из ответа пользователя с помощью метода _start_or_not():

def _start_or_not(user_message):
    """
    define <identi>: start or don't start interview
    """
    if user_message != 'старт' or user_message != 'Старт':
        _identi = 'I dont know'
        # define if user agree to start interview
        start = _get_similarity(user_message, u'да можем можно начинай ок')
        # define if user don't agree to start interview
        later = _get_similarity(user_message, u'нет позже потом завтра')
        if start > later and start > 0. 15:
            _identi = 'start'
        elif later > start and later > 0.15:
            _identi = 'later'
    else:
        _identi = "start"
    return _identi

Если пользователь решил сначала поприветствовать бота, то нужно понять это и поприветствовать в ответ. Для этого проверим на смысловую близость сообщения от пользователя со словами приветствия с помощью метода

_get_similarity(). Данный метод будет использоваться и далее для определения смысловой близости сообщений пользователя.

def _get_similarity(text1, text2):
    """
    Function return similarity between text1 and text2
    text1 - user message
    text2 - key words
    """
    text1.strip()  # delete empty space on start and end of string
    text2.strip()
    text1_words = text1.split(' ')
    text2_words = text2.split(' ')
    similarity = 0.0 # init variable
    try:
        for word1 in text1_words:
            if word1 != '':
                for word2 in text2_words:
                    if word2 != '':
                        # prepare url for request to API rusvectores. org
                        # url example https://rusvectores.org/ruscorpora_upos_cbow_300_20_2019/дело__папка/api/similarity/
                        url = '/'.join(['https://rusvectores.org/ruscorpora_upos_cbow_300_20_2019', 
                                        word1 + '__' + word2, 'api', 'similarity/'])
                        # GET request to API rusvectores.org
                        r = requests.get(url, stream=True)
                        # sum similarity of couple of words
                        similarity = similarity + float(r.text.split('\t')[0])
    except Exception as e:
        log_exception = str(e)
    # average similarity
    similarity = similarity/len(text2_words)
    # return similarity between text1 and text2
    return similarity

Переменная similarity содержит числовое обозначение смысловой близость фраз text1 и text2. Чем ближе similarity к 1, тем ближе фразы по смыслу.

Метод _identify_phrase() используется для обработки всех фраз, которые пользователь пишет в чат.

Поэтому необходимо заложить в него логику проверки как начального этапа — приветствие и старт интервью, так и последующее движение по вопросам. Для этого необходимо определять на каком вопросе и на какой развилке находится диалог. Текущую позицию в беседе определяем с помощью метода get_current_position_in_conversation()

фрагмент кода из mysqldb_methods.py
модуля, в котором реализованы все методы для работы с MySQL базой данных

def get_current_position_in_conversation(user_id):
    """
    find in database current position in conversation between user and chatbot
    using in bot_methods.py
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn.cursor()
        query = "SELECT `question_num` FROM `conversations` WHERE `user_id`=%(user_id)s LIMIT 1"
        cursor.execute(query, {'user_id': user_id})
        result = cursor.
fetchone() if result is None: identi = '0' else: identi = result[0] conn.close() except Exception as e: identi = 'err' return identi

Таким образом мы обрабатываем три сценария взаимодействия с чат-ботом:
— старт опроса (понимаем согласен пользователь начать опрос или нет с помощью функции _start_or_not()),
— обмен приветствиями, если пользователь поздоровался (понимаем по смысловой близости к словам приветствия с помощью функции _get_similarity());
— движение по структуре вопросов с помощью функции get_current_position_in_conversation()

для определения текущего положения в структуре вопросов.

Давайте рассмотрим движение по структуре вопросов более подробно.

Стоп-слова

Одним из важных моментов является удаление «стоп-слов», т.е. слов, которые можно с лёгкостью удалить из предложения и при этом его смысл не потеряется. Вот набор стоп-слов, которые я использовал в данном проекте:

stop_words = [
u'а',
u'большой',u'бы',u'быть',
u'в',u'весь',u'вот',u'всей',u'вы',
u'говорить',u'год',
u'для',u'до',
u'еще',u'если',
u'же',
u'знать',
u'и',u'из',u'или',
u'к',u'как',u'который',
u'мочь',u'мы',u'мне',
u'на',u'наш',u'него',u'нее',u'них',u'но',
u'о',u'один',u'она',u'они',u'оно',u'оный',u'от',u'ото',
u'по',
u'с',u'свой',u'себя',u'сказать',
u'та',u'такой',u'такое',u'только',u'тот',u'ты',u'то',
u'у',
u'что',
u'это',u'этот',
u'я'
]
stop_characters = [u'. ',u',',u' - ',u'- ',u' -',u':',u';',u'?',u'№',u'!',u'_',u'(',
u')',u'=',u'+',u"#",u'$',u'@',u'%',u'*',u'   ',u'<',u'>','1','2','3','4','5','6',
'7','8','9','0']

С помощью метода _clear_text() очищаю предложение от стоп-слов:

Движение по структуре вопросов

Для определения в каком направлении опроса двигаться исходя из ответов респондента воспользуемся функцией _define_conversation_way():

def _define_conversation_way(user_message, identi):
    """
    define in which way we are goin to?
    """
    # all questions, unless № 3 has two ways: 'yes' (positive) or 'no' (negative)
    if identi != '3' and identi != '6':
        yes = _get_similarity(user_message, u'да заказывал просить')
        no = _get_similarity(user_message, u'нет никогда')
    elif identi == '6':
        # the question number 6 has different ways: 'delivery' or 'self-delivery'
        yes = _get_similarity(user_message, u'заказываю доставку')
        no = _get_similarity(user_message, u'еду сам ищу аналог')
    elif identi == '3':
        # the question number 3 has different ways: 'from store' or 'delivery'
        yes = _get_similarity(user_message, u'магазин сам')
        no = _get_similarity(user_message, u'доставка почта все перечисленное курьер дом')
    if yes > no and yes > 0.
15: _way = 'yes' elif no > yes and no > 0.15: _way = 'no' else: _way = 'I dont know' return _way

Для удобства использования я сгруппировал всю логику по определению того что бот должен ответить в функцию _get_bot_answer(). Для удобства восприятия приведу ниже не только данный метод, а модуль с методами бота в целом:

bot_methods.py
полный код модуля, в котором реализованы все методы бота

# -*- coding: utf-8 -*-
"""
Bot methods.
Realizes all what bot can do.
"3. Использование API сервиса RusVectores"
https://github.com/akutuzov/webvectors/blob/master/preprocessing/rusvectores_tutorial.ipynb
"""
import re  # for work with regular expressions
import requests  # for using HTTP requests
from bot_config import stop_words
from bot_config import stop_characters
from mysqldb_methods import get_current_position_in_conversation
from mysqldb_methods import get_question_from_DB
from mysqldb_methods import write_current_question_number_for_user
def get_bot_answer(user_id, user_message):
    """
    using in views.
py make answer to user """ answer = '' # delete stop-words and punctuation characters in sentence user_message = _clear_text(user_message) # identify what to do: start or continue conversation identi = _identify_phrase(user_id, user_message) if identi == 'greetings': answer = get_question_from_DB('1') write_current_question_number_for_user(user_id, '1') elif identi == 'start': answer = get_question_from_DB('2') write_current_question_number_for_user(user_id, '2') elif identi == 'later': answer = "Когда у вас будет возможность пройти интервью напишите мне 'старт'." elif identi == 'I dont know': answer = "Я не совсем вас понимаю...\nУточните, пожалуйста." elif identi == 'end': answer = "Спасибо за ваше участие в интервью!" else: # if top-level question: 1, 2 or 3 etc. if len(identi) == 1: # define in which way we are goin to? way = _define_conversation_way(user_message, identi) if way == 'yes' or way == 'no': if way == 'yes': # going to positive way question_num = '.
'.join([identi,'1','1']) if way == 'no': # going to negative way question_num = '.'.join([identi,'2','1']) answer = get_question_from_DB(question_num) if answer != 'None': write_current_question_number_for_user(user_id, question_num) else: question_num = str(int(identi) + 1) answer = get_question_from_DB(question_num) write_current_question_number_for_user(user_id, question_num) else: # if way='I dont know' answer = "Я не совсем вас понимаю...\nУточните, пожалуйста." else: # if subquestion: e.g. identi=2.1.1 or 3.2.2 etc. identi_numbers = identi.split('.') next_num = str(int(identi_numbers[2]) + 1) question_num = '.'.join([identi_numbers[0],identi_numbers[1],next_num]) answer = get_question_from_DB(question_num) # if we get end of subquestions in this top-level-question if answer == 'None': # going to the next top-level question question_num = str(int(identi_numbers[0]) + 1) # checking that the question is the last if _is_the_last_question(question_num): answer = get_question_from_DB(question_num) question_num = 'end' else: # is not the last question answer = get_question_from_DB(question_num) write_current_question_number_for_user(user_id, question_num) return answer def _is_the_last_question(question_num): """ define is the last question? by the condition (len(identi) == 1) of the function "get_bot_answer" question_num has lenght 1 """ is_the_last = True question_num = str(int(question_num) + 1) question = get_question_from_DB(question_num) if question != 'None': is_the_last = False return is_the_last def _define_conversation_way(user_message, identi): """ define in which way we are goin to? """ # all questions, unless № 3 has two ways: 'yes' (positive) or 'no' (negative) if identi != '3' and identi != '6': yes = _get_similarity(user_message, u'да заказывал просить') no = _get_similarity(user_message, u'нет никогда') elif identi == '6': # the question number 6 has different ways: 'delivery' or 'self-delivery' yes = _get_similarity(user_message, u'заказываю доставку') no = _get_similarity(user_message, u'еду сам ищу аналог') elif identi == '3': # the question number 3 has different ways: 'from store' or 'delivery' yes = _get_similarity(user_message, u'магазин сам') no = _get_similarity(user_message, u'доставка почта все перечисленное курьер дом') if yes > no and yes > 0. 15: _way = 'yes' elif no > yes and no > 0.15: _way = 'no' else: _way = 'I dont know' return _way def _identify_phrase(user_id, user_message): """ identify start question or greeting return number of phrase in database """ # identification variable, on start set "I don't know" identi = 'I dont know' # find in database current position in conversation between user and chatbot identi = get_current_position_in_conversation(user_id) if identi != 'err': # if the conversation has just begun if identi == '0': # define greetings similarity = _get_similarity(user_message, u'привет здравствуйте добрый') if similarity > 0.5: identi = "greetings" else: # define start interview or not identi = _start_or_not(user_message) # if the conversation continues elif identi == '1': # define start interview or not identi = _start_or_not(user_message) else: pass return identi def _start_or_not(user_message): """ define <identi>: start or don't start interview """ if user_message != 'старт' or user_message != 'Старт': _identi = 'I dont know' # define if user agree to start interview start = _get_similarity(user_message, u'да можем можно начинай ок') # define if user don't agree to start interview later = _get_similarity(user_message, u'нет позже потом завтра') if start > later and start > 0. 15: _identi = 'start' elif later > start and later > 0.15: _identi = 'later' else: _identi = "start" return _identi def _clear_text(sentence): """ delete stop-words and punctuation characters in sentence """ try: # sentence to low-case sentence = sentence.lower() # delete stop-characters for char in stop_characters: sentence = sentence.replace(char, '') # delete stop-words words_of_sentence = sentence.split(' ') result = '' for word in words_of_sentence: if word not in stop_words: result = result + ' ' + word except Exception as e: result = str(e) return result def _get_similarity(text1, text2): """ Function return similarity between text1 and text2 :param text1: user message :param text2: key words """ text1.strip() # delete empty space on start and end of string text2.strip() text1_words = text1. split(' ') text2_words = text2.split(' ') similarity = 0.0 # init variable try: for word1 in text1_words: if word1 != '': for word2 in text2_words: if word2 != '': # prepare url for request to API rusvectores.org # url example http://rusvectores.org/araneum_none_fasttextcbow_300_5_2018/дело__папка/api/similarity/ url = '/'.join(['http://rusvectores.org/araneum_none_fasttextcbow_300_5_2018', word1 + '__' + word2, 'api', 'similarity/']) # GET request to API rusvectores.org r = requests.get(url, stream=True) # sum similarity of couple of words similarity = similarity + float(r.text.split('\t')[0]) except Exception as e: log_exception = str(e) # average similarity similarity = similarity/len(text2_words) # return similarity between text1 and text2 return similarity

Как видно из кода, с помощью метода write_current_question_number_for_user() бот сохраняет в базу данных текущую позицию в диалоге с пользователем. Это необходимо для того, чтобы бот понимал какой следующий вопрос нужно задать респонденту.
Функция get_question_from_DB() возвращает текст вопроса из базы данных для того, чтобы бот задал его в чате.

Для удобства приведу полный код модуля с методами для работы с базой данных:

mysqldb_methods.py
полный код модуля, в котором реализованы все методы для работы с MySQL базой данных

# -*- coding: utf-8 -*-
"""
Methods for work with MySQL database.
"""
import MySQLdb  # before using it do in ssh: pip install mysqlclient
""" 
import configuration variables for connect to MySQL database:
"""
from mysqldb_config import HOST
from mysqldb_config import USER
from mysqldb_config import PASSWORD
from mysqldb_config import DATABASE
def write_current_question_number_for_user(user_id, question_num):
    """
    write question number to database for this user
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn. cursor()
        if question_num == '2':
            query = (
                "INSERT INTO `conversations`(`user_id`, `question_num`) "
                "VALUES (%s, %s)"
            )
            data = (user_id, question_num)
        else:
            query = (
                "UPDATE `conversations` "
                "SET `question_num`=%s "
                "WHERE `user_id`=%s "
            )
            data = (question_num, user_id)
        cursor.execute(query,data)
        conn.commit()  # commit transaction
        conn.close()
    except Exception as e:
        exception = str(e)
def get_current_position_in_conversation(user_id):
    """
    find in database current position in conversation between user and chatbot
    using in bot_methods.py
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn.cursor()
        query = "SELECT `question_num` FROM `conversations` WHERE `user_id`=%(user_id)s LIMIT 1"
        cursor. execute(query, {'user_id': user_id})
        result = cursor.fetchone()
        if result is None:
            identi = '0'
        else:
            identi = result[0]
        conn.close()
    except Exception as e:
        identi = 'err'
    
    return identi
def get_question_from_DB(question_num):
    """
    return question text from database
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn.cursor()
        query = "SELECT `question_text` FROM `questions` WHERE `question_num`=%(num)s LIMIT 1"
        cursor.execute(query, {'num': question_num})
        result = cursor.fetchone()
        if result is not None:
            question_text = result[0]
        else:
            question_text = "None"
        conn.close()
    except Exception as e:
        question_text = str(e)
    
    return question_text

Теперь для полноты картины приведу код скрипта, который резюмирует всю логику работы чат-бота.

скрипт views.py
«точка входа» для приёма сообщений пользователя и отправки ответов бота в чат

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import json
import threading  # for async executing tasks with VK API
import vk  # vk is library from VK
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
from django.http import HttpResponse
from bot_config import *  # import token, confirmation_token and over constants from bot_config.py
from bot_methods import get_bot_answer
@csrf_exempt  # exempt index() function from built-in Django protection
def index(request):  # requested url
    if (request.method == "POST"):
        data = json.loads(request.body)  # take POST request from auto-generated variable <request.body> in json format
        if (data['secret'] == secret_key):  # if json request contain secret key and it's equal my secret key
            if (data['type'] == 'confirmation'):  # if VK server request confirmation
                """
                For confirmation my server (webhook) it must return
                confirmation token, which issuing in administration web-panel
                your public group in vk. com.
                Using <content_type="text/plain"> in HttpResponse function allows you
                response only plain text, without any format symbols.
                Parameter <status=200> response to VK server as VK want.
                """
                # confirmation_token from bot_config.py
                return HttpResponse(confirmation_token, 
                                    content_type="text/plain", 
                                    status=200)
            if (data['type'] == 'message_new'):  # if VK server send a message
                # t - is new thread to async execute answer_to_message()
                t = threading.Thread(target=_answer_to_message, args=(data,))
                t.start()
                return HttpResponse('ok', content_type="text/plain", status=200)
    else:
        return HttpResponse('see you :)')
# send anser to user message
def _answer_to_message(data):
    session = vk.Session()
    api = vk.API(session, v=5.5)
    user_id = data['object']['user_id']
    user_message = data['object']['body']
    # get bot answer
    answer = get_bot_answer(user_id, user_message)
    # token from bot_config. py
    api.messages.send(access_token = token, user_id = str(user_id), message = answer)

О том как устроена структура файлов приложения, его настройка описывал в подробностях в отдельной статье на Хабре.

Успехов!

Уверен, что для решения изложенной задачи существуют более элегантные решения и подходы. Несмотря на это надеюсь что изложенный материал найдёт своего читателя и будет полезен как в целом, так и в каких-то аспектах.
Желаю всем интересных проектов и успехов в их реализации!

Вкус жизни – Учительская газета

Впервые я увидела этого руководителя Челябинской области в одном из институтов повышения квалификации работников образования. Людмила Николаевна СМУШКЕВИЧ, кандидат педагогических наук, почетный работник общего образования РФ, директор Академического лицея Магнитогорска, выступала так, словно родилась у микрофона. Спокойна, обаятельна, убедительна, все было сказано по делу, понятно и искренне. Потом выяснится, что быть такой смелой в публичных выступлениях она училась еще в школе, о которой до сих пор вспоминает тепло и с благодарностью. Сейчас, когда у нее за плечами почти двадцатилетний опыт руководства одним из престижных учреждений области, очень интересно поговорить о том, как воспитывались лидерские качества директора, а также о том, как занятия спортом влияют на личную жизнь.

Людмила СМУШКЕВИЧ

 

Родилась она в Челябинске, крупном промышленном городе-миллионнике. С первого и до выпускного класса постигала азы коммуникативных навыков в советской школе, начиная с должности командира октябрятской звездочки до секретаря комсомольской организации, была и командиром пионерского отряда, а все стадии взросления вписаны в историческую летопись общеобразовательной школы №6 Челябинска. Надо ли говорить, что Людмиле хотелось и удавалось активно участвовать во всех школьных мероприятиях! Это была веселая жизнь, вне всякого сомнения. Представьте себе школьницу, которая, к примеру, очень любит собирать макулатуру. Где? По домам своих земляков. Ходила с одноклассниками по микрорайону, по квартирам, весело общаясь и собирая вторсырье, включая металлолом. Тут уж честно придется сказать: после таких суперсборов представители некоторых близлежащих предприятий приходили в школу, справедливо обращаясь с просьбами вернуть им запчасти, фрагменты заборов и ворот. А какие и у кого претензии к школьникам? Они ведь стараются стать лучшими по всем показателям. Неприятные ситуации разрешались легко, взрослые с пониманием относились к своим юным землякам, желающим навести порядок и в родном дворе, и в городе. С чего-то надо начинать, согласитесь.

В школе будущий учитель и педагог занималась не только воспитанием сверстников, приемом в комсомол, проведением собраний, диспутов, но и подпиской пионеров и комсомольцев на газеты и журналы. Это был своего рода «индикативный показатель эффективной работы» детских организаций. А вот летом, по собственному признанию, от нечего делать постоянно с подружками ходила в школу и помогала библиотекарю – клеила формуляры, ремонтировала книжные издания, разносила задолжникам напоминания о необходимости сдать книги. Активность и жизнерадостность – это, наверное, главные черты характера, повлиявшие на дальнейшую жизнь.

Людмила всегда очень много читала, успевая переделать кучу дел. Интересным был и опыт участия в инструктивных сборах городского актива в лагере в Юрюзани. Эти встречи запечатлелись в памяти на всю жизнь. Организаторы постарались, чтобы каждый день у активистов были новые тема, девиз, командир. Другими словами, каждый побывал на месте руководителя отряда. За один день успевали столько, сколько другие и за месяц не успеют: пели, танцевали, учили и обучались, а главное – наша героиня всем своим видом демонстрировала, что занимается этим давно и успешно. У Людмилы получалось все. Ну или почти все. А почему, спрашивается? Да потому, что однажды решила: если ты лидер, то проигрывать некрасиво, да и незачем, поэтому надо быть на высоте, все успевать и держать марку.

Может показаться неожиданным, но немало методик для развития лидерских навыков из тех времен директор академического лицея и сегодня применяет в работе. Они ведь проверены временем и неизменно дают отличные результаты. Людмила Николаевна по натуре лидер, ей важно быть в числе лучших из лучших, чтобы не затеряться в толпе и получать удовольствие от всего, что делаешь. Раньше, когда еще многие помнили советские фильмы, в беседе с учениками, когда речь заходила о модных профессиях, Смушкевич всегда говорила, что можно стать даже королевой бензоколонки, как в одноименной кинокартине, главное, чтобы работать с душой и украшать собой любое дело. Убеждала, что всегда, во все времена в моде профессионалы, и не важно, какую сферу выберешь, лишь бы дело было по душе!

Конечно же, жизненный ритм школьницы Людмилы задавали и занятия спортом. Интуитивно наша героиня чувствовала, что спорт кардинально изменит ее жизнь. Волейбол, легкая атлетика, плавание – все это было испытанием для девочки, и надо было пройти его достойно. В старших классах добавилась секция гребли на байдарках. Спорт, к слову, удалось совмещать с театральными занятиями во Дворце пионеров имени Н. К.Крупской. Еще были в ее жизни и кружки «Умелые руки», «Юный натуралист», Школа юных журналистов. А потом Физико-математическая воскресная школа при ЧПИ, ныне ЮРГУ.

Я внимательно слушаю Людмилу Николаевну и пытаюсь задать вопрос (с такой радостью она рассказывает о своем советском детстве, что не хочется перебивать): «А когда же вы учились?». Пословица «И швец, и жнец, и на дуде игрец» точно про Смушкевич, ее неуемный характер сегодня известен всему педагогическому коллективу лицея, да и ученикам, конечно же.

Немало из своего радостного и удивительного советского детства привнесла Людмила Николаевна в профессиональную деятельность: работая в школе №39 Магнитогорска, создала там школьный музей, была руководителем краеведческого кружка и до сих пор сохранила интерес к этой теме, ведь на ней сегодня руководство детскими исследовательскими работами по краеведению. Окидывая взглядом взрослого человека искания детских лет, наша героиня хорошо понимает, как много они дали для ее становления как личности. Ведь возможность коммуникаций тогда была просто неограниченной, дети буквально росли во дворах, в секциях, детских клубах по месту жительства, учились общаться и находить общий язык со всеми – и сверстниками, и взрослыми.

Среди ее друзей не все были отличниками и паиньками, были и хулиганы. Любопытно, что в классе за Людмилой всегда закрепляли не­успевающих, поручали шефствовать над трудными подростками. Она и сейчас хорошо помнит своих подопечных по именам и фамилиям. Проверяла у них домашние задания, помогала учить стихи и даже писала за них сочинения, так как научить этому сложно, проще было самой все сделать.

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

Но что же дальше? «Умелые руки» впрок не пошли, занятия в кружке юннатов нравились, однако все же надо было сосредоточиться на чем-то одном. Выбор был сделан в пользу театральной студии и Школы юных журналистов. Живы воспоминания о том, как, к примеру, искали экспонаты для школьного музея, ездили по всему городу, собирая воспоминания о школе выпускников разных лет, готовили вечер встречи выпускников к юбилею школы.

О профессии учителя Людмила Николаевна никогда не мечтала, никакой привлекательности в ней не находила. Тем не менее в силу своего желания делать добрые дела начиная с шестого класса всегда помогала педагогам проверять тетради, приходила домой из школы с пачками чужих работ, а в старших классах ей уже доверяли проводить уроки, заменяя учителей. Особенно нравились география и биология, было все понятно, да и знала она куда больше, чем требовала школьная программа. Проводила занятия даже в старших классах, где сидели более взрослые ребята, но все получалось хорошо, ее слушались. А было время, только представьте, заменяла на уроках заместителя директора!

Поступать в педагогический вуз решила неожиданно как для себя, так и для родителей. И причина была не в том, что решила стать педагогом, просто, участвуя в областных соревнованиях по гребле на байдарках, познакомилась с парнем, мастером спорта, чемпионом Урала, влюбилась и решила ехать поступать в Магнитогорск, а там было всего два вуза – педагогический и металлургический. Выбрала пед, решив стать учителем начальных классов.

Родители отнеслись к ее выбору с пониманием, поддержали, да и вряд ли бы они стали сильно спорить с дочкой-активисткой. Уже потом, после окончания Магнитогорского педагогического, проработав два года в школе, Людмила Николаевна поступила в Челябинский педагогический на заочное отделение естественно-географического факультета, окончила его и получила специальность учителя географии, обретя любимую профессию.

О смысле жизни, как выяснилось, директор Академического лицея Магнитки особо никогда не задумывалась, находя удовольствие в процессе. Жизнь для Смушкевич – свое­образный проект, где самое главное – это семья, дети, чтобы все были здоровы, счастливы, занимались любимым делом. Она руководствуется формулой счастья Ивана Бунина: «Человека счастливым делают три вещи: любовь, интересная работа, возможность путешествовать». С этим наша героиня согласна на все сто процентов. Все это у нее в жизни есть, поэтому директор Людмила Николаевна считает себя счастливым человеком. Относительно постановки целей жизни как-то так разумно получилось, что на каждом жизненном этапе они были свои: сначала хорошо окончить школу, затем поступить в институт, потом найти работу по душе, создать семью. Придет время, и для Смушкевич станет важным получить степень кандидата наук, причем писать диссертацию она будет, работая в школе, в статусе соискателя. С теплом в сердце вспоминает и благодарит Людмила Николаевна свою «научную маму» Тамару Кружилину, доктора педагогических наук, человека беспримерной доброты и бескорыстия, которая, несмотря на преклонный возраст, до сих пор работает в МГТУ, руководит диссертациями.

В основе жизненных принципов директора Академического лицея Людмилы Смушкевич любовь и общие интересы. Важно было вырастить детей, чтобы были здоровыми, спортивными, любили и почитали родителей. Младший сын – мастер спорта, в недавнем прошлом профессиональный хоккеист, обладатель Континентального кубка по хоккею с шайбой, играл во многих командах Континентальной хоккейной лиги, защищал честь сборной страны. Сейчас живет в Москве, руководит Детской хоккейной академией, которую сам же и создал, он также генеральный менеджер молодежной хоккейной команды Национальной молодежной хоккейной лиги. По образованию он психолог и тренер, а по роду деятельности – педагог. Поэтому для мамы всегда было и есть важно, ценно быть интересным собеседником, советчиком, другом своим взрослым детям как можно дольше.

Академический лицей для Смушкевич, по сути, ее авторская школа и единственное образовательное учреждение в Магнитогорске, которое является трижды ресурсным центром. Здесь высокий процент педагогов, имеющих степени кандидатов наук, и это не случайно, ведь когда-то лицей возник при Магнитогорском государственном университете, еще до его реформирования. Поэтому, если уж говорить о планах на будущее Людмилы Николаевны, то лицей – один из главных проектов ее жизни!

Улыбаясь, она цитирует одного из мудрецов: «В жизни не так важны цель и смысл, главное – ощущать вкус жизни. Ведь пирог вкуснее есть, чем рассуждать о нем». И добавляет, что для нее очень важно быть верной своим жизненным принципам: твори добро, будь честен, умей дружить, относись к людям так, как хотел бы, чтобы они относились к тебе!

Вера ЕВСТИГНЕЕВА, Магнитогорск, Челябинская область

Не удалось отследить компакт-диск с разговором с Теджиндером Сингхом: В. К. Сингх

НЬЮ-ДЕЛИ: Бывший командующий армией и профсоюзный министр В. К. Сингх сегодня сообщил суду Дели, что ему не удалось отследить компакт-диск, содержащий предполагаемый разговор между ним и генерал-лейтенантом (в отставке). Теджиндер Сингх о предполагаемом предложении взятки в размере 14 крор рупий, сделанном ему за заключение сделки с грузовиком Tatra.

В. К. Сингх, нынешний государственный министр иностранных дел, был представлен своим адвокатом, который сообщил специальному судье CBI Аджаю Кумару Джейну, что его клиент получил уведомление, выданное судом, о предоставлении записи разговора Теджиндеру Сингху, который был обвинен в обвиняемый CBI в случае.

Адвокат Атул Гулериа, представлявший интересы В. К. Сингха, сказал: «Мой клиент не может отследить компакт-диск, содержащий запись разговора между ним и Теджиндером Сингхом, поскольку он сменил шесть разных помещений, выделенных ему правительством с момента регистрации дела. »

Адвокат сообщил суду, что В. К. Сингх находился за пределами Индии по служебным обязанностям, наблюдая за эвакуацией индийцев из Йемена, и ему может быть предоставлено некоторое время, чтобы проинформировать суд о CD.

Затем судья попросил адвоката Сингха подать письменные показания относительно компакт-диска, чтобы дело могло продолжаться беспрепятственно.

«Истец В. К. Сингх просит в кратчайшие сроки подать показания под присягой в соответствии с предыдущим приказом о предоставлении компакт-диска с записью разговора генерал-лейтенанту (в отставке) Теджиндеру Сингху, поскольку он находится за пределами Индии по официальным причинам. Время предоставлено. письменные показания и доводы по обвинению 2 мая», — говорится в сообщении суда.

Суд направил уведомление В. К. Сингху с просьбой выполнить его более раннее распоряжение о предоставлении обвиняемому предполагаемой записи разговора.

CBI предъявил Теджиндеру Сингху обвинение в том, что он предложил 14 крор рупий в качестве взятки бывшему командующему армией за очистку файла для покупки 1676 грузовиков Tatra по цене 1193,04 крор рупий.

Теджиндеру Сингху предъявлено обвинение в совершении преступления, наказуемого в соответствии со статьей 12 Закона о предотвращении коррупции.

CBI собрал 20 свидетелей обвинения, в том числе тогдашнего министра обороны А.К. Энтони, Т.К.А. Наира, тогдашнего советника премьер-министра и В.К. Сингха, и подал комплект из 18 документов вместе с обвинительным заключением.

CBI сообщило, что, по словам В. К. Сингха, когда он сообщил об инциденте с предполагаемым предложением взятки Теджиндером Сингхом, тогдашний министр обороны «выразил шок».

Агентство в своем обвинительном заключении утверждало, что во время расследования бывший командующий армией утверждал, что записал предполагаемый разговор между ним и Теджиндером Сингхом 22 сентября 2010 г. , но «то же самое не было предоставлено им (В. К. Сингх ) в следственный орган, несмотря на усилия».

CBI утверждал, что В. К. Сингх сказал, что 22 сентября 2010 года во время встречи в его офисе Теджиндер Сингх якобы предложил ему взятку в размере 14 крор рупий, чтобы очистить файл для закупки грузовиков Tatra к первой неделе Октябрь.

Агентство также утверждало, что до предполагаемого предложения взятки у Теджиндера Сингха и В. К. Сингха были «отличные рабочие отношения».

Агентство также утверждало, что жалоба и заявление, данные В. К. Сингхом, были «должным образом подтверждены» цепью обстоятельств, доказывающих, что Теджиндер Сингх предложил ему взятку в размере 14 крор рупий за очистку файла, касающегося грузовиков Tatra.

19 октября 2012 года против Теджиндера Сингха было возбуждено дело по жалобе генерала В. К. Сингха.

В.К. Сасикала намекает на попытки восстановить контроль над AIADMK, политическое возвращение

В.К. Сасикала, уволенная из AIADMK несколько лет назад, намекнула на возобновление усилий по восстановлению контроля над партией, политическое возвращение, рассказав своим сторонникам что скоро будет «хорошее решение». Заявив перед выборами в Ассамблею 6 апреля, что она будет держаться подальше от политики, Сасикала сказала, что не видит, как партия разваливается из-за «распри». Ее упоминание о фьюд, хотя и не имеет прямого упоминания об AIADMK или его руководстве, рассматривается как указание на предполагаемые разногласия между двумя высшими лидерами, К. Паланисвами и О. Паннеерсельвамом. Доверенное лицо покойного главного министра Дж. Джаялалитаа, краткий разговор Сасикалы с двумя ее сторонниками по телефону всплыл на поверхность, и это намекнуло на ее переосмысление. В первом аудиоклипе слышно, как она говорит: «Мы обязательно упростим вечеринку… конечно, я приду». Во втором слышно, как она говорит стороннику, что партия, по-видимому, отсылка к AIADMK, была построена упорным трудом лидеров, включая ее, и было мучительно видеть, как «они сражаются», и она не могла быть немым зрителем. вечеринка из-за этого испорчена. Поэтому Сасикала сказала, что скоро приедет и встретится со сторонниками после того, как вторая волна коронавируса утихнет. Партия могла быть приведена в хорошую форму, и не о чем было беспокоиться. Скоро будет хорошее решение, и она скоро придет, сказала она. Это рассматривается как намек на возобновление усилий по восстановлению контроля над AIADMK, который она и ее племянник Дхинакаран потеряли много лет назад, после того как она была заключена в тюрьму в феврале 2017 года после осуждения по делу о несоразмерных активах. Известные как EPS и OPS, Паланисвами и Паннирсельвам, как сообщается, не сходятся во взглядах, и они делают индивидуальные заявления по политическим вопросам, но делают совместные заявления по партийным вопросам. Представитель AIADMK и государственный совместный секретарь юридического крыла Р. М. Бабу Муругавел сказал: «Нам нечего делать с ее комментариями». Упоминание Сасикалы, включая распри, будет иметь отношение только к АММК, и этот вопрос касается только этой партии, и AIADMK не имеет ничего общего с ее комментариями, сказал он PTI. В марте этого года Сасикала заявила, что «она будет держаться подальше от политики», но будет молиться за «золотое правило» Джаялалитаа. Сасикала стал временным генеральным секретарем AIADMK после кончины Джаялалайтаа в 2016 году, и это назначение было отменено на заседании генерального совета в 2017 году, а также было объявлено об отмене всех назначений, сделанных Дхинакараном. На этом собрании также были созданы новые должности координатора и сокоординатора для OPS и EPS соответственно, что дало им все полномочия, и их фракции объединились, в то время как Сасикала и ее последователи были вытеснены. С тех пор AIADMK ясно дал понять, что возможности для сближения с Сасикалой или ее родственниками не было. В конце концов, Дхинакаран запустил Amma Makkal Munnetra Kazhagam (AMMK) в 2018 году и часто говорил, что поиск AIADMK был целью его команды. Дело Сасикалы, оспаривающее решения генерального совета AIADMK 2017 года, в том числе отстранение ее от должности временного генерального секретаря, находится на рассмотрении в городском гражданском суде, и дело назначено на следующее слушание 18 июня, сообщил PTI ее адвокат. Дхинакаран, который ранее также был заявителем, впоследствии отказался от участия, поскольку руководил АММК.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *