Ejemplo n.º 1
0
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddPolicy(
                    "AllowAll",
                    builder =>
                {
                    builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
            });
            services.AddMvc();

            services.AddSwaggerGen(c =>
                                   c.SwaggerDoc("v2", new Info {
                Title = "WhisperAPI", Version = "v2"
            }));

            var applicationSettings = new ApplicationSettings();

            this.Configuration.Bind(applicationSettings);

            var recommenderSettings = new RecommenderSettings();

            this.Configuration.GetSection("Recommender").Bind(recommenderSettings);

            ConfigureDependency(services, applicationSettings, recommenderSettings);
        }
        public void When_search_query_contains_overriden_recommender_settings_then_they_are_overriden()
        {
            this._conversationContext.SelectedSuggestedDocuments.Clear();

            var nlpAnalysis = NlpAnalysisBuilder.Build.Instance;

            this.SetUpNLPCallMockToReturn(nlpAnalysis, true);
            this.SetUpLastClickAnalyticsMockToReturn(this.GetLastClickAnalyticsResults());
            this.SetUpDocumentFacetMockToReturn(this.GetSuggestedQuestions());
            this.SetUpLqIndexSearchMockToReturn(this.GetSearchResult());
            this.SetUpFilterDocumentsMockToReturn(this.GetLastClickAnalyticsResults().Select(x => x.Document.Uri).ToList());

            var overridenRecommenderSettings = new RecommenderSettings
            {
                UseAnalyticsSearchRecommender         = true,
                UseFacetQuestionRecommender           = false,
                UseLongQuerySearchRecommender         = true,
                UsePreprocessedQuerySearchRecommender = false
            };

            var suggestionQuery = SearchQueryBuilder.Build
                                  .WithOverridenRecommenderSettings(overridenRecommenderSettings)
                                  .Instance;

            this._suggestionsService.UpdateContextWithNewItem(this._conversationContext, nlpAnalysis, suggestionQuery, true);
            var suggestion = this._suggestionsService.GetNewSuggestion(this._conversationContext, suggestionQuery);

            suggestion.Questions.Should().HaveCount(0);
            suggestion.Documents.Should().HaveCount(5);
        }
Ejemplo n.º 3
0
        public Suggestion GetNewSuggestion(ConversationContext conversationContext, SuggestionQuery query)
        {
            var allRecommendedQuestions = new List <IEnumerable <Recommendation <Question> > >();

            if (query.OverridenRecommenderSettings != null)
            {
                this._recommenderSettings = query.OverridenRecommenderSettings;
            }

            var tasks = new Dictionary <RecommenderType, Task <IEnumerable <Recommendation <Document> > > >();

            if (this._recommenderSettings.UseLongQuerySearchRecommender)
            {
                tasks.Add(RecommenderType.LongQuerySearch, this.GetLongQuerySearchRecommendations(conversationContext));
            }

            if (this._recommenderSettings.UsePreprocessedQuerySearchRecommender)
            {
                tasks.Add(RecommenderType.PreprocessedQuerySearch, this.GetQuerySearchRecommendations(conversationContext));
            }

            if (this._recommenderSettings.UseAnalyticsSearchRecommender)
            {
                tasks.Add(RecommenderType.LastClickAnalytics, this.GetLastClickAnalyticsRecommendations(conversationContext));
            }

            if (this._recommenderSettings.UseNearestDocumentsRecommender)
            {
                var recommendations = this._recommenderSettings.UsePreprocessedQuerySearchRecommender
                    ? tasks[RecommenderType.PreprocessedQuerySearch].Result
                    : this.GetQuerySearchRecommendations(conversationContext).Result;

                tasks.Add(RecommenderType.NearestDocuments, this.GetNearestDocumentsRecommendations(conversationContext, recommendations.Select(r => r.Value)));
            }

            var allRecommendedDocuments = Task.WhenAll(tasks.Values).Result.ToList();
            var mergedDocuments         = this.MergeRecommendedDocuments(allRecommendedDocuments);

            if (mergedDocuments.Any() && this._recommenderSettings.UseFacetQuestionRecommender)
            {
                allRecommendedQuestions.Add(this.GenerateQuestions(conversationContext, mergedDocuments.Select(d => d.Value)).Take(query.MaxQuestions));
            }

            var mergedQuestions = this.MergeRecommendedQuestions(allRecommendedQuestions).Take(query.MaxQuestions);

            var suggestion = new Suggestion
            {
                ActiveFacets = conversationContext.MustHaveFacets,
                Documents    = mergedDocuments.Take(query.MaxDocuments).ToList(),
                Questions    = mergedQuestions.Select(r => r.ConvertValue(QuestionToClient.FromQuestion)).ToList()
            };

            UpdateContextWithNewSuggestions(conversationContext, suggestion.Documents.Select(r => r.Value));

            return(suggestion);
        }
