private void AnalyzeTransitionToState(State newState) { if (_currentState == State.StartState) { if (newState == State.SearchResult) { _usefullness = CoefNewSearch; } } else if (newState == State.SearchResult) { if (NGramAnalyzer.IsSimilar(_lastSearchRequest, _currentSearchRequest)) { _usefullness *= CoefRetrySearch; _lastSearchRequest = _currentSearchRequest; } else { FinishSequenceAnalyze(); _usefullness = CoefNewSearch; _lastSearchRequest = _currentSearchRequest; } } else if (newState == State.Description) { if (_currentState != State.Description) { _usefullness *= CoefViewDescription; } } else { _usefullness = CoefSearchSuccesfull; } }
public void Analyze(List <Tuple <SearchRequest, double> > requests, List <ExternalCatalogBook> books, ref BackgroundWorker worker, ref DoWorkEventArgs e) { int count = 0; int reportValue = 10; foreach (var request in requests) { if (worker.CancellationPending) { e.Cancel = true; break; } double totalDistance = 0; List <Tuple <ExternalCatalogBook, double> > distances = new List <Tuple <ExternalCatalogBook, double> >(); HashSet <ExternalCatalogBook> set = new HashSet <ExternalCatalogBook>(); string s; if (request.Item1.GetParameter(SearchFields.Title, out s)) { foreach (var word in GetWords(s)) { if (ExternalCatalogProxy.index.ContainsKey(word[0])) { foreach (var book in ExternalCatalogProxy.index[word[0]]) { set.Add(book); } } } } if (request.Item1.GetParameter(SearchFields.Responsible, out s)) { foreach (var word in GetWords(s)) { if (ExternalCatalogProxy.index.ContainsKey(word[0])) { foreach (var book in ExternalCatalogProxy.index[word[0]]) { set.Add(book); } } } } if (request.Item1.GetParameter(SearchFields.Keywords, out s)) { foreach (var word in GetWords(s)) { if (ExternalCatalogProxy.index.ContainsKey(word[0])) { foreach (var book in ExternalCatalogProxy.index[word[0]]) { set.Add(book); } } } } if (request.Item1.GetParameter(SearchFields.SubjectText, out s)) { foreach (var word in GetWords(s)) { if (ExternalCatalogProxy.index.ContainsKey(word[0])) { foreach (var book in ExternalCatalogProxy.index[word[0]]) { set.Add(book); } } } } foreach (var book in set) { double distance = NGramAnalyzer.GetDistance(request.Item1, book); if (distance <= MaximumDistance) { totalDistance += distance; distances.Add(new Tuple <ExternalCatalogBook, double>(book, distance)); } } foreach (var distance in distances) { double p; if (totalDistance > 0) { p = distance.Item2 / totalDistance; } else { p = 1; } double weight = p * request.Item2; if (_result.ContainsKey(distance.Item1)) { _result[distance.Item1] += Math.Round(weight, 3); } else { _result.Add(distance.Item1, Math.Round(weight, 3)); } } count++; if (count % reportValue == 0) { worker.ReportProgress(count, BackgroundWorkerState.ClusterAnalyzerReportProgress); } } }