Exemplo n.º 1
0
 public void SimpleHashTest()
 {
     var minH = new MinHasher<int>(hashSeeds.Take(10).ToArray());
     var mhs = minH.GetMinHashSignature("ASDF");
     var mhs2 = minH.GetMinHashSignature("asdf");
     Assert.AreEqual(mhs, mhs2);
 }
Exemplo n.º 2
0
 public void SimpleHashCharTest()
 {
     var minH = new MinHasher<int>(hashSeeds.Take(1).ToArray());
     var mhs = minH.GetMinHashSignature(new string[] { "a", "s","d","f" });
     var mhs2 = minH.GetMinHashSignature("ASDF");
     Assert.AreEqual(mhs, mhs2);
 }
Exemplo n.º 3
0
        private async Task <List <SearchResult> > Search(string searchString, int maxResults, double minSim)
        {
            var hashSeed = await apiClient.GetHashSeed();

            var minHasher          = new MinHasher <Guid>(hashSeed);
            var hashedSearchString = minHasher.GetMinHashSignature(searchString);
            var hashedResults      = (await apiClient.HashedSearch(new HashedSearchQuery()
            {
                MaxResults = maxResults,
                MinimumSimilarity = minSim,
                SearchTerm = hashedSearchString
            }))?.ToList();
            var groupedResults = hashedResults.GroupBy(r => r.Store);
            var tasks          = new List <Task <IEnumerable <ProductBase> > >();

            foreach (var storeResults in groupedResults)
            {
                tasks.Add(apiClient.GetProducts(storeResults.Key, storeResults.Select(r => r.Product.Id).ToList()));
            }
            await Task.WhenAll(tasks);

            foreach (var task in tasks.Where(t => !t.IsFaulted))
            {
                foreach (var product in task.Result)
                {
                    var idx = hashedResults.ToList().FindIndex(h => h.Product.Id == product.Id);
                    hashedResults[idx].Product = product;
                }
            }
            return(hashedResults);
        }
        public void Register(List <Product> products)
        {
            try
            {
                var hashSeed       = TryRegister();
                var minHasher      = new MinHasher <Guid>(hashSeed);
                var hashedProducts = new List <HashedProductBase>();

                foreach (var product in products)
                {
                    var id            = product.Id;
                    var hashedProduct = new HashedProductBase()
                    {
                        Id = id
                    };
                    var weightsL = new List <double>();
                    var hashL    = new List <int[]>();
                    var toHash   = product.GetWeightedStringsToHash();
                    foreach (var sth in toHash)
                    {
                        var weight = sth.Item2;
                        var str    = sth.Item1;
                        var hash   = minHasher.GetMinHashSignature(str);
                        weightsL.Add(weight);
                        hashL.Add(hash);
                        hashedProduct.Hashes  = hashL.ToArray();
                        hashedProduct.Weights = weightsL.ToArray();
                    }
                    hashedProducts.Add(hashedProduct);
                }
                var req = new RestRequest($"/api/stores/Register/{storeObj.Id}");
                req.AddJsonBody(hashedProducts);
                var res = _client.Post(req);
                if (res.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    return;
                }
                else
                {
                    throw new Exception(res.StatusDescription);
                }
            }
            catch
            {
                throw;
            }
        }
Exemplo n.º 5
0
        public List <SearchResult> Search(HashedSearchQuery search)
        {
            var minHasher   = new MinHasher <Guid>(_db.LSHConfig.LSHHashSeed);
            var lshSearcher = new LSHSearch <Guid>(minHasher, SimilarityMeasures.Jaccard);
            var searchSpace = _db.HashedProducts
                              .ToDictionary(p => p.Id, p => (IWeightedHashed)p);
            var res     = lshSearcher.GetClosest(searchSpace, search.SearchTerm, search.MaxResults, search.MinimumSimilarity);
            var results = res.Select(r =>
                                     new SearchResult
            {
                Product = new ProductBase()
                {
                    Id = r.Id
                },
                Similarity = r.Similarity,
                Store      = _db.HashedProducts
                             .Include(p => p.Store)
                             .FirstOrDefault(p => p.Id == r.Id).Store
            }
                                     ).ToList();

            return(results);
        }
 public void Setup()
 {
     minHasher   = new MinHasher <int>(hashSeeds.Take(50).ToArray());
     lshSearcher = new LSHSearch <int>(minHasher, SimilarityMeasures.Jaccard);
 }