(???) ar documents = new[]
(???)
(???) "i like apples",
(???) "i like pears",
(???) "i like fruit like oranges",
(???) "i hate bananas"
(???) ;
(???) / build index
(???) ar index =
(???) from document in documents
(???) // term frequency - number of times a term appears in a document
(???) let terms = System.Text.RegularExpressions.Regex.Split(document, @"\W+")
(???) let termFrequencies = terms
(???) .GroupBy(t => t)
(???) .Select(g => (term: g.Key, frequency: (double)g.Count() / terms.Length))
(???) // inverse document frequency - log of the ratio of the *number of documents* to the *number of documents containing the term*ƒƒ
(???) let uniqueTerms = terms.Distinct()
(???) let inverseDocumentFrequencies =
(???) from term in uniqueTerms
(???) let documentCount = documents.Count(d => d.Contains(term))
(???) select (term, score: Math.Log((double)documents.Length / documentCount))
(???) // calculate tf*idf
(???) let scores =
(???) from tf in termFrequencies
(???) join idf in inverseDocumentFrequencies
(???) on tf.term equals idf.term
(???) select (tf.term, score: tf.frequency * idf.score)
(???) // document scores
(???) select (document, scores);
(???) / search index
(???) ar results =
(???) from result in index
(???) from scores in result.scores
(???) where scores.term == "like"
(???) orderby scores.score descending
(???) select (result.document, scores.score);
(???) esults.Select((r, i) => $"{1 + i}. {r.document,-25} {r.score:F5}")
(???) .ToList()
(???) .ForEach(Console.WriteLine);