あなたが説明した問題を解決するために使用しているアルゴリズムが何であるかはわかりませんが、これはそのような状況で私がすることです
前処理:
- 一連の空白文字が 1 つになるようにします (スペース、タブなど)。
- テキスト全体を小文字または大文字にします。
プロセス:
- フラグが立てられたすべての単語をメモリにプリロードします (バイナリ検索を使用する順序付けられたリスト。理論的には、このプロセスは最初にリストを作成するときにのみ時間を消費し、エントリの順序付けに進み、後でロードできる形式でこれらを永続化します。さらに追加する場合は、バイナリ検索を実行して単語がリストにあるかどうかを判断し、エントリを対応する位置/スロットに配置する必要があります)。
- すべてのキャッチ フレーズをメモリにプリロードします (ここでは、単語のロードに使用したのと同じアプローチを使用できます)。
- ファイルを壁で囲み、フラグ付きリストに一致する単語のオフセット/位置と長さを保持します。大きなファイルを考慮に入れるために、オフセットは長くする必要があります。
- フラグ付き単語のシーケンスを検索します。最初の単語の後のすべての一致はシーケンスの候補です。空白文字のシーケンスをすべて削除するため、この単語のオフセットが前の単語と前の単語のオフセットに等しい場合、WordN はシーケンスの一部であることが確実です。 length に 1 を加えたもので、ここでの 1 は 2 つの単語を区切る空白文字を表します。word2Offset = word1Offset + word1Length + 1.
- 見つかったシーケンスのいずれかがキャッチ フレーズの開始または一致するかどうかを確認します。
実装アセット:
- Word:単語を表すには単純な文字列で十分です。すべての単語は小文字または大文字で保存する必要があります。
- コンポーネント:コンポーネントは、単語とファイル内で見つかったファイルのオフセットを保持する構造です。
- フレーズ: 2 つ以上のコンポーネントの構成であり、単純なリストで十分です。
- 一度に 1 文字ずつファイルを読み取ると、単語や単語のシーケンスをすばやく判断するのに役立ちます。たとえば、すべての空白は、基本的に単語である新しいコンポーネントが読み取られたことを意味するため、一致するかどうか、一致して最初に一致する場合、その部分であるかどうかはわかりません。シーケンスですが、2 番目または 3 番目の単語が読み取られ、一致するかどうかがわかると、現在のオフセットが前述の規則に従っているかどうかを確認できます。
フェーズの確認
- フラグが付けられた単語がない場合、一致するフレーズはありません。ほとんど不可能ですが、誰が知っていますか。
- ファイル内の一連の単語一致は、フレーズ チェックの候補を表します。
- 単語の長さとその後の単語の内容を確認して、キャッチ フレーズと候補の一致を確認します。ここでは、フレーズの一部または全体が一致するかどうかを確認できます。
2 つのシーケンス フェーズ間のテキストを取得します。
フェーズは単なるコンポーネントのリストであるため、最初のフレーズの最後の単語のオフセットと長さの合計から、2 番目のフレーズの最初の単語のオフセットまでのファイルを読み取る必要があります。
From = PhaseALastWordOffset + PhaseALastWordLength
To = PhaseBFirstWordOffset
Contents = StoryFile.readSegment(From, To);
それが役に立てば幸い。