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); }
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); }
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); }
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); }
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))); }
public SearchQueryBuilder WithOverridenRecommenderSettings(RecommenderSettings overridenRecommenderSettings) { this._overridenRecommenderSettings = overridenRecommenderSettings; return(this); }