ConcatenateTopStringsBySalience ( IEnumerable <IEdge> edges, String edgeColumnName, Int32 maximumTopStrings ) { Debug.Assert(edges != null); Debug.Assert(!String.IsNullOrEmpty(edgeColumnName)); Debug.Assert(maximumTopStrings > 0); // Don't convert to lower case (bitly URLs are case-sensitive, for // example), and don't skip any words. WordCounter oWordCounter = new WordCounter(false, new String[0]); oWordCounter.SkipUrlsAndPunctuation = false; foreach (IEdge oEdge in edges) { String sSpaceDelimitedCellValue; if (oEdge.TryGetNonEmptyStringValue(edgeColumnName, out sSpaceDelimitedCellValue)) { oWordCounter.CountTermsInDocument(sSpaceDelimitedCellValue); } } oWordCounter.CalculateSalienceOfCountedTerms(); return(String.Join(TwitterSearchNetworkWordMetricUtil.WordSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWord oCountedWord in oWordCounter.CountedTerms orderby oCountedWord.Salience descending select oCountedWord.Word), maximumTopStrings ))); }
TryCountTermsNoGroups ( IGraph oGraph, WordMetricUserSettings oWordMetricUserSettings, WordCounter oWordCounter, WordPairCounter oWordPairCounter, HashSet<String> oUniqueImportedIDs, out GraphMetricColumn [] oGraphMetricColumns ) { Debug.Assert(oGraph != null); Debug.Assert(oWordMetricUserSettings != null); Debug.Assert(oWordCounter != null); Debug.Assert(oWordPairCounter != null); AssertValid(); Boolean bTextColumnIsOnEdgeWorksheet = oWordMetricUserSettings.TextColumnIsOnEdgeWorksheet; System.Collections.IEnumerable oEdgesOrVertices = bTextColumnIsOnEdgeWorksheet ? (System.Collections.IEnumerable)oGraph.Edges : (System.Collections.IEnumerable)oGraph.Vertices; // Count the terms in each of the column's cells. foreach ( IMetadataProvider oEdgeOrVertex in EnumerateEdgesOrVertices( oEdgesOrVertices, bTextColumnIsOnEdgeWorksheet, oGraph, oUniqueImportedIDs) ) { CountTermsInEdgeOrVertex(oEdgeOrVertex, oWordMetricUserSettings.TextColumnName, oWordCounter, oWordPairCounter); } oWordCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateMutualInformationOfCountedTerms(); // Transfer the words and word pairs to graph metric value lists. List<GraphMetricValueOrdered> oWordWordValues, oWordCountValues, oWordSalienceValues; List<GraphMetricValueOrdered> oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues; CreateGraphMetricValueLists( out oWordWordValues, out oWordCountValues, out oWordSalienceValues, out oWordPairWord1Values, out oWordPairWord2Values, out oWordPairCountValues, out oWordPairSalienceValues, out oWordPairMutualInformationValues ); foreach (CountedWord oCountedWord in oWordCounter.CountedTerms) { AddCountedWordToValueLists(oCountedWord, oWordMetricUserSettings, oWordWordValues, oWordCountValues, oWordSalienceValues); } foreach (CountedWordPair oCountedWordPair in oWordPairCounter.CountedTerms) { AddCountedWordPairToValueLists(oCountedWordPair, oWordMetricUserSettings, oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues); } oGraphMetricColumns = CreateGraphMetricColumns( oWordWordValues, oWordCountValues, oWordSalienceValues, null, oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues, null ); return (true); }
TryCountVertexTermsByGroup ( IGraph oGraph, WordMetricUserSettings oWordMetricUserSettings, WordCounter oWordCounter, WordPairCounter oWordPairCounter, HashSet<String> oUniqueImportedIDs, out GraphMetricColumn [] oGraphMetricColumns ) { Debug.Assert(oGraph != null); Debug.Assert(oWordMetricUserSettings != null); Debug.Assert(oWordCounter != null); Debug.Assert(oWordPairCounter != null); AssertValid(); List<GraphMetricValueOrdered> oWordWordValues, oWordCountValues, oWordSalienceValues; List<GraphMetricValueOrdered> oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues; CreateGraphMetricValueLists( out oWordWordValues, out oWordCountValues, out oWordSalienceValues, out oWordPairWord1Values, out oWordPairWord2Values, out oWordPairCountValues, out oWordPairSalienceValues, out oWordPairMutualInformationValues ); List<GraphMetricValueOrdered> oWordGroupNameValues = new List<GraphMetricValueOrdered>(); List<GraphMetricValueOrdered> oWordPairGroupNameValues = new List<GraphMetricValueOrdered>(); // Get a list of the graph's groups, adding a dummy group for the // entire graph and another to contain any non-grouped vertices. foreach ( GroupInfo oGroup in EnumerateGroupsForCountingVertexTerms(oGraph) ) { // Count the terms in this group. oWordCounter.Clear(); oWordPairCounter.Clear(); foreach ( IVertex oVertex in EnumerateEdgesOrVertices( oGroup.Vertices, false, oGraph, oUniqueImportedIDs) ) { CountTermsInEdgeOrVertex(oVertex, oWordMetricUserSettings.TextColumnName, oWordCounter, oWordPairCounter); } oWordCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateMutualInformationOfCountedTerms(); // Transfer the words and word pairs to the graph metric value // lists. AddCountedWordsToValueLists(oWordCounter.CountedTerms, oWordMetricUserSettings, oGroup.Name, oWordWordValues, oWordCountValues, oWordSalienceValues, oWordGroupNameValues); AddCountedWordPairsToValueLists(oWordPairCounter.CountedTerms, oWordMetricUserSettings, oGroup.Name, oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues, oWordPairGroupNameValues); } oGraphMetricColumns = CreateGraphMetricColumns( oWordWordValues, oWordCountValues, oWordSalienceValues, oWordGroupNameValues, oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues, oWordPairGroupNameValues ); return (true); }
TryCountEdgeTermsByGroup ( IGraph oGraph, WordMetricUserSettings oWordMetricUserSettings, WordCounter oWordCounter, WordPairCounter oWordPairCounter, HashSet<String> oUniqueImportedIDs, out GraphMetricColumn [] oGraphMetricColumns ) { Debug.Assert(oGraph != null); Debug.Assert(oWordMetricUserSettings != null); Debug.Assert(oWordCounter != null); Debug.Assert(oWordPairCounter != null); AssertValid(); List<GraphMetricValueOrdered> oWordWordValues, oWordCountValues, oWordSalienceValues; List<GraphMetricValueOrdered> oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues; CreateGraphMetricValueLists( out oWordWordValues, out oWordCountValues, out oWordSalienceValues, out oWordPairWord1Values, out oWordPairWord2Values, out oWordPairCountValues, out oWordPairSalienceValues, out oWordPairMutualInformationValues ); List<GraphMetricValueOrdered> oWordGroupNameValues = new List<GraphMetricValueOrdered>(); List<GraphMetricValueOrdered> oWordPairGroupNameValues = new List<GraphMetricValueOrdered>(); // Get the edges in each of the graph's groups. Include a "dummy" // group that contains the edges that aren't contained in any real // groups. foreach ( GroupEdgeInfo oGroupEdgeInfo in GroupEdgeSorter.SortGroupEdges(oGraph, Int32.MaxValue, true, true) ) { // Count the terms in this group. oWordCounter.Clear(); oWordPairCounter.Clear(); foreach ( IEdge oEdge in EnumerateEdgesOrVertices( oGroupEdgeInfo.Edges, true, oGraph, oUniqueImportedIDs) ) { CountTermsInEdgeOrVertex(oEdge, oWordMetricUserSettings.TextColumnName, oWordCounter, oWordPairCounter); } oWordCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateMutualInformationOfCountedTerms(); // Transfer the words and word pairs to the graph metric value // lists. String sGroupName = oGroupEdgeInfo.GroupName; AddCountedWordsToValueLists( oWordCounter.CountedTerms, oWordMetricUserSettings, sGroupName, oWordWordValues, oWordCountValues, oWordSalienceValues, oWordGroupNameValues); AddCountedWordPairsToValueLists( oWordPairCounter.CountedTerms, oWordMetricUserSettings, sGroupName, oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues, oWordPairGroupNameValues); if ( sGroupName == GroupEdgeSorter.DummyGroupNameForEntireGraph && oUniqueImportedIDs != null ) { // This is the dummy group that stores all the edges in the // graph. Note that SortGroupEdges() guarantees that this is // the first group, so the imported IDs need to be cleared only // once within this loop. oUniqueImportedIDs.Clear(); } } oGraphMetricColumns = CreateGraphMetricColumns( oWordWordValues, oWordCountValues, oWordSalienceValues, oWordGroupNameValues, oWordPairWord1Values, oWordPairWord2Values, oWordPairCountValues, oWordPairSalienceValues, oWordPairMutualInformationValues, oWordPairGroupNameValues ); return (true); }
TestCountTermsInDocument11() { // Test Jana Diesner's example, which doesn't skip words. WordCounter oWordCounter = new WordCounter( new String[] {} ); oWordCounter.CountTermsInDocument("Ben and Bob went out for dinner."); oWordCounter.CountTermsInDocument("Ben and Mary share a driveway."); oWordCounter.CountTermsInDocument("Brent and Bob went out for lunch."); oWordCounter.CalculateSalienceOfCountedTerms(); Assert.AreEqual(3, oWordCounter.TotalDocuments); Assert.AreEqual(20, oWordCounter.TotalWordsInDocuments); IEnumerable<CountedWord> oCountedWords = oWordCounter.CountedTerms; Assert.AreEqual( 13, oCountedWords.Count() ); CountedWord oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "ben" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 ) ); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "and" && oCountedWord.Count == 3 && oCountedWord.DocumentsInWhichTermWasCounted == 3 ) ); Assert.AreEqual(0.0, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "bob" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 ) ); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "went" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 ) ); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "out" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 ) ); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "for" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 ) ); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "dinner" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "mary" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "share" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "a" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "driveway" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "brent" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "lunch" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 ) ); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); }
ConcatenateTopWordsAndWordPairs ( IEnumerable<IEdge> oEdges, String sStatusEdgeColumnName, Int32 iMaximumTopStrings, WordCounter oWordCounter, WordPairCounter oWordPairCounter, out String sTopWordsInTweetByCount, out String sTopWordsInTweetBySalience, out String sTopWordPairsInTweetByCount, out String sTopWordPairsInTweetBySalience ) { Debug.Assert(oEdges != null); Debug.Assert( !String.IsNullOrEmpty(sStatusEdgeColumnName) ); Debug.Assert(iMaximumTopStrings > 0); Debug.Assert(oWordCounter != null); Debug.Assert(oWordPairCounter != null); oWordCounter.Clear(); oWordPairCounter.Clear(); foreach (IEdge oEdge in oEdges) { String sStatus; if ( oEdge.TryGetNonEmptyStringValue(sStatusEdgeColumnName, out sStatus) ) { oWordCounter.CountTermsInDocument(sStatus); oWordPairCounter.CountTermsInDocument(sStatus); } } oWordCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateSalienceOfCountedTerms(); sTopWordsInTweetByCount = String.Join( TwitterSearchNetworkWordMetricUtil.WordSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWord oCountedWord in oWordCounter.CountedTerms orderby oCountedWord.Count descending select oCountedWord.Word) , iMaximumTopStrings ) ); sTopWordsInTweetBySalience = String.Join( TwitterSearchNetworkWordMetricUtil.WordSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWord oCountedWord in oWordCounter.CountedTerms orderby oCountedWord.Salience descending select oCountedWord.Word) , iMaximumTopStrings ) ); sTopWordPairsInTweetByCount = String.Join( TwitterSearchNetworkWordMetricUtil.WordPairSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWordPair oCountedWordPair in oWordPairCounter.CountedTerms orderby oCountedWordPair.Count descending select TwitterSearchNetworkWordMetricUtil.FormatWordPair( oCountedWordPair) ) , iMaximumTopStrings ) ); sTopWordPairsInTweetBySalience = String.Join( TwitterSearchNetworkWordMetricUtil.WordPairSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWordPair oCountedWordPair in oWordPairCounter.CountedTerms orderby oCountedWordPair.Salience descending select TwitterSearchNetworkWordMetricUtil.FormatWordPair( oCountedWordPair) ) , iMaximumTopStrings ) ); }
ConcatenateTopStringsBySalience ( IEnumerable<IEdge> edges, String edgeColumnName, Int32 maximumTopStrings ) { Debug.Assert(edges != null); Debug.Assert( !String.IsNullOrEmpty(edgeColumnName) ); Debug.Assert(maximumTopStrings > 0); // Don't convert to lower case (bitly URLs are case-sensitive, for // example), and don't skip any words. WordCounter oWordCounter = new WordCounter( false, new String[0] ); oWordCounter.SkipUrlsAndPunctuation = false; foreach (IEdge oEdge in edges) { String sSpaceDelimitedCellValue; if ( oEdge.TryGetNonEmptyStringValue(edgeColumnName, out sSpaceDelimitedCellValue) ) { oWordCounter.CountTermsInDocument(sSpaceDelimitedCellValue); } } oWordCounter.CalculateSalienceOfCountedTerms(); return ( String.Join(TwitterSearchNetworkWordMetricUtil.WordSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWord oCountedWord in oWordCounter.CountedTerms orderby oCountedWord.Salience descending select oCountedWord.Word), maximumTopStrings ) ) ); }
ConcatenateTopWordsAndWordPairs ( IEnumerable <IEdge> oEdges, String sStatusEdgeColumnName, Int32 iMaximumTopStrings, WordCounter oWordCounter, WordPairCounter oWordPairCounter, out String sTopWordsInTweetByCount, out String sTopWordsInTweetBySalience, out String sTopWordPairsInTweetByCount, out String sTopWordPairsInTweetBySalience ) { Debug.Assert(oEdges != null); Debug.Assert(!String.IsNullOrEmpty(sStatusEdgeColumnName)); Debug.Assert(iMaximumTopStrings > 0); Debug.Assert(oWordCounter != null); Debug.Assert(oWordPairCounter != null); oWordCounter.Clear(); oWordPairCounter.Clear(); foreach (IEdge oEdge in oEdges) { String sStatus; if (oEdge.TryGetNonEmptyStringValue(sStatusEdgeColumnName, out sStatus)) { oWordCounter.CountTermsInDocument(sStatus); oWordPairCounter.CountTermsInDocument(sStatus); } } oWordCounter.CalculateSalienceOfCountedTerms(); oWordPairCounter.CalculateSalienceOfCountedTerms(); sTopWordsInTweetByCount = String.Join( TwitterSearchNetworkWordMetricUtil.WordSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWord oCountedWord in oWordCounter.CountedTerms orderby oCountedWord.Count descending select oCountedWord.Word) , iMaximumTopStrings )); sTopWordsInTweetBySalience = String.Join( TwitterSearchNetworkWordMetricUtil.WordSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWord oCountedWord in oWordCounter.CountedTerms orderby oCountedWord.Salience descending select oCountedWord.Word) , iMaximumTopStrings )); sTopWordPairsInTweetByCount = String.Join( TwitterSearchNetworkWordMetricUtil.WordPairSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWordPair oCountedWordPair in oWordPairCounter.CountedTerms orderby oCountedWordPair.Count descending select TwitterSearchNetworkWordMetricUtil.FormatWordPair( oCountedWordPair)) , iMaximumTopStrings )); sTopWordPairsInTweetBySalience = String.Join( TwitterSearchNetworkWordMetricUtil.WordPairSeparator, TwitterSearchNetworkStringUtil.TakeTopStringsAsArray( (from CountedWordPair oCountedWordPair in oWordPairCounter.CountedTerms orderby oCountedWordPair.Salience descending select TwitterSearchNetworkWordMetricUtil.FormatWordPair( oCountedWordPair)) , iMaximumTopStrings )); }
TestCountTermsInDocument11() { // Test Jana Diesner's example, which doesn't skip words. WordCounter oWordCounter = new WordCounter(new String[] {}); oWordCounter.CountTermsInDocument("Ben and Bob went out for dinner."); oWordCounter.CountTermsInDocument("Ben and Mary share a driveway."); oWordCounter.CountTermsInDocument("Brent and Bob went out for lunch."); oWordCounter.CalculateSalienceOfCountedTerms(); Assert.AreEqual(3, oWordCounter.TotalDocuments); Assert.AreEqual(20, oWordCounter.TotalWordsInDocuments); IEnumerable <CountedWord> oCountedWords = oWordCounter.CountedTerms; Assert.AreEqual(13, oCountedWords.Count()); CountedWord oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "ben" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 )); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "and" && oCountedWord.Count == 3 && oCountedWord.DocumentsInWhichTermWasCounted == 3 )); Assert.AreEqual(0.0, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "bob" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 )); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "went" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 )); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "out" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 )); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "for" && oCountedWord.Count == 2 && oCountedWord.DocumentsInWhichTermWasCounted == 2 )); Assert.AreEqual(0.018, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "dinner" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "mary" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "share" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "a" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "driveway" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "brent" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); oTheCountedWord = oCountedWords.Single( oCountedWord => ( oCountedWord.Word == "lunch" && oCountedWord.Count == 1 && oCountedWord.DocumentsInWhichTermWasCounted == 1 )); Assert.AreEqual(0.024, oTheCountedWord.Salience, 0.001); }