私は最近、n-gram と、テキスト本文内のフレーズの頻度を n-gram と比較する素晴らしい可能性について知りました。現在、テキスト本文を取得し、最も頻繁に使用されるフレーズのリストを返す vb.net アプリを作成しようとしています (n >= 2)。
テキスト本文から n-gram を生成する方法の C# の例を見つけたので、コードを VB に変換することから始めました。問題は、このコードでは単語ごとに 1 グラムではなく、文字ごとに 1 グラムが作成されることです。単語に使用したい区切り文字は、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