3

C# で単語の頻度を計算する方法については、いくつかの良い例がありますが、どれも包括的なものではなく、VB.NET で本当に必要です。

私の現在のアプローチは、頻度カウントごとに 1 つの単語に制限されています。完全に正確な単語頻度リストを取得できるように、これを変更する最良の方法は何ですか?

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

私は実際のコード スニペットを希望しますが、一般的な「そうそう...これを使用してそれを実行する」も同様に機能します。

4

4 に答える 4

3

これはあなたが探しているものかもしれません:

    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 の使用方法とターゲット 2.0 に関する記事を見つけました。少し汚い感じですが、誰かの役に立つかもしれませんhttp://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on -net-2-0.aspx

于 2008-10-22T04:48:49.953 に答える
2
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

次に、簡単なデモ アプリケーションとして、InputBox と呼ばれる 1 つの複数行テキスト ボックス、OutputList と呼ばれる 1 つのリストビュー、および CountBtn と呼ばれる 1 つのボタンを持つ winforms アプリを作成します。リスト ビューで、「Word」と「Freq」の 2 つの列を作成します。「詳細」リスト タイプを選択します。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

幸運を!

編集

空白文字列のバグとケースのバグを修正

于 2008-10-22T05:16:59.727 に答える
1

かなり近いですが、\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
于 2008-10-22T05:23:33.287 に答える
1

これは役立つかもしれません:

自然言語処理のための単語頻度アルゴリズム

于 2008-10-22T04:46:21.440 に答える