Ejemplo n.º 4
0
 public SuggestionsService(
     IIndexSearch indexSearch,
     ILastClickAnalytics lastClickAnalytics,
     IDocumentFacets documentFacets,
     INearestDocuments nearestDocuments,
     IFilterDocuments filterDocuments,
     int numberOfWordsIntoQ,
     double minimumConfidence,
     RecommenderSettings recommenderSettings)
 {
     this._indexSearch         = indexSearch;
     this._lastClickAnalytics  = lastClickAnalytics;
     this._documentFacets      = documentFacets;
     this._nearestDocuments    = nearestDocuments;
     this._filterDocuments     = filterDocuments;
     this._numberOfWordsIntoQ  = numberOfWordsIntoQ;
     this._minimumConfidence   = minimumConfidence;
     this._recommenderSettings = recommenderSettings;
 }
        public void SetUp()
        {
            this._indexSearchMock        = new Mock <IIndexSearch>();
            this._lastClickAnalyticsMock = new Mock <ILastClickAnalytics>();
            this._nearestDocuments       = new Mock <INearestDocuments>();
            this._nlpCallMock            = new Mock <INlpCall>();
            this._documentFacetsMock     = new Mock <IDocumentFacets>();
            this._filterDocumentsMock    = new Mock <IFilterDocuments>();

            var recommenderSettings = new RecommenderSettings
            {
                UseAnalyticsSearchRecommender         = true,
                UseFacetQuestionRecommender           = true,
                UseLongQuerySearchRecommender         = true,
                UsePreprocessedQuerySearchRecommender = true,
                UseNearestDocumentsRecommender        = false
            };

            this._suggestionsService  = new SuggestionsService(this._indexSearchMock.Object, this._lastClickAnalyticsMock.Object, this._documentFacetsMock.Object, this._nearestDocuments.Object, this._filterDocumentsMock.Object, 7, 0.5, recommenderSettings);
            this._conversationContext = new ConversationContext(new Guid("a21d07d5-fd5a-42ab-ac2c-2ef6101e58d9"), DateTime.Now);
        }
Ejemplo n.º 6
0
        public void SetUp()
        {
            this._indexSearchHttpMessageHandleMock        = new Mock <HttpMessageHandler>();
            this._lastClickAnalyticsHttpMessageHandleMock = new Mock <HttpMessageHandler>();
            this._nearestDocumentsHttpMessageHandleMock   = new Mock <HttpMessageHandler>();
            this._nlpCallHttpMessageHandleMock            = new Mock <HttpMessageHandler>();
            this._documentFacetsHttpMessageHandleMock     = new Mock <HttpMessageHandler>();
            this._filterDocumentsHttpMessageHandleMock    = new Mock <HttpMessageHandler>();

            var indexSearchHttpClient        = new HttpClient(this._indexSearchHttpMessageHandleMock.Object);
            var lastClickAnalyticsHttpClient = new HttpClient(this._lastClickAnalyticsHttpMessageHandleMock.Object);
            var nearestDocumentsHttpClient   = new HttpClient(this._nearestDocumentsHttpMessageHandleMock.Object);
            var nlpCallHttpClient            = new HttpClient(this._nlpCallHttpMessageHandleMock.Object);
            var documentFacetHttpClient      = new HttpClient(this._documentFacetsHttpMessageHandleMock.Object);
            var filterDocumentsHttpClient    = new HttpClient(this._filterDocumentsHttpMessageHandleMock.Object);

            var indexSearch        = new IndexSearch(null, this._numberOfResults, indexSearchHttpClient, "https://localhost:5000", null);
            var lastClickAnalytics = new LastClickAnalytics(lastClickAnalyticsHttpClient, "https://localhost:5000");
            var nearestDocuments   = new NearestDocuments(nearestDocumentsHttpClient, "https://localhost:5000");
            var nlpCall            = new NlpCall(nlpCallHttpClient, this.GetIrrelevantIntents(), "https://localhost:5000", 0.5);
            var documentFacets     = new DocumentFacets(documentFacetHttpClient, "https://localhost:5000");
            var filterDocuments    = new FilterDocuments(filterDocumentsHttpClient, "https://localhost:5000");

            this._recommenderSettings = new RecommenderSettings
            {
                UseAnalyticsSearchRecommender         = false,
                UseFacetQuestionRecommender           = true,
                UseLongQuerySearchRecommender         = true,
                UsePreprocessedQuerySearchRecommender = false,
                UseNearestDocumentsRecommender        = false
            };

            var suggestionsService = new SuggestionsService(indexSearch, lastClickAnalytics, documentFacets, nearestDocuments, filterDocuments, 7, 0.5, this._recommenderSettings);

            var contexts         = new InMemoryContexts(new TimeSpan(1, 0, 0, 0));
            var questionsService = new QuestionsService();

            this._suggestionController = new SuggestionsController(suggestionsService, questionsService, nlpCall, contexts);
        }
