Ejemplo n.º 1
0
        private static void TestTranstionStatus()
        {
            Session       session = new Session();
            DialogManager dm      = new DialogManager();

            session.is_considerd[ParseStatus.Artist] = true;
            ParseStatus res = dm.GetTransitionStatus(session);

            Console.WriteLine(res.ToString());

            session = new Session();
            dm      = new DialogManager();
            session.is_considerd[ParseStatus.PublishDate] = true;
            res = dm.GetTransitionStatus(session);
            Console.WriteLine(res.ToString());
        }
Ejemplo n.º 2
0
        public void DialogFlow(string input)
        {
            // begin
            session.parse_status = ParseStatus.All;
            string query_str = "";

            while (true)
            {
                Query query;
                // get query. if it is the very beginning, then taking the parameter as input
                if (session.parse_status == ParseStatus.All)
                {
                    if (string.IsNullOrWhiteSpace(input))
                    {
                        query_str = Utils.ReadLine();
                        Utils.WriteQuery(query_str);
                    }
                    else
                    {
                        query_str = input;
                        input     = null;
                    }
                    query = new Query(query_str);
                    parser.PosTagging(ref query);
                    // movie recommendation trigger
                    // don't need anymore due to Xiaoice API Connection
                    if (!parser.isAboutMovie(query))
                    {
                        Utils.WriteMachine(new string('=', 24));
                        Utils.WriteMachine("\n");
                        return;
                    }
                }
                else
                {
                    query_str = Utils.ReadLine();
                    Utils.WriteQuery(query_str);
                    query = new Query(query_str);

                    Query query_kbqa = new Query(query_str);
                    parser.PosTagging(ref query_kbqa);
                    if (KBQA.DoKBQA(query_kbqa, parser))
                    {
                        continue;
                    }
                    parser.PosTagging(ref query);
                }

                // query parse according to parse status
                switch (session.parse_status)
                {
                case ParseStatus.All:
                    parser.ParseAllTag(ref query);
                    break;

                case ParseStatus.Movie:
                    parser.ParseMovieName(ref query);
                    break;

                case ParseStatus.Artist:
                    parser.ParseArtistName(ref query);
                    break;

                case ParseStatus.Director:
                    parser.ParseDirectorName(ref query);
                    break;

                case ParseStatus.Country:
                    parser.ParseCountryName(ref query);
                    break;

                case ParseStatus.Genre:
                    parser.ParseGenreName(ref query);
                    break;

                case ParseStatus.PublishDate:
                    parser.ParsePublishDate(ref query);
                    break;

                //case ParseStatus.Rating:
                //    parser.ParseRating(ref query);
                //    break;
                //case ParseStatus.Duration:
                //    parser.ParseDuration(ref query);
                //    break;
                default:
                    Utils.WriteError("error parse status!");
                    break;
                }

                // refresh session status using user query
                session.RefreshSessionStatus(query);
                ClarifyArtistDirector();

                // refresh session movie candidate status
                GetAllResult(ref session);

                // is recommendation end or is user accept the kbqa answer
                if (isRecommendationEnd(session) || parser.isAcceptCandidate(query))
                {
                    if (parser.isAcceptCandidate(query))
                    {
                        Utils.WriteMachine("Have Fun~~~");
                        return;
                    }
                    if (session.is_considerd[ParseStatus.Movie] && session.candidate_movies.Count > 0)
                    {
                        Utils.WriteMachine("想看" + session.candidate_movies[0].name + "啊");
                        Utils.WriteMachine("眼光不错哦");
                    }
                    else
                    {
                        // if it is end, then show some movie candidate, let user confirm the result
                        ConfirmSession();
                        return;
                    }
                }
                else
                {
                    // in this trun we asked some information, but user did not provide
                    if (session.parse_status == ParseStatus.Artist ||
                        session.parse_status == ParseStatus.Director ||
                        session.parse_status == ParseStatus.Country ||
                        session.parse_status == ParseStatus.Genre ||
                        session.parse_status == ParseStatus.PublishDate)
                    {
                        if (session.is_considerd[session.parse_status] != true)
                        {
                            Utils.WriteUnknow("Pardon me", query.raw_query);
                            continue;
                        }
                    }

                    if (session.parse_status == ParseStatus.All)
                    {
                        session.parse_status = MakeClearParseStatus(session);
                    }
                    // using current turn status(session.parse_status) to compute the Transition(next turn) status, a transition matrix requeried.
                    ParseStatus   nextturn_status         = GetTransitionStatus(session);
                    List <string> answer_entity_candidate = new List <string>();
                    // response according to the nextturn_status we just chosen.
                    switch (nextturn_status)
                    {
                    //case ParseStatus.All:
                    //    answer_entity_candidate = AnalyseAll(session);
                    //    break;
                    case ParseStatus.Artist:
                        answer_entity_candidate = AnalyseArtistName(session);
                        break;

                    case ParseStatus.Director:
                        answer_entity_candidate = AnalyseDirectorName(session);
                        break;

                    case ParseStatus.Country:
                        answer_entity_candidate = AnalyseCountryName(session);
                        break;

                    case ParseStatus.Genre:
                        answer_entity_candidate = AnalyseGenreName(session);
                        break;

                    case ParseStatus.PublishDate:
                        answer_entity_candidate = AnalysePublishDate(session);
                        break;

                    default:
                        Utils.WriteError("error turn status!");
                        break;
                    }
                    // answer and go to the next turn
                    Console.WriteLine("from {0} transite to {1}", session.parse_status.ToString(), nextturn_status.ToString());
                    string answer = AnswerGenerator.AnswerIt(answer_entity_candidate, session, nextturn_status);
                    Utils.WriteMachine(answer);
                    session.parse_status = nextturn_status;
                }
            }
        }