大量のテキストから最も一般的なフレーズを収集するプログラムを作成することを考えています。問題が単語を見つけるだけに縮小された場合、新しい単語をそれぞれハッシュマップに格納し、出現ごとにカウントを増やすのと同じくらい簡単になります。しかし、句の場合、文の各順列をキーとして保存することは実行不可能に思えます。
基本的に問題は、十分な長さのテキストから考えられるすべてのフレーズを抽出する方法を見つけることに絞り込まれます。フレーズを数えて、出現回数でソートするのは簡単です。
大量のテキストから最も一般的なフレーズを収集するプログラムを作成することを考えています。問題が単語を見つけるだけに縮小された場合、新しい単語をそれぞれハッシュマップに格納し、出現ごとにカウントを増やすのと同じくらい簡単になります。しかし、句の場合、文の各順列をキーとして保存することは実行不可能に思えます。
基本的に問題は、十分な長さのテキストから考えられるすべてのフレーズを抽出する方法を見つけることに絞り込まれます。フレーズを数えて、出現回数でソートするのは簡単です。
同じ順序で出現する連続する単語の一般的なパターンを検索していると仮定します (たとえば、「世界のトップ」は「世界のトップ」または「トップの世界」と同じフレーズとしてカウントされません)。
もしそうなら、次の線形時間アプローチをお勧めします。
これで、一般的なフレーズを収集することができます。
フレーズの終わりをどのように決定したいかは、あまり明確ではありません。1 つの可能性は、繰り返される 4 つの単語のすべてのシーケンスを単純に収集することです。
これは、最も長い共通プレフィックス配列が >= 4 である場所を調べるサフィックス配列を処理することにより、線形時間で実行できます。範囲 [start+1...start+len] 内のインデックス x の各実行は、LCP[ x] >= 4 (x の最後の値を除くすべて) は、len 回繰り返されるフレーズに対応します。句自体は、たとえば接尾辞 start+1 の最初の 4 語で指定されます。
このアプローチは、文末をまたぐフレーズを検出する可能性があることに注意してください。これを防ぐために、ピリオドなどの句読点を一意の整数に変換することをお勧めします。