Недавно я узнал о n-граммах и классной возможности сравнивать с ними частоту фраз в теле текста. Теперь я пытаюсь создать приложение vb.net, которое просто получает тело текста и возвращает список наиболее часто используемых фраз (где n> = 2).
Я нашел пример C # того, как сгенерировать n-грамм из тела текста, поэтому я начал с преобразования кода в VB. Проблема в том, что этот код создает один грамм на символ вместо одного грамма на слово. Для слов я хочу использовать следующие разделители: VbCrLf (новая строка), vbTab (табуляторы) и следующие символы:! @ # $% ^ & * () _ + - = {} | \: \ "'? ¿ /., ‹> '¡º × ÷';« »[]
Есть ли у кого-нибудь идеи, как я могу переписать для этой цели следующую функцию:
Friend Shared Function GenerateNGrams(ByVal text As String, ByVal gramLength As Integer) As String()
If text Is Nothing OrElse text.Length = 0 Then
Return Nothing
End If
Dim grams As New ArrayList()
Dim length As Integer = text.Length
If length < gramLength Then
Dim gram As String
For i As Integer = 1 To length
gram = text.Substring(0, (i) - (0))
If grams.IndexOf(gram) = -1 Then
grams.Add(gram)
End If
Next
gram = text.Substring(length - 1, (length) - (length - 1))
If grams.IndexOf(gram) = -1 Then
grams.Add(gram)
End If
Else
For i As Integer = 1 To gramLength - 1
Dim gram As String = text.Substring(0, (i) - (0))
If grams.IndexOf(gram) = -1 Then
grams.Add(gram)
End If
Next
For i As Integer = 0 To (length - gramLength)
Dim gram As String = text.Substring(i, (i + gramLength) - (i))
If grams.IndexOf(gram) = -1 Then
grams.Add(gram)
End If
Next
For i As Integer = (length - gramLength) + 1 To length - 1
Dim gram As String = text.Substring(i, (length) - (i))
If grams.IndexOf(gram) = -1 Then
grams.Add(gram)
End If
Next
End If
Return Tokeniser.ArrayListToArray(grams)
End Function