Frage

Es gibt einige gute Beispiele dafür, wie Worthäufigkeiten in C # zu berechnen, aber keiner von ihnen sind umfassend und ich brauche wirklich eine in VB.NET.

ist mein aktueller Ansatz ein Wort pro Frequenzzahl begrenzt. Was ist der beste Weg, dies zu ändern, so dass ich einen ganz genauen Wortfrequenz-Eintrag bekommen kann?

wordFreq = New Hashtable()

Dim words As String() = Regex.Split(inputText, "(\W)")
    For i As Integer = 0 To words.Length - 1
        If words(i) <> "" Then
            Dim realWord As Boolean = True
            For j As Integer = 0 To words(i).Length - 1
                If Char.IsLetter(words(i).Chars(j)) = False Then
                    realWord = False
                End If
            Next j

            If realWord = True Then
                If wordFreq.Contains(words(i).ToLower()) Then
                    wordFreq(words(i).ToLower()) += 1
                Else
                    wordFreq.Add(words(i).ToLower, 1)
                End If
            End If
        End If
    Next

Me.wordCount = New SortedList

For Each de As DictionaryEntry In wordFreq
        If wordCount.ContainsKey(de.Value) = False Then
            wordCount.Add(de.Value, de.Key)
        End If
Next

Ich würde ein tatsächlichen Code-Schnipsel bevorzugen, aber generic ‚oh yeah ... verwenden, um dies und führe, dass‘ so gut funktionieren würde.

War es hilfreich?

Lösung

Public Class CountWords

    Public Function WordCount(ByVal str As String) As Dictionary(Of String, Integer)
        Dim ret As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)

        Dim word As String = ""
        Dim add As Boolean = True
        Dim ch As Char

        str = str.ToLower
        For index As Integer = 1 To str.Length - 1 Step index + 1
            ch = str(index)
            If Char.IsLetter(ch) Then
                add = True
                word += ch
            ElseIf add And word.Length Then
                If Not ret.ContainsKey(word) Then
                    ret(word) = 1
                Else
                    ret(word) += 1
                End If
                word = ""
            End If
        Next

        Return ret
    End Function

End Class

Dann für eine schnelle Demo-Anwendung, eine WinForms-Anwendung mit einem mehrzeiligen Textfeld erstellen InputBox genannt, eine Listenansicht genannt output und einer Schaltfläche namens CountBtn. In der Listenansicht zwei Spalten erstellen - „Freq“ „Wort“ und Wählen Sie den „Details“ Listentyp. Fügen Sie einen Ereignishandler für CountBtn. Dann nutzen Sie diesen Code ein:

Imports System.Windows.Forms.ListViewItem

Public Class MainForm

    Private WordCounts As CountWords = New CountWords

    Private Sub CountBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CountBtn.Click
        OutputList.Items.Clear()
        Dim ret As Dictionary(Of String, Integer) = Me.WordCounts.WordCount(InputBox.Text)
        For Each item As String In ret.Keys
            Dim litem As ListViewItem = New ListViewItem
            litem.Text = item
            Dim csitem As ListViewSubItem = New ListViewSubItem(litem, ret.Item(item).ToString())

            litem.SubItems.Add(csitem)
            OutputList.Items.Add(litem)

            Word.Width = -1
            Freq.Width = -1
        Next
    End Sub
End Class

Sie haben eine schreckliche schreckliche Sache ich dies in VB zu machen schreiben und ich werde dir nie verzeihen.

p

Viel Glück!

Bearbeiten

Fixed leere String Fehler und Fall Bug

Andere Tipps

Dies könnte sein, was Sie suchen:

    Dim Words = "Hello World ))))) This is a test Hello World"
    Dim CountTheWords = From str In Words.Split(" ") _
                        Where Char.IsLetter(str) _
                        Group By str Into Count()

Ich habe es gerade getestet und es funktioniert

EDIT! Ich habe Code hinzugefügt, um sicherzustellen, dass es zählt nur Buchstaben und keine Symbole.

Zur Info: ich einen Artikel über gefunden, wie LINQ zu verwenden und Ziel 2.0, es ist ein fühlt sich etwas schmutzig, aber es könnte jemand helfen? http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on- net-2-0.aspx

Ziemlich nahe, aber \ w + eine gute Regex ist mit übereinstimmen (entspricht Wort Zeichen).

Public Function CountWords(ByVal inputText as String) As Dictionary(Of String, Integer)
    Dim frequency As New Dictionary(Of String, Integer)

    For Each wordMatch as Match in Regex.Match(inputText, "\w+")
        If frequency.ContainsKey(wordMatch.Value.ToLower()) Then
            frequency(wordMatch.Value.ToLower()) += 1
        Else
            frequency.Add(wordMatch.Value.ToLower(), 1)
        End If
    Next
    Return frequency
End Function
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top