mandag den 29. juni 2009

Optælling af ord - Word frequency Count .net /vb

Faldt over en kodestump, der benytter LINQ / IEnumerable til at tælle frekvensen af ord i en sætning.
Den er noget hurtigere end de ArrayList og loops, man (læs jeg) ellers kan finde på at bruge til det samme.

I dette tilfælde benyttes den til at hente unikke tags fra en String og returnere dem med eller uden ordfrekvensen.


Function CountWords(ByVal TheSentence As String, Optional ByVal Split_Str As String = ",", _
Optional ByVal Return_with_counts As Boolean = False)
Dim str As String = ""

Dim WordCounts As IEnumerable = From TheWords In TheSentence.Split(Split_Str).ToList, _
DistinctWords In TheSentence.Split(Split_Str).ToList.Distinct.ToList _
Where TheWords.ToUpper = DistinctWords.ToUpper _
Group TheWords By DistinctWords Into CountsOfLetters = Group _
Select Word = DistinctWords, Number = CountsOfLetters.Count

If Return_with_counts = True Then
For Each i In WordCounts
str = str & ", " & i.Word.ToString & "(" & i.Number.ToString & ")"
Next
Return str & ","
Else
For Each i In WordCounts
str = str & ", " & i.Word.ToString
Next

Return Right(str, Len(str) - 1)
End If


End Function


Der er et par mindre ændringer ifht den oprindelige version.