예제 #1
0
        public MainViewModel()
        {
            var dbContext      = new NureBotDbContext(false);
            var unityContainer = new UnityContainer();

            dbContext.Database.Initialize(true);
            ContainerBoostraper.RegisterTypes(unityContainer, dbContext, "356520093:AAGKBe8YFpR5_5WIkGfoeRbdTMuOKE2O9GQ");

            Bot               = unityContainer.Resolve <TelegramBotClient>();
            UService          = unityContainer.Resolve <IUserService>();
            RecognitionSystem = unityContainer.Resolve <OscovaBot>();

            Bot.OnMessage      += Bot_OnMessageAsync;;
            Bot.OnReceiveError += Bot_OnReceiveError;;

            RecognitionSystem.Dialogs.Add(new CistDialog());
            RecognitionSystem.Dialogs.Add(new WeatherDialog());

            RecognitionSystem.MainUser.Context.SharedData.Add(Bot);
            RecognitionSystem.MainUser.Context.SharedData.Add(UService);
            RecognitionSystem.Language.Stemmer   = new RussianStemmer();
            RecognitionSystem.Language.StopWords = StopWordsGenerator.GenerateRussianStopWords();

            RecognitionSystem.Trainer.StartTraining();
            RecognitionSystem.Recognizers.Clear();
            RecognitionSystem.Recognizers.Add(new RuDateRecognizer());
            RecognitionSystem.Language.Culture.DateTimeFormat =
                CultureInfo.GetCultureInfo("ru-RU").DateTimeFormat;
            RecognitionSystem.Recognizers.Add(new GroupRecognizer());
            RecognitionSystem.CreateRecognizer("teacherName", new Regex(@"[А-Яа-я]+ [А-Яа-я]\.? [А-Яа-я]\.?"));


            RecognitionSystem.MainUser.ResponseReceived += async(sender, arg) =>
            {
                var msg = JsonConvert.DeserializeObject <MessageTransfer>(arg.Response.Text);

                await Bot.SendTextMessageAsync(msg.ChatId, msg.Message, replyMarkup : msg.ReplyMarkup);

                SuccessMessage($"Reply sent:{msg.ChatId}");
            };
        }
        static void Main(string[] args)
        {
            var baseConfig = new Configuration();

            baseConfig.nAreaForStrokeMap   = 15;
            baseConfig.minRadiusArea       = 0.03;
            baseConfig.toleranceFactorArea = 1.3;

            var paramVar1 = new DoubleParamVariation("nAreaForStrokeMap", 10, 2, 20);
            var paramVar2 = new DoubleParamVariation("minRadiusArea", 0.01, 0.02, 0.19);
            var paramVar3 = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.1, 2.1);

            var configSet = baseConfig.getParameterVariations(paramVar1, paramVar2, paramVar3);


            Stream          TestFileStream;
            BinaryFormatter serializer = new BinaryFormatter();
            Dictionary <string, GestureTrace[]> circleGestures, squareGestures, ownFormGestures;

            if (File.Exists("Circle_1Finger.gestures"))
            {
                TestFileStream = File.OpenRead("Circle_1Finger.gestures");
                circleGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                circleGestures = getGestureTraces("Circle_1Finger");

                TestFileStream = File.Create("Circle_1Finger.gestures");
                serializer.Serialize(TestFileStream, circleGestures);
                TestFileStream.Close();
            }

            if (File.Exists("Square_1Finger.gestures"))
            {
                TestFileStream = File.OpenRead("Square_1Finger.gestures");
                squareGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                squareGestures = getGestureTraces("Square_1Finger");

                TestFileStream = File.Create("Square_1Finger.gestures");
                serializer.Serialize(TestFileStream, squareGestures);
                TestFileStream.Close();
            }

            if (File.Exists("OwnForm_1Finger.gestures"))
            {
                TestFileStream  = File.OpenRead("OwnForm_1Finger.gestures");
                ownFormGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                ownFormGestures = getGestureTraces("OwnForm_1Finger");

                TestFileStream = File.Create("OwnForm_1Finger.gestures");
                serializer.Serialize(TestFileStream, ownFormGestures);
                TestFileStream.Close();
            }

            var gesturesToTest = ownFormGestures;

            var nSubsets = 4;
            var results  = new Dictionary <Configuration, IEnumerable <CrossValidator.RecognitionResultRow> >(1000);

            foreach (var config in configSet)
            {
                var recSystem = new RecognitionSystem(config);
                var rows      = CrossValidator.validateRecognition(recSystem, gesturesToTest, nSubsets);
                results[config] = rows;
            }

            CrossValidator.saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\GestureRecognition_OwnForm.csv", results);

            //do evaluation

            //Console.WriteLine(model.evaluate(squareTraces.First().Value.First()));



            //var crossValidator = new CrossValidator();

            //////saveSymbolTracesToDatabase();
            //var resCircle = crossValidator.validate(circleTraces, "Circle_1Finger", nSubsets);
            //var resSquare = crossValidator.validate(squareTraces, "Square_1Finger", nSubsets);
            //var resOwnForm = crossValidator.validate(ownFormTraces, "OwnForm_1Finger", nSubsets);

            //var resAll = resCircle.Concat(resSquare).Concat(resOwnForm);
            //saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\crossValidation_Extrema.csv", resAll);//resAll);


            ////DBtoExcel(@"D:\Dropbox\LfS\Data\Multitouch_Userstudy\Traces.csv");
        }
