internal async Task <IEnumerable <Recommendation <Document> > > GetNearestDocumentsRecommendations(ConversationContext conversationContext, IEnumerable <Document> documents)
        {
            var allRelevantParsedQuery = conversationContext.ContextItems.Where(x => x.Relevant).Select(c => c.NlpAnalysis.ParsedQuery);
            var contextEntities        = new HashSet <string>(string.Join(" ", allRelevantParsedQuery).Split(" "));

            if (!contextEntities.Any() || !documents.Any())
            {
                return(new List <Recommendation <Document> >());
            }

            var parameters = new NearestDocumentsParameters
            {
                ParsedQuery  = string.Join(" ", contextEntities),
                DocumentsUri = documents.Select(d => d.Uri)
            };

            var results = await this._nearestDocuments.GetNearestDocumentsResults(parameters);

            if (conversationContext.MustHaveFacets.Any())
            {
                var filteredDocumentsUri = this.FilterDocumentsByFacet(results.Select(x => x.Document), conversationContext.MustHaveFacets);
                results = results.Where(x => filteredDocumentsUri.Contains(x.Document.Uri)).ToList();
            }

            return(results.Select(x => new Recommendation <Document>
            {
                Value = documents.First(d => d.Uri.Equals(x.Document.Uri, StringComparison.InvariantCultureIgnoreCase)),
                Confidence = x.Score,
                RecommendedBy = new List <RecommenderType>
                {
                    RecommenderType.NearestDocuments
                }
            }).OrderByDescending(recommendation => recommendation.Confidence));
        }
Beispiel #2
0
        private static StringContent CreateStringContent(NearestDocumentsParameters parameters)
        {
            var json = JsonConvert.SerializeObject(parameters);

            return(new StringContent(json, Encoding.UTF8, "application/json"));
        }
Beispiel #3
0
        public async Task <List <NearestDocumentsResult> > GetNearestDocumentsResults(NearestDocumentsParameters parameters)
        {
            var response = await this._httpClient.PostAsync("ML/NearestDocuments", CreateStringContent(parameters));

            response.EnsureSuccessStatusCode();

            return(JsonConvert.DeserializeObject <List <NearestDocumentsResult> >(response.Content.ReadAsStringAsync().Result));
        }