Was ist der beste Weg, Worthäufigkeit in VB.NET zu berechnen?
-
03-07-2019 - |
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.
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
Dies könnte hilfreich sein:
Wortfrequenz-Algorithmus für die Verarbeitung natürlicher Sprache