Quel est le meilleur moyen de calculer la fréquence des mots dans VB.NET?
-
03-07-2019 - |
Question
Il existe de bons exemples sur la façon de calculer la fréquence des mots en C #, mais aucun d’entre eux n’est exhaustif et j’en ai vraiment besoin d’un en VB.NET.
Mon approche actuelle est limitée à un mot par compte de fréquence. Quel est le meilleur moyen de changer cela afin que je puisse obtenir une liste de fréquence de mots parfaitement précise?
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
Je préférerais un extrait de code, mais le générique "ah oui ... utilisez ceci et exécutez-le" fonctionnerait également.
La solution
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
Ensuite, pour une application de démonstration rapide, créez une application Winforms avec une zone de texte multiligne appelée InputBox, une vue en liste appelée OutputList et un bouton appelé CountBtn. Dans la vue Liste, créez deux colonnes - & Word; Word " et " Freq. " Sélectionnez les " détails " type de liste. Ajoutez un gestionnaire d'événements pour CountBtn. Ensuite, utilisez ce code:
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
Vous avez fait une chose terrible pour me faire écrire cela en VB et je ne vous pardonnerai jamais.
: p
Bonne chance!
MODIFIER
Correction d'un bug de chaîne vide et d'un casse
Autres conseils
C’est peut-être ce que vous cherchez:
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()
Je viens de le tester et ça marche
EDIT! J'ai ajouté du code pour m'assurer qu'il ne compte que des lettres et non des symboles.
FYI: J'ai trouvé un article sur l'utilisation de LINQ et de la cible 2.0, c'est un peu sale, mais cela pourrait aider quelqu'un http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on- net-2-0.aspx
Assez proche, mais \ w + est une expression rationnelle à utiliser (correspond aux caractères de mot uniquement).
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
Cela pourrait être utile:
Algorithme de fréquence Word pour le traitement en langage naturel