سؤال

هناك بعض الأمثلة الجيدة حول كيفية حساب ترددات الكلمات في لغة 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

أفضّل أن يكون مقتطف الشفرة الفعلي، ولكن العبارة العامة "أوه نعم...استخدم هذا وقم بتشغيل ذلك" قد تعمل أيضًا.

هل كانت مفيدة؟

المحلول

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

ثم للحصول على تطبيق تجريبي سريع، قم بإنشاء تطبيق winforms باستخدام مربع نص متعدد الأسطر يسمى InputBox، وعرض قائمة واحد يسمى OutputList وزر واحد يسمى CountBtn.في طريقة عرض القائمة ، قم بإنشاء عمودين - "كلمة" و "فرقة". حدد نوع قائمة "التفاصيل".إضافة معالج حدث لـ 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 ولن أسامحك أبدًا.

حظ سعيد!

يحرر

تم إصلاح الخلل في السلسلة الفارغة وعلة الحالة

نصائح أخرى

وربما يكون هذا ما كنت تبحث عن:

    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()

ولقد اختبرت ذلك فقط وأنها لا تعمل

وتحرير! واضاف لقد كود للتأكد من أن يكون ذلك ضروريا فقط رسائل وليس حرف.

وFYI: لقد وجدت مقالا عن كيفية استخدام LINQ وتستهدف 2.0، التي يشعر القذرة قليلا ولكنها قد تساعد شخص <وأ href = "http://weblogs.asp.net/fmarguerie/archive/2007/09 /05/linq-support-on-net-2-0.aspx "يختلط =" نوفولو noreferrer "> http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on- صافي 2-0.aspx

وثيق جدا، ولكن \ ث + غير باستخدام التعابير المنطقية جيد لتتلاءم مع (مباريات أحرف كلمة فقط).

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top