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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top