Qual é a melhor maneira de freqüência de palavra calcular em VB.NET?
-
03-07-2019 - |
Pergunta
Há alguns bons exemplos sobre como calcular as frequências palavra em C #, mas nenhum deles são abrangentes e eu realmente preciso de um em VB.NET.
Minha abordagem atual é limitada a uma palavra por contagem de freqüência. Qual é a melhor maneira de mudar isso para que eu possa ter uma freqüência de palavras totalmente preciso listar?
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
Eu prefiro um trecho de código real, mas genérico 'oh sim ... usar esta e executar isso iria funcionar tão bem.
Solução
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
Em seguida, para uma aplicação rápida demonstração, criar um aplicativo winforms com uma caixa de texto de várias linhas chamado InputBox, um listview chamado outputlist e um botão chamado CountBtn. Na visão de lista criar duas colunas - "Palavra" e "Freq." Selecione a opção "detalhes" tipo de lista. Adicionar um manipulador de eventos para CountBtn. Em seguida, use este código:
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
Você fez uma coisa terrível terrível para me fazer escrever isso em VB e nunca vou perdoá-lo.
: p
Boa sorte!
Editar
Fixed em branco corda bug e caso bug
Outras dicas
Este pode ser o que você está procurando:
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()
acabo testei e funciona
EDIT! Eu adicionei código para se certificar de que ele conta apenas letras e não símbolos.
FYI: Eu encontrei um artigo sobre como usar LINQ e alvo 2.0, é um se sente sujo pouco, mas pode ajudar alguém http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on- net-2-0.aspx
Bem perto, mas \ w + é um bom regex para coincidir com (apenas caracteres partidas Word).
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
Isso pode ser útil:
algoritmo frequência Word para processamento de linguagem natural