예제 #3
0
        static void Main(string[] args)
        {
            var baseConfig = new Configuration();

            baseConfig.nAreaForStrokeMap   = 15;
            baseConfig.minRadiusArea       = 0.03;
            baseConfig.toleranceFactorArea = 1.3;

            //var paramVar1 = new ParameterVariation("nAreaForStrokeMap", 10, 2, 20);
            var paramVar2 = new DoubleParamVariation("minRadiusArea", 0.005, 0.025, 0.18);
            var paramVar3 = new DoubleParamVariation("toleranceFactorArea", 1.05, 0.05, 1.5);
            var paramVar4 = new DoubleParamVariation("areaPointDistance", 0.05, 0.05, 0.2);



            var configSet = Configuration.getParameterVariations(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);

            Stream          TestFileStream;
            BinaryFormatter serializer = new BinaryFormatter();
            Dictionary <string, GestureTrace[]> timGestures;

            if (File.Exists("Tim.gestures"))
            {
                TestFileStream = File.OpenRead("Tim.gestures");
                timGestures    = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                string user = "******";
                //string[] gestures = new string[] { "Triangle_Slow", "Triangle_Normal", "Triangle_Fast", "Circle_Slow", "Circle_Normal", "Circle_Fast", "D_Slow", "D_Normal", "D_Fast", "Circle_FastLeftSlowRight", "Circle_SlowLeftFastRight" };
                //string[] gestures = new string[] { "Triangle_Slow", "Triangle_Fast", "Circle_Slow", "Circle_Fast", "D_Slow", "D_Fast", "Circle_1Stop_Bottom", "Circle_2Stop_LeftRight" };
                string[] gestures = new string[] { "Triangle_Slow", "Triangle_Fast", "Circle_Slow", "Circle_Fast", "D_Slow", "D_Fast" };

                timGestures = gestures.Select(g => new { GestureName = g, Traces = getGestureTraces(user, g) }).ToDictionary(e => e.GestureName, e => e.Traces);

                TestFileStream = File.Create("Tim.gestures");
                serializer.Serialize(TestFileStream, timGestures);
                TestFileStream.Close();
            }

            var gesturesToTest = timGestures;

            var       nSubsets = 5;
            var       results  = new Dictionary <Configuration, IEnumerable <CrossValidator.RecognitionResultRow> >(1000);
            Stopwatch sw       = new Stopwatch();

            sw.Start();
            foreach (var config in configSet)
            {
                var recSystem = new RecognitionSystem(config);
                var rows      = CrossValidator.validateRecognition(recSystem, gesturesToTest, nSubsets);
                results[config] = rows;
            }
            var neededTime = sw.ElapsedMilliseconds;

            Console.WriteLine(neededTime);
            CrossValidator.saveResultsToFile(@"D:\Dropbox\LfS\Code\GestureRecognitionTests\GestureRecognition_TimGestures_2Subsets_Test.csv", results);

            //do evaluation

            //Console.WriteLine(model.evaluate(squareTraces.First().Value.First()));



            //var crossValidator = new CrossValidator();

            //////saveSymbolTracesToDatabase();
            //var resCircle = crossValidator.validate(circleTraces, "Circle_1Finger", nSubsets);
            //var resSquare = crossValidator.validate(squareTraces, "Square_1Finger", nSubsets);
            //var resOwnForm = crossValidator.validate(ownFormTraces, "OwnForm_1Finger", nSubsets);

            //var resAll = resCircle.Concat(resSquare).Concat(resOwnForm);
            //saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\crossValidation_Extrema.csv", resAll);//resAll);


            ////DBtoExcel(@"D:\Dropbox\LfS\Data\Multitouch_Userstudy\Traces.csv");
        }