Ejemplo n.º 7
0
        private static void ConfigureDependency(IServiceCollection services, ApplicationSettings applicationSettings, RecommenderSettings recommenderSettings)
        {
            services.AddTransient <ISuggestionsService>(
                x => new SuggestionsService(
                    x.GetService <IIndexSearch>(),
                    x.GetService <ILastClickAnalytics>(),
                    x.GetService <IDocumentFacets>(),
                    x.GetService <INearestDocuments>(),
                    x.GetService <IFilterDocuments>(),
                    applicationSettings.NumberOfWordsIntoQ,
                    applicationSettings.MinimumConfidence,
                    recommenderSettings));

            services.AddTransient <IQuestionsService>(x => new QuestionsService());

            services.AddTransient <IFacetsService>(x => new FacetsService(x.GetService <IFacetValues>()));

            services.AddTransient <IFacetValues>(
                x => new FacetValues(
                    x.GetService <HttpClient>(),
                    applicationSettings.MlApiBaseAddress));

            services.AddTransient <INlpCall>(
                x => new NlpCall(
                    x.GetService <HttpClient>(),
                    applicationSettings.IrrelevantIntents,
                    applicationSettings.NlpApiBaseAddress,
                    applicationSettings.MinimumRelevantConfidence));

            services.AddTransient <ILastClickAnalytics>(
                x => new LastClickAnalytics(
                    x.GetService <HttpClient>(),
                    applicationSettings.MlApiBaseAddress));

            services.AddTransient <INearestDocuments>(
                x => new NearestDocuments(
                    x.GetService <HttpClient>(),
                    applicationSettings.MlApiBaseAddress));

            services.AddTransient <IDocumentFacets>(
                x => new DocumentFacets(
                    x.GetService <HttpClient>(),
                    applicationSettings.MlApiBaseAddress));

            services.AddTransient <IFilterDocuments>(
                x => new FilterDocuments(
                    x.GetService <HttpClient>(),
                    applicationSettings.MlApiBaseAddress));

            services.AddTransient <IIndexSearch>(
                x => new IndexSearch(
                    applicationSettings.ApiKey,
                    applicationSettings.NumberOfResults,
                    x.GetService <HttpClient>(),
                    applicationSettings.SearchBaseAddress,
                    applicationSettings.OrganizationID));


            services.AddTransient <HttpClient, HttpClient>();

            services.AddSingleton <IContexts>(
                x => new InMemoryContexts(
                    TimeSpan.Parse(applicationSettings.ContextLifeSpan)));
        }
Ejemplo n.º 8
0
 public SearchQueryBuilder WithOverridenRecommenderSettings(RecommenderSettings overridenRecommenderSettings)
 {
     this._overridenRecommenderSettings = overridenRecommenderSettings;
     return(this);
 }