private List <int> Exist(string word)
        {
            var porter = new Porter();

            word = porter.Stemm(word);
            if (indexedDict.ContainsKey(word))
            {
                return(indexedDict[word]);
            }
            else
            {
                return(new List <int>());
            }
        }
        private List <int> NotExist(string word)
        {
            var porter = new Porter();

            word = porter.Stemm(word.Replace("!", string.Empty));
            var list = new List <int>();

            for (int i = 0; i < docNum; i++)
            {
                list.Add(i);
            }
            if (indexedDict.ContainsKey(word))
            {//Операция Except возвращает последовательность, содержащую все элементы первой последовательности, которых нет во второй последовательности.
                list = list.Except(indexedDict[word]).ToList();
            }

            return(list);
        }
Example #3
0
        private void StemmingFile(string path)
        {
            var             text       = fileProvider.GetTextFromFile(path);
            var             words      = new List <string>();
            MatchCollection collection = Regex.Matches(text, @"([\w]{1,})");
            var             porter     = new Porter();

            foreach (Match word in collection)
            {
                string stremmed;
                if (word.Value.Length > 4)
                {
                    stremmed = porter.Stemm(word.Value);
                }
                else
                {
                    stremmed = word.Value;
                }
                words.Add(stremmed);
            }
            var filename = Regex.Match(path, @"([\d]*.txt)");

            fileProvider.WriteTextToFile($"{ParentForderPath}/{uri.Host}/stemming/{filename.Value}", string.Join(' ', words));
        }
Example #4
0
        public void SearchWord(string query)
        {
            var countDocument = 100;
            var porter        = new Porter();
            var words         = query.Split(' ').Select(x => porter.Stemm(x)).ToArray();
            var length        = words.Length;
            var tfs           = new double[length];

            for (int i = 0; i < length; i++)
            {
                var count = words.Where(x => x == words[i]).Count();
                tfs[i] = (double)count / length;
            }

            var idfs = new double[length];

            for (int i = 0; i < length; i++)
            {
                if (invertDict.ContainsKey(words[i]))
                {
                    //var r = invertDict[words[i]].Count;
                    idfs[i] = invertDict.ContainsKey(words[i]) ? Math.Round(Math.Log10(countDocument / invertDict[words[i]].Count), 5) : 0;
                }
                else
                {
                    idfs[i] = 0;
                }
            }

            var tfIdf = new Dictionary <string, double>();

            for (int i = 0; i < length; i++)
            {
                tfIdf.Add(words[i], tfs[i] * idfs[i]);
            }

            //Рассчитаем длину запроса
            var queryLenght = Math.Sqrt(tfIdf.Select(x => x.Value).Select(x => Math.Pow(x, 2)).Sum());

            //Документы в которых имеется одно слово
            var indexDocuments = new List <int>();

            foreach (var item in words)
            {
                if (invertDict.ContainsKey(item))
                {
                    indexDocuments.AddRange(invertDict[item]);
                }
            }
            indexDocuments = indexDocuments.Distinct().ToList();

            //
            var docsLenght = new Dictionary <int, double>();

            //вычисляем длину документов
            foreach (var index in indexDocuments)
            {
                docsLenght.Add(index, Math.Sqrt(wordMatrix[index].Values.Select(x => Math.Pow(x, 2)).Sum()));
            }

            //косинусное сходство
            var result = new Dictionary <int, double>();

            foreach (var index in indexDocuments)
            {
                double fstPart = 0;
                foreach (var word in words)
                {
                    //var k = wordMatrix[index][word];
                    if (wordMatrix[index].ContainsKey(word))
                    {
                        fstPart += tfIdf[word] * wordMatrix[index][word];
                    }
                }
                var point = (fstPart / (docsLenght[index] * queryLenght));
                if (point == double.NaN)
                {//если на запросе нет слов которые определяют какой-то документ(слова имеются во всех документых)
                    point = 0;
                }
                result.Add(index, point);
            }

            foreach (var item in result.OrderByDescending(x => x.Value).Take(10))
            {
                Console.WriteLine($"{item.Key} : {item.Value}");
            }
            Console.WriteLine();
        }