0

ある種の「ファジー」マッチングを行うには、ユーザーが入力できる文字列からサブフレーズのすべてのバリエーションを抽出する必要があります。

私が試したいくつかの例は、すべての仕事をしているようには見えません-それらはループして、並んでいるが全体に分散されていないサブフレーズのみを取得しているようです-例:

元の入力 - 「ヘビー デューティー ケーブル リール」 - 2 単語のサブ フレーズを取得すると、次のようになります。

頑丈な

デューティケーブル

ケーブルリール

しかし、私も欲しい:

重いケーブル

重いリール

デューティリール

そのため、サブフレーズを作成する際に単語を「見落とす」ことになります。理想的には、4 単語の元の入力に対して 3 & 2 単語のサブフレーズを返し、5 単語の入力に対して 4、3 & 2 などを返す必要があります。

For i As Integer = lst.Count To 1 Step -1 
    For j As Integer = 1 To i 
        Dim sb As New StringBuilder 
        sb.Append("( ") 
        For k As Integer = 0 To (lst.Count - i) 
            sb.Append(lst(j + k - 1) & ":" & j & ":" & k & ":" & i & " ") 
            Next 
        sb.Append(")") 
        rlst.Add(sb.ToString()) 
    Next 
Next
4

1 に答える 1

1

ネストされた 2 つの for ループは、2 つの単語の組み合わせに対して実行します。

Dim s = "heavy duty cable reel".Split()

For i As Integer = 0 To s.Length - 2
    For k As Integer = i + 1 To s.Length - 1
        Console.WriteLine(s(i) + " " + s(k))
    Next
Next

出力は

頑丈な
重いケーブル
重いリール
デューティケーブル
デューティリール
ケーブルリール

アップデート

これは、2 から単語数 - 1 までのすべての句の長さを取得するバージョンです。このためのクラスを作成しました。

Public Class PhraseBuilder
    Private words As String()
    Private phrases As List(Of String)

    Public Function GetList(ByVal initialPhrase As String) As List(Of String)
        words = initialPhrase.Split()
        phrases = New List(Of String)()
        For phraseLength As Integer = 2 To words.Length - 1
            AddPhrases("", 0, phraseLength)
        Next
        Return phrases
    End Function

    Private Sub AddPhrases(ByVal phrase As String, ByVal start As Integer,
                           ByVal wordCount As Integer)
        If wordCount >= 1 Then
            For i As Integer = start To words.Length - wordCount
                AddPhrases(phrase + " " + words(i), i + 1, wordCount - 1)
            Next i
        Else
            phrases.Add(phrase.TrimStart())
        End If
    End Sub
End Class

あなたはそれをテストすることができます

Sub PrintPhrases()
    Dim phraseBuilder = New PhraseBuilder()
    Dim phrases = phraseBuilder.GetList("heavy duty cable reel")
    For Each phrase As String In phrases
        Console.WriteLine(phrase)
    Next
End Sub

結果は次のようになります。

頑丈な
重いケーブル
重いリール
デューティケーブル
デューティリール
ケーブルリール
頑丈なケーブル
ヘビーデューティーリール
重いケーブルリール
デューティケーブルリール

ここで再帰を使用したことに注意してください。再帰により、for ステートメントを任意の深さにネストできます。StringBuilderフレーズの先頭のコピーを作成する必要があるため、は使用しませんでした。これは、不変であるため、自動的に行う文字列を使用すると簡単に実行できます。を複製する簡単な方法はありませんStringBuilder

于 2012-11-29T17:38:35.407 に答える