예제 #4
0
        private async void Bot_OnMessageAsync(object sender, Telegram.Bot.Args.MessageEventArgs e)
        {
            var message = e.Message;

            if (message == null)
            {
                return;
            }
            NormalMessage($"New message from:{message.Chat.Id}\nText:{message.Text}");
            if (message.Type == MessageType.LocationMessage)
            {
                var msg = CistApi.GetTravelTime($"{message.Location.Latitude.ToString().Replace(",", ".")},{message.Location.Longitude.ToString().Replace(",", ".")}");
                await Bot.SendTextMessageAsync(message.Chat.Id, msg, replyMarkup : new ReplyKeyboardHide());

                return;
            }

            if (message.Type != MessageType.TextMessage)
            {
                return;
            }

            User user = CheckRegistration(message);

            user = await CheckUserRoleAsync(user, message);

            if (user.Role == Role.NotSet)
            {
                return;
            }

            if (user.Role == Role.Student)
            {
                var student = user as Student;
                if (student == null)
                {
                    return;
                }

                switch (student.GroupId)
                {
                case 0:
                    await Bot.SendTextMessageAsync(message.Chat.Id, "Будь добр, напиши из какой ты группы?");

                    UService.ChangeGroup(user.Id, -1);
                    return;

                case -1:
                    try
                    {
                        int id = CistApi.GetGroupIdFromName(message.Text);
                        UService.ChangeGroup(user.Id, id);
                        await Bot.SendTextMessageAsync(message.Chat.Id, "Отлично, я запомнил это!");
                    }
                    catch (Exception)
                    {
                        await Bot.SendTextMessageAsync(message.Chat.Id, "Что-то у меня не получается найти такую группу, попробуй ещё раз!");

                        return;
                    }
                    return;

                default: break;
                }
            }
            else if (user.Role == Role.Teacher)
            {
                var teacher = user as Teacher;
                if (teacher == null)
                {
                    return;
                }

                switch (teacher.TeacherId)
                {
                case 0:
                    await Bot.SendTextMessageAsync(message.Chat.Id, "Пожалуйста, напишите ваше ФИО");

                    UService.ChangeTeacherId(teacher.Id, -1);
                    return;

                case -1:
                    try
                    {
                        int id = CistApi.GetTeacherIdFromName(message.Text);
                        UService.ChangeTeacherId(user.Id, id);
                        await Bot.SendTextMessageAsync(message.Chat.Id, "Отлично, я запомнил это!");

                        return;
                    }
                    catch (Exception)
                    {
                        await Bot.SendTextMessageAsync(message.Chat.Id, "Что-то у меня не получается найти вас, попробуйте еще раз!");
                    }
                    return;

                default: break;
                }
            }


            var textMessage = message.Text;

            switch (message.Text)
            {
            case "/timetable":
                textMessage = "Покажи мне моё расписание";
                break;

            case "/weather":
                textMessage = "Погода";
                break;

            case "/news":
                textMessage = "Новости";
                break;

            case "/locate":
                var keyboard = new ReplyKeyboardMarkup(new[]
                {
                    new KeyboardButton($"{Emoji.Round_Pushpin} Моё местоположение")
                    {
                        RequestLocation = true
                    }
                }
                                                       );
                await Bot.SendTextMessageAsync(message.Chat.Id, "Отправьте пожалуйста своё местоположение!", replyMarkup : keyboard);

                return;

            case "/help":
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("Для общения с ботом можно использовать как быстрые команды:");
                sb.Append(
                    $"{Emoji.White_Check_Mark} /timetable - Расписание на сегодня\n{Emoji.White_Check_Mark} /weather - Погода\n{Emoji.White_Check_Mark} /news - Новости\n{Emoji.White_Check_Mark} /locate - Маршрут до университета\n{Emoji.White_Check_Mark} /help - Помощь\n{Emoji.White_Check_Mark} /restart - Перезагрузка отношений\n");
                sb.AppendLine("Так и всевозможные фразы:");
                sb.AppendLine($"{Emoji.Arrow_Right} Покажи мне моё расписание");
                sb.AppendLine($"{Emoji.Arrow_Right} Покажи мне моё расписание на [дату]");
                sb.AppendLine($"{Emoji.Arrow_Right} Расписание [название группы | ФИО преподователя]");
                sb.AppendLine($"{Emoji.Arrow_Right} Новости");
                sb.AppendLine("И много много других фраз!");

                await Bot.SendTextMessageAsync(message.Chat.Id, sb.ToString());

                return;

            case "/restart":
                UService.RemoveUser(user.Id);
                await Bot.SendTextMessageAsync(message.Chat.Id, "Хорошо, как скажешь!");

                return;

            default:
                break;
            }

            RecognitionSystem.MainUser.Context.SharedData.Add(user);
            var evaluateRequest = RecognitionSystem.Evaluate(textMessage);

            try
            {
                NormalMessage($"Invoke request handler:{evaluateRequest.Intents.First().Name} +{(int)evaluateRequest.Intents.First().Score * 100}%\nMessage:{textMessage} User:{message.Chat.Id}");
                evaluateRequest.Invoke();
            }
            catch (Exception)
            {
                WarningMessage("Reply not sent:" + message.Chat.Id);
                await Bot.SendTextMessageAsync(message.Chat.Id,
                                               $"Извини, не получилось выполнить твой запроc{Emoji.Disappointed}\n" +
                                               $"Какие-то проблемы на сервере\n" +
                                               $"Попробуй по позже!");
            }
        }