ما هي أفضل طريقة لحساب تكرار الكلمات في VB.NET؟
-
03-07-2019 - |
سؤال
هناك بعض الأمثلة الجيدة حول كيفية حساب ترددات الكلمات في لغة 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
وهذا قد يكون من المفيد: