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); }
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)); }
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(); }