在VB.NET中计算词频的最佳方法是什么?

在VB.NET中计算词频的最佳方法是什么?,vb.net,hashtable,word-frequency,Vb.net,Hashtable,Word Frequency,有一些关于如何用C计算词频的好例子,但没有一个是全面的,我真的需要在VB.NET中有一个 我目前的方法是每频率计数一个单词。为了得到一个完全准确的词频列表,最好的方法是什么 wordFreq = New Hashtable() Dim words As String() = Regex.Split(inputText, "(\W)") For i As Integer = 0 To words.Length - 1 If words(i) <> "" The

有一些关于如何用C计算词频的好例子,但没有一个是全面的,我真的需要在VB.NET中有一个

我目前的方法是每频率计数一个单词。为了得到一个完全准确的词频列表,最好的方法是什么

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
我更喜欢实际的代码片段,但通用的“哦,是的……使用这个并运行那个”也会起作用。

这可能会有帮助:


这可能就是您要寻找的:

    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()
我刚刚测试过,它确实有效

编辑!我添加了代码,以确保它只计算字母而不计算符号

仅供参考:我发现了一篇关于如何使用LINQ和Target2.0的文章,感觉有点脏,但它可能会帮助一些人

然后,对于一个快速演示应用程序,创建一个winforms应用程序,其中一个多行文本框称为InputBox,一个listview称为OutputList,一个按钮称为CountBtn。在列表视图中创建两列-Word和Freq。选择详细信息列表类型。为CountBtn添加事件处理程序。然后使用以下代码:

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
你做了一件可怕的事,让我用VB写这篇文章,我永远不会原谅你

:p

祝你好运

编辑


修复了空白字符串错误和大小写错误

非常接近,但是\w+是一个很好的正则表达式,只与单词字符匹配

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

我使用的是.net 2.0,所以不幸的是,我不能使用LINQ.Awww,因为它完全是一堆东西。这对你来说太容易了。使用新的编译器和目标2.0框架。从Mono和presto中复制enumerable.cs。我刚刚发现了这一点,这可能会有所帮助:我已经研究过了-所有东西要么使用LINQ,要么不在.netYou和您的奇特正则表达式中。我刚为我的一个项目写了一个词法分析器回来,当时处于词法分析模式。不过,你的解决方案更好。。。也许没有那么快?我必须做研究+1index As Integer=0应为=1,否则将丢失第一个字的第一个字符。否则就太好了,谢谢。恭喜你得了2000分!
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