JP3672242B2 - パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 - Google Patents
パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 Download PDFInfo
- Publication number
- JP3672242B2 JP3672242B2 JP2001004189A JP2001004189A JP3672242B2 JP 3672242 B2 JP3672242 B2 JP 3672242B2 JP 2001004189 A JP2001004189 A JP 2001004189A JP 2001004189 A JP2001004189 A JP 2001004189A JP 3672242 B2 JP3672242 B2 JP 3672242B2
- Authority
- JP
- Japan
- Prior art keywords
- character
- pattern
- array
- search
- suffix array
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90348—Query processing by searching ordered data, e.g. alpha-numerically ordered data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99931—Database or file accessing
- Y10S707/99933—Query processing, i.e. searching
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99931—Database or file accessing
- Y10S707/99933—Query processing, i.e. searching
- Y10S707/99936—Pattern matching access
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Description
【発明の属する技術分野】
本発明は、文字列などの配列中に存在する頻出部分配列や、二つ以上の配列に共通な部分配列を検索するためのデータ構造及びこのデータ構造を用いたパターン検索方法に関する。
【0002】
【従来の技術】
文字列中に存在する頻出部分文字列や、二つ以上の文字列に共通な部分文字列などを高速で検索するのに有効なデータ構造として、接尾辞木(Suffix tree)が知られている。接尾辞木は、処理対象の文字列中に存在しない文字$を処理対象の文字列の最後に加えた文字列における全ての接尾辞を表す木である。接尾辞木の葉ノード(各枝において他の枝が接続されていない先端のノード)は、それぞれの接尾辞に対応する。
ここで、接尾辞とは、所定の文字列において、所定の文字を特定した場合の当該文字以降の文字列である。
図6は、接尾辞木の例を示す図である。図6には、処理対象の文字列として「mississippi」の最後に文字$を加えた文字列「mississippi$」の接尾辞木を示す。
【0003】
接尾辞木において、各枝は、部分文字列に相当するラベルを持つ。そして、ルートノードから葉ノードまでの各枝が持つラベルを並べたものが、当該葉ノードに対応する接尾辞となる。図6に示す例では、例えば、ルートノードから「i」「ssi」「ppi」のラベルを持つ各枝を経て到達する葉ノードに対応する接尾辞は「issippi」であり、同様に「s」「si」「ssippi」のラベルを持つ各枝を経て到達する葉ノードに対応する接尾辞は「ssissippi」である。
【0004】
また、接尾辞木における単一のノード(ルートノードを含む)から出てゆく各枝に付されているラベルの最初の文字は全て異なり、これらはラベルの最初の文字でソートされている。図6に示す例では、図の左側から右側へ向けて英語のアルファベット順(i、m、p、sの順)に枝が並んでいる。
【0005】
接尾辞木を生成するアルゴリズムとしては、処理対象である文字列の長さをn、文字列を構成するアルファベットのサイズ(文字の種類の数)をsとした場合、O(n log s)のアルゴリズムが知られている。特にアルファベットが整数アルファベット(1からnまでの数字)である場合は、O(n)のアルゴリズムが知られている。ここで、O(func(n))は、実際の計算時間がtである場合に、n≧kであるようなnに対して、
0≦t≦c×func(n)
が成り立つような何らかの定数cとkの組が必ず存在することを意味する。したがって、O(n log s)はn log sの定数倍以内の時間で計算が可能であることを意味し、O(n)はnの定数倍以内の時間(この場合、nも定数なので、定数時間内)で計算できることを意味する。
【0006】
これを用いれば、長さmの部分文字列の検索は、O(m log s)に相当する時間で行うことができる。通常、アルファベットのサイズは定数サイズなので、この時間は線形時間といって良い。
英文字テキスト(n文字)に対するこの接尾辞木を扱うために必要とする記憶装置の記憶容量は、20nバイト〜40nバイトである。
【0007】
この接尾辞木のデータサイズは大きいため、このデータサイズを抑制する類似のパターン検索用のデータ構造として、接尾辞配列(suffix array)が知られている。
上述したように、接尾辞木の葉ノードは、それぞれが文字列の接尾辞に対応している。この接尾辞を、接尾辞木の一端側(図6の例では左端側)の葉ノードに対応する接尾辞から順に並べると、処理対象の文字列における全ての接尾辞を辞書的順序で並べた配列が得られる。ただし、各接尾辞は、最後に終了判定文字$を付加されているものとする。
【0008】
この配列の構成要素である各接尾辞を、処理対象の文字列における当該接尾辞の最初の文字の位置を表す情報で置き換える(例えば、「ippi$」を「8」に、「issippi$」を「5」にというように置き換える)。これにより、処理対象の文字列と同じ長さの配列(接尾辞配列)が得られる。例えば、図6における「mississippi$」の接尾辞配列は、「8 5 2 11 110 9 7 4 6 3 12」となる。なお、文字$は他の全ての文字よりも辞書的順序が後であるとしている。
【0009】
この接尾辞配列を用いると、接尾辞木を用いる場合と比較して、文字列検索を行うために必要なメモリ容量を削減することができる。また、文字列の検索に要する時間は、2分探索を行うことから、O(p log q)となる。ただし、qはデータベースの大きさ、pは検索しようとする文字列の長さである。
通常、必要な記憶容量は一つの文字に対し4バイトであるから、テキストが英文字(1バイト)の場合、n文字のテキストに対するこのデータベースのデータサイズは5nバイトである。
【0010】
また、データベースに、さらに隣接する接尾辞の共通接頭辞長のテーブルを持たせることもできる。このテーブルを用いると、接尾辞木配列のみを用いる場合に対して、検索時間をO(p+log q)と短縮することができる。なお、この場合におけるデータベースのデータサイズは9nバイトとなる。
【0011】
【発明が解決しようとする課題】
大規模なテキストデータベースを検索するために、上述した接尾辞木や接尾辞配列をデータ構造として用いる場合、次のような問題がある。
まず、接尾辞木をデータ構造として用いる場合、必要とされるデータベースの大きさが大きいという問題がある。
上述したように、処理対象である文字列の長さがnである場合、このテキストに対する接尾辞木を扱うために必要な記憶装置の記憶容量、すなわちデータベースのデータサイズは、20nバイト〜40nバイトである。一般に、データ構造として接尾辞木を用いる場合、記憶装置に対して、接尾辞配列を用いる場合の4〜6倍の記憶領域(接尾辞配列では、1バイト文字で文字数nのテキストの場合、5nバイト)を要する。
このため、大規模なテキストデータベースに対して接尾辞木を使用することは困難である。
【0012】
一方、接尾辞配列をデータ構造として用いる場合、検索に長時間を要するという問題がある。
接尾辞配列に対して検索を行う場合、2分探索を行うため、データベースの大きさをq、検索しようとする文字列の長さをpとして、O(p log q)だけの時間を要する。したがって、アルファベットのサイズが定数サイズである場合にほぼ線形時間で探索を行うことができる接尾辞木に比べて、多大な計算時間を要する。
また上述したように、データサイズが多少大きくなることを許し、データベースに、接尾辞配列中で隣接する接尾辞の共通接頭辞長のテーブルを持たせることによって、計算時間をO(p+log q)に短縮することができる。しかしこの場合であっても、依然としてlog qの項が残っているため、接尾辞木の場合と比べると、多大な計算時間を要する。
【0013】
そこで本発明は、大規模テキストデータベースの検索において、処理を行うためのデータ構造におけるデータサイズの増大を抑えながら、高速な検索を実現することを目的とする。
【0014】
【課題を解決するための手段】
かかる目的のもと、本発明は、検索対象である文字列中から所望のパターンを検索するパターン検索方法において、次の範囲検索ステップと、文字列抽出ステップとを含むことを特徴とする。すなわち、範囲検索ステップにおいて、このパターンの最後の文字から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、この中間パターンの先頭の文字が検索対象の文字列に対する接尾辞配列のどの範囲に存在するかを順次検索する。この検索をパターンの最後の文字から順に実行することによって、最終的に、このパターン自体を含む接尾辞配列の範囲が求められる。次に、文字列抽出ステップにおいて、当該接尾辞配列の範囲に含まれる各要素に対応する文字列の要素を特定し、この文字列の各要素を先頭としてこのパターンの要素数と同じ数の要素からなる部分文字列を抽出する文字列抽出ステップとを含むことを特徴とする。
上記のように構成されたパターン検索は、アルファベットや日本語のテキストなど種々の文字による文字列における検索に用いることができるが、バイナリデータや遺伝子配列のような使用される文字の種類が少ない文字列から所望のパターンを検索する場合には、検索に用いるデータ構造のデータサイズを特に小さくすることができる。
【0015】
ここで、この範囲検索ステップは、検索対象の文字列に対する接尾辞配列の各要素に関して、この各要素に対応する文字列中の各文字の一つ前に位置する前置文字を特定するステップと、接尾辞配列中の所定の要素以前の各要素における前置文字の中に含まれる、このパターン中の所望の文字の個数を求めるステップと、求められた文字の個数に基づいて、この文字が接尾辞配列のどの位置に存在するかを検出するステップとを含むことを特徴とする。
【0016】
また、本発明は、検索対象である配列中から所望のパターンを検索するパターン検索方法において、このパターンの最後の要素が前記配列中のどこに位置するかを検索するステップと、このパターンが複数の要素により構成されている場合に、このパターン中の最後の要素に、この最後の要素の前に位置する要素を後ろから順に一つずつ加えて各中間パターンを得、この中間パターンが配列中のどこに位置するかを順次検索するステップとを含むことを特徴とする。
【0017】
また、本発明は、上記のように接尾辞配列を用いるパターン検索だけではなく、接頭辞配列を用いるパターン検索にも適用することができる。すなわち、上述した範囲検索ステップにおいて、このパターンの最初の文字から後方へ1文字ずつ順に加えて得られる各中間パターンに関して、この中間パターンの最後の文字が検索対象の文字列に対する接頭辞配列のどの範囲に存在するかを順次検索する。この検索をパターンの最初の文字から順に実行することによって、最終的に、このパターン自体を含む接頭辞配列の範囲が求められる。次に、文字列抽出ステップにおいて、当該接頭辞配列の範囲に含まれる各要素に対応する文字列の要素を特定し、この文字列の各要素を最後尾としてこのパターンの要素数と同じ数の要素からなる部分文字列を抽出する文字列抽出ステップとを含む構成とすることができる。
【0018】
また、本発明は、検索対象である文字列中から所望のパターンを検索するパターン検索装置において、この文字列の接尾辞配列に基づいてパターンを検索するためのデータ構造を構築する前処理部と、この前処理部により構築されたデータ構造を用いて所望のパターンを検索する検索部とを備え、この前処理部は、接尾辞配列の各要素に関して、この各要素に対応する文字列中の各文字の一つ前に位置する前置文字を特定し、接尾辞配列中の所定の要素以前の各要素における前置文字の、検索対象の文字列を構成する文字の種類ごとの個数を求めることによりデータ構造を構築することを特徴とする。
【0019】
ここで、前処理部は、前置文字の個数を、接尾辞配列における要素の位置と、検索対象の文字列を構成する文字の種類とに対応付けて格納したテーブルを持つことができる。
ここでさらに、このテーブルを、接尾辞配列の所定数個おきの要素の位置に関するテーブルとすることができる。すなわち、テーブルに格納するデータを間引くことにより、当該データ構造のデータサイズを縮小することができる。
さらにこの場合、前処理部は、間引いた範囲の前置文字の個数を算出する際に使用するため、このテーブルにおいて情報が管理される接尾辞配列の所定の位置に基づいて、この位置の間における接尾辞配列の要素に対する前置文字に関する情報を格納した他のテーブルをさらに持つことができる。
【0020】
また、このパターン検索装置において、検索部は、この接尾辞配列中の所定の要素以前の各要素における前置文字の個数に基づいて、パターンの最後の文字から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、この中間パターンの先頭の文字が文字列に対する接尾辞配列のどの範囲に存在するかを順次検索する。この検索により、このパターン自体を含む接尾辞配列の範囲が得られる。そして、この範囲に含まれる各要素に対応する文字列の要素を特定し、この文字列の各要素を先頭としてパターンの要素数と同じ数の要素からなる部分文字列を抽出する。
【0021】
また、本発明は、コンピュータに、検索対象である配列中から所望のパターンを検索する処理を実行させるコンピュータプログラムにおいて、このパターンの最後の要素から前方へ一つずつ順に加えて得られる各中間パターンに関して、この中間パターンの先頭の要素が検索対象である配列に対する接尾辞配列のどの範囲に存在するかを順次検索する処理と、この検索によりこのパターン自体に関して得られた接尾辞配列の範囲に含まれる各要素に対応する配列の要素を特定し、この配列の各要素を先頭としてこのパターンの要素数と同じ数の要素からなる部分配列を抽出する処理とをコンピュータに実行させることを特徴とする。
【0022】
さらにまた、本発明は、コンピュータに、検索対象である配列中から所望のパターンを検索する処理を実行させるコンピュータプログラムにおいて、検索対象である配列に対する接尾辞配列の各要素に関して、この各要素に対応する配列中の各文字の一つ前に位置する要素を特定する処理と、この接尾辞配列中の所定の要素以前の各要素における前置要素の、配列を構成する要素の種類ごとの個数を求める処理と、この接尾辞配列中の所定の要素以前の各要素における前置要素の個数に基づいて、このパターンの最後の要素から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、この中間パターンの先頭の要素がこの配列に対する接尾辞配列のどの範囲に存在するかを順次検索する処理と、この検索によりこのパターン自体に関して得られた接尾辞配列の範囲に含まれる各要素に対応する配列の要素を特定し、この配列の各要素を先頭としてこのパターンの要素数と同じ数の要素からなる部分配列を抽出する処理とをコンピュータに実行させることを特徴とする。
これらのコンピュータプログラムは、例えば磁気ディスクその他の記憶媒体に格納して提供することができる。また、インターネットなどのネットワークを介して伝送させることにより提供することもできる。
【0023】
【発明の実施の形態】
以下、添付図面に示す実施の形態に基づいてこの発明を詳細に説明する。
図1は、本実施の形態を実現するのに好適なコンピュータ装置のハードウェア構成の例を模式的に示した図である。
図1に示すコンピュータ装置は、CPU(中央処理装置)101と、システムバスを介してCPU101に接続されたM/B(マザーボード)チップセット102及びメインメモリ103と、PCIバスなどの高速なバスを介してM/Bチップセット102に接続されたビデオカード104、ハードディスク105及びネットワークインタフェース106と、さらにブリッジ回路110及びISAバスなどの低速なバスを介してM/Bチップセット102に接続されたフロッピーディスクドライブ107、キーボード108及びシリアルI/Oポート109とを備える。
なお、図1は本実施の形態による検索方法を実現するコンピュータ装置の構成を例示するに過ぎず、本実施の形態を適用可能であれば、他の種々のシステム構成を取ることが可能である。
【0024】
本実施の形態は、図1に示したメインメモリ103に展開されたプログラムにてCPU101を制御することにより、所定の文字列(文字を要素とする配列)中から所望の部分文字列を検索する(以下、検索対象の文字列をテキスト、検索する部分文字列をパターンと称す)。
図2は、プログラム制御されたCPU101において、本実施の形態におけるデータ構造の構築及び検索を行うための機能ブロックを示す図である。
図2を参照すると、本実施の形態は、テキストの接尾辞配列を生成する接尾辞配列生成部10と、接尾辞配列生成部10にて生成された接尾辞配列を変換して所望のデータ構造を構築する前処理部20と、前処理部20にて構築されたデータ構造を用いてパターンの検索を行う検索部30とを備える。
【0025】
上述したように、これらの構成要素は、プログラム制御されたCPU101により実現される仮想的なソフトウェアブロックである。当該プログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記憶媒体に格納して提供したり、ネットワークを介して伝送したりすることができる。本実施の形態は、図1に示したネットワークインタフェース106やフロッピーディスクドライブ107、図示しないCD−ROMドライブなどを介して当該プログラムを入力し、ハードディスク105に格納する。そして、ハードディスク105に格納されたプログラムをメインメモリ103に読み込んで展開し、CPU101にて実行する。
【0026】
図2において、接尾辞配列生成部10は、図示しないデータベースから検索対象であるテキストを取得し、接尾辞配列を生成する。接尾辞配列の生成方法としては、公知の任意のアルゴリズムを用いることができる。検索対象であるテキストや生成された接尾辞配列は、メインメモリ103に格納される。なお、接尾辞配列は、公知の種々の方法により生成することが可能であり、外部装置において生成された接尾辞配列を本実施の形態において使用することもできる。したがって、接尾辞配列生成部10は必須の構成要素ではない。接尾辞配列生成部10を構成要素として設けない場合は、検索対象となるテキストと当該テキストの接尾辞配列とがメインメモリ103に直接格納されることとなる。
【0027】
以下の説明において、検索対象となるテキストをT[1・・・n]、検索するパターンをP[1・・・m]とする。また、テキストTに対する接尾辞配列をSA[1・・・n]とする。なお、以下の説明では、テキストTやパターンPの文字列はダブルクオーテーションマーク(“ ”)で囲み、その中の文字はクオーテーションマーク(‘ ’)で囲んで示すこととする。
例えば、「mississippi」の最後に文字$を加えたテキストTは、
T[1・・・12]=“mississippi$”
となる。ここで、‘$’は、終了判定文字であり、辞書的順序が他の全ての文字よりも大きい(すなわち後に位置する)ものとする。また、テキストT[1・・・12]から3文字のパターン「ssi」を検索する場合、検索パターンPは、
P[1・・・3]=“ssi”
となる。さらにここで、テキストTに対し、T[5]=‘i’(5番目の文字)のように表すと、テキストTに対する接尾辞配列SAは、
SA[1・・・12]={8 5 2 11 1 10 9 7 4 6 3 12}
となる。
なお、終了判定文字‘$’は、概念上のものとして扱い、実際の処理においてはメインメモリ103に格納しなくても良い。この場合、T[i]にアクセスする際、i=12ならば‘$’である、という分岐条件を入れることとなる。例えば、テキストTの文字数が256個あり、‘$’も1文字として扱うと1バイトに収まらなくなってしまうような場合は、メインメモリ103に格納しない方が望ましい。
【0028】
前処理部20は、接尾辞配列生成部10により生成された接尾辞配列SAを読込み、これに基づいて、検索対象である文字列からf(i,c)(iはn以下の正の整数、cは文字)で定義されるデータを検出するためのデータ構造を構築する。
ここで、f(i,c)は、T[SA[j]−1]=c(j≦i)であるようなjの数である。配列Bを考え、B[i]=T[SA[i]−1]とする。すなわち、配列Bは、接尾辞配列SAの各要素に対応するテキストTの各文字の一つ前に位置する文字(前置文字)の配列である。例えば、B[4]=T[SA[4]−1]=T[10]=‘p’となる。同様にして配列Bの全ての文字を書き出すと次のようになる。
B[1・・・12]=“ssmp$pissiii”
したがって、上記のf(i,c)の値は、配列Bにおいて、インデックスがi以下での文字cの個数で表現することができる。例えば、f(6,‘s’)=2であり、f(6,‘p’)=2であり、f(6,‘m’)=1である。なお、i>nであるようなiに対しては、f(i,c)=f(n,c)と定義する。また、i≦0であるようなiに対しては、f(i,c)=0と定義する。
【0029】
f(i,c)のデータ全体をテーブルとして保持すれば、パラメータであるi、cを与えれば直ちに対応するf(i,c)を求めることができる。しかし、テキストTを構成する文字の種類(s)が極めて少ない場合、例えばバイナリデータの文字列(2種類:0、1)やDNA配列(4種類:アデニン(A)、チミン(T)、グアニン(G)、シトシン(C))では可能であるが、文字の種類(s)が多い場合は、当該テーブルは極めて大きな配列となるため、現実的ではない。
そこで、前処理部20は、以下のようにしてf(i,c)を算出するためのデータ構造を構築する。
【0030】
(1)テーブルFの作成
kを適当な大きさのn以下の正の整数であるとする。まず、すべての正の整数i(k*i<n+k)に対して、f(k*i,c)のテーブルを作成する。これは、テキストTをk個の文字ごとに区切り、k番目の文字ごとにf(i,c)を求めてテーブルを作成することに相当する。f()の大きさはn以下であるから、このサイズは(n*s log n)/kビットである。これは、nが1ワードに入る通常のケースではO(n*s/k)ワード(すなわち、n*s/kの定数倍以内)のことである。
このテーブルをFとし、
F[i][c]=f(k*i,c)
とする。なお、このテーブルFは、テーブルの大きさとテキストの大きさのうち大きい方に比例した時間で構築することができる。
【0031】
このテーブルFを持つことにより、kの倍数のインデックスに関しては、fをO(1)の時間で求めることができる。そこで次に、kの倍数以外のインデックスに関してfの値を求めるためのデータ構造を考える。
そのため、g(i,c,j)を、T[SA[p]−1]=cを満たすp(ただし、k*(i−1)<p≦k*i)のうち、j番目のものとし、まず、このg(i,c,j)を求めるためのデータ構造について述べる。
【0032】
(2)テーブルLの作成
h(i,c)を、f(k*i,c)−f(k*(i−1),c)とする。これはテーブルFから直ちに計算可能である。
l(i,c)を、h(i,d)(d<c,辞書順)の総和として、これをテーブルとして持つ。このテーブルをLとし、
L[i][c]=l(i,c)
とする。このテーブルLのサイズは(n*s log k))/kビットである。
【0033】
(3)テーブルGの作成
次に、全てのr(0<k*r<n+k)に対して、0<q≦kを満たす整数qを、T[SA[q+k*(r−1)]−1]の値が同じ物ごとに辞書的順序にしたがって並べ替えたものをテーブルG[r][1・・・k]とする。このとき、T[SA[q+k*(r−1)]−1]の値における辞書的順序が同じものに関してはqの値が小さいものが先になるように並べる。ただし、
【数1】
の場合、0<q≦n−(r−1)kのようなqだけを並べる。これは、数1を満足するrの範囲に含まれる文字の数がk個に満たない場合があるためである。すなわち、上述したようにテーブルFの作成において、テキストTをk個の文字ごとに区切ったが、テキストTの文字数nがkで割り切れない場合は、最後尾の区分における文字数はk個に満たない。したがって、0<q≦n−(r−1)kのようなqを並べることとする。
テーブルGの配列のサイズは全体でnであり、ビットで表すとn log kビットということになる。これは、例えば次のようにして求めることができる。
ただし、rの値が上記数1を満足する場合、forループは(q=1;q≦n−(r−l)k;q++)となる。
【0034】
(4)f(i,c)の計算
上記のようにして作成されたテーブルG及びテーブルLを用いて、g(i,c,j)を示すと、
g(i,c,j)=G[i][L[i][c]+j]+k*(i−1)
である。したがって、g(i,c,j)はG、Lの二つテーブルからO(1)時間で得ることができる。
次に、k*(i−1)<j≦k*iであるようなjに対し、T[SA[p]−1]=c(ただしk*(i−1)<p≦j)となるようなpの数をf’(j,c)とする。そして、x(0<x≦h(i,c))の区間で、g(i,c,x)の値がj以下となるような最大のxを見つけ出すと、
f’(j,c)=x
となる。このxの値は、g(i,c,x)の値が昇順になっているため、2分探索によりO( log h(i,c))で計算可能である。h(i,c)<kであるから、これは、O( log k)ということである(h(i,c)の平均値はk/sであるため、実際にはより短い時間で計算できる)。ただし、このようなxが存在しない場合は、f’(j,c)=0とする。
以上の前提で、f(j,c)は、
f(j,c)=F[i−1][c]+f’(j,c)
と計算できる。したがって、f(j,c)は、以上のデータ構造を用いることにより、O( log k)で計算することができる。
【0035】
上述したテーブルF、L、Gを表すのに必要なビット数は、テーブルFが(n*s log n)/kビット、テーブルLが(n*s log k))/kビット、テーブルGがn log kビットであるから、全体で
(n*s/k)*(log n+log k)+n log kビット
である。これらのテーブルF、L、Gは、メインメモリ103に格納される。
実際の運用においては、メインメモリ103の記憶容量として、これに加えて接尾辞配列SAのためのn log nビット及びテキストT自身のためのn log sビットが必要になる。
【0036】
また、前処理部20は、テキストTに関して、これらのデータ構造に加えて次に示すテーブルCも持つこととする。このテーブルの要素C[c]は、テキストTに含まれるc以下の文字の総数を表す。ただし、c以下の文字とは、cあるいはcより辞書的順序で早い文字を意味する。
テーブルCも他のデータ構造と同様に、メインメモリ103に格納される。このテーブルCのサイズはs log nビットである。また、テーブルCはテキストTに対し、線形時間で計算可能である。
なお、kの値を小さく設定した場合には、j=i*k+d(d<k)に対して、f(i*k,c)を求める際、テーブルL、Gは持たずに、テーブルFから求められるf(i*k,c)の値と、i*k+lとに基づいて、T[SA[j]−1]の値がcであるものの個数を数えるという方法も考えられる。この場合の計算時間はO(k)であるので、kとlog kの値が近いような小さなkに対しては有効である。この方法を用いる場合は、テーブルL、Gを持たない分、必要なメモリの記憶容量は減少する。
【0037】
検索部30は、前処理部20にて作成された上記のデータ構造を用いて、テキストTから所望のパターンPを検索する。
検索は、f(i,c)を用い、次のように行う。
start = C[P[m]-1]+1 ;
end = C[P[m]] ;
for each i (m-1>=i>=1, 降順) {
c = P[i];
start = C[c-1] + f(start, c);
end = C[c-1] + f(end, c);
if (end < start) {
パターンは存在しないので終了。
}
}
ただし、文字cに対し、c+1とは、辞書的順序で文字cの次に来る文字を表し、c−1は辞書的順序で文字cの前に来る文字を表すものとする。ただし、辞書的順序で最小のアルファベットaに対しては、C[a−1]は0を表すものとする。
【0038】
図3は、上記の検索アルゴリズムに対応するフローチャートである。同図を参照して、本実施の形態によるパターンの検索手順を説明する。この検索方法は、パターンを当該パターンの構成文字列の後ろから検索することが特徴である。図3に示す検索アルゴリズムにより、求めるパターンは、テキストTの接尾辞配列SAにおいて、SA[j](start≦j≦end)の位置から始まる場所に存在するので、それを列挙すればよい。
【0039】
図3を参照すると、検索部30は、まず、startにC[P[m]−1]+1を代入し、endにC[P[m]]を代入し、startとendの値を求める。また、i=m−1とする(ステップ301)。
次に、iの値が正(i>0)かどうかを調べ、正であれば、次に、c=P[i]として、startにC[c−1]+f(start,c)を代入し、endにC[c−1]+f(end,c)を代入し、startとendの値を求める。また、i=i−1とする(ステップ302、303)。
次に、endの値がstartの値を下回ったかどうかを調べ、下回ったならば、検索パターンPにマッチする文字列はテキストTには存在しないことがわかるので、処理を終了する(ステップ304、305)。
一方、endの値がstartの値を下回っていなければ、ステップ302に戻って、新たなiに関してstart及びendの値を求める(ステップ304)。
ステップ302において、iの値が0以下になったならば、start及びendの値を用い、start≦j≦endであるような全てのjに対して、SA[j]の位置から始まるテキストTの接尾辞を出力して処理を終了する(ステップ306)。このとき、当該接尾辞と検索パターンPとがマッチする。
【0040】
次に、
T[1・・・12]=“mississippi$”
P[1・・・3]=“ssi”
SA[1・・・12]={8 5 2 11 1 10 9 7 4 6 3 12}
の場合について、前処理部20によるデータ構造の構築及び検索部30によるパターンPの検索の動作例を説明する。
本動作例では、テキストTを区切る基準としてk=4とする。
【0041】
まず、k=4の場合のテーブルFを作成する。
上述したように、F[i][c]にはf(k*i,c)が入る。そして、k*i<n+kであり、n=12であるから、k=4の場合、iの値は1、2、3である。したがって、テーブルFには、i=1、2、3及びc=‘i’、‘m’、‘p’、‘s’、‘$’の各々について、f(4*i,c)の値が入り、図4に示すようになる。
例えば、F[2][‘p’]の場合、f(4*2,‘p’)であるから、配列B[1・・・12]=“ssmp$pissiii”において8(=4*2)番目の文字である‘s’以前に‘p’は2個存在する。したがって、テーブルFのF[2][‘p’]には2が入る。なお、図4のテーブルFでは、‘$’に対するエントリーも入れているが、実際には、検索パターンの中に‘$’が入ることは考えなくて良いので、‘$’に対する列は省略することができる。
【0042】
次に、テーブルLを作成する。
上述したように、h(i,c)をf(4*i,c)−f(4*(i−1),c)とし、l(i,c)を、h(i,d)(d<c,辞書順)の総和とすると、文字cの順序は‘i’<‘m’<‘p’<‘s’<‘$’であるから、テーブルLは、図5に示すようになる。
例えば、L[2][‘s’]は、h(2,‘i’)とh(2,‘m’)とh(2,‘p’)との総和であり、図4のテーブルFを参照すれば、
すなわち、配列B[5・・・8]において、‘i’が一つ存在することがわかる。同様に、
h(2,‘m’)=f(8,‘m’)−f(4,‘m’)=1−1=0
h(2,‘p’)=f(8,‘p’)−f(4,‘p’)=2−1=1
したがって、テーブルLのL[2][‘s’]には2(=1+0+1)が入る。
【0043】
ところで、図4及び図5を参照すると、テーブルLにおいて、
L[i][c+1]=L[i][c]+F[i][c]−F[i−1][c]
という関係がある。ただし、c+1は辞書的順序で文字cの次にくる文字である。また、F[0][c]=0としている。例えば、上述したL[2][‘s’]の場合、
となる。このことから、x個おきの文字に対してのみテーブルLを作成し、間の文字に対する値はテーブルL及びテーブルFから算出することにより、メモリを節約することができる。ただし、この場合、この部分の計算時間はx倍となる。なお、図4の場合と同様に、テーブルLにおいても‘$’の列は省略することができる。
【0044】
次に、テーブルGを作成する。
上述したように、全てのr(0<4*r<n+4)に対して、T[SA[q+4*(r−1)]−1](ただし、0<q≦4)の値が同じ物ごとに辞書的順序にしたがって並べ替えたものがテーブルG[r][1・・・4]である(ただし、rの値が上述した数1を満足する値である場合は0<q≦n−(r−1)*4)。ここで、[SA[q+4*(r−1)]−1]は、配列Bにおいて、B[1・・・4]、B[5・・・8]、B[9・・・12]に対応する。したがって、例えばG[1][1・・・4]は、B[1・・・4]=“ssmp”であるから対応するq=1、2、3、4を‘s’‘s’‘m’‘p’の辞書的順序で並べ替えれば、
G[1][1・・・4]={3,4,1,2}
となる(q=1の‘s’とq=2の‘s’については、qの小さい方を先にしている)。同様に、r=2、3についても考え、結果として、
G[1・・・3][1・・・4]={3,4,1,2}、{3,2,4,1}、{2,3,4,1}
を得る。
【0045】
次に、以上のテーブルF、L、Gを用いて計算されるg(i,c,j)、f’(j,c)及びf(j,c)について、具体的な算出例を挙げる。まず、g(3,‘r’,2)について、
g(3,‘r’,2)=G[3][L[3][‘i’]+2]+4*(3−1)
=G[3][0+2]+8=11
となる。
また、f’(10,‘i’)を求めるには、g(3,‘i’,x)(0<x≦3)の中から10以下の値を取る最大のxを求めれば良い。上記と同様にg(3,‘r’,1)、g(3,‘r’,3)を求めると、
g(3,‘r’,1)=10
g(3,‘r’,3)=12
であるから、f’(10,‘i’)=x=1が得られる。
さらに、f(10,‘i’)の値は、
f(10,‘i’)=F[2][‘i’]+f’(10,‘i’)=1+1=2
と求まる。
【0046】
次に、上記のデータ構造を用いて、
P[1・・・3]=“ssi”
の検索を行う。
図3のフローチャートに示したアルゴリズムにおいて、まず、startに
C[P[3]−1]+1=C[i−1]+1=0+1=1
が代入され、endに
C[P[3]]=C[i]=4
が代入される(ステップ301参照)。これは、検索のための中間パターンであるP[3]=“i”が、テキストTに対する接尾辞配列SAのどの範囲に位置しているかを示す。すなわち、SA[1・・・4]={8 5 2 11}に対応するテキストTの要素(テキストTの8番目と5番目と2番目と11番目の要素)が中間パターン“i”と一致する。
【0047】
次に、i=2(=3−1)>0であるので(ステップ301参照)、cにP[i]が代入される(ステップ302、303参照)。そして、start及びendに代入される値を計算する。すなわち、
ここで、f(1,‘s’)は、k*i=1なのでテーブルFから直接は求められず、
C[‘p’]+f(1,‘s’)=7+F[1−1][‘s’]+f’(1,‘s’)
ここで、F[0][c]=0であり、f’(1,‘s’)は、g(1,‘s’,x)でx=1の時に
となるので、f’(1,‘s’)=1である。したがって、
C[‘p’]+f(1,‘s’)=7+0+1=8
となり、startには8が代入される。また、
ここで、f(4,‘s’)は、k*i=4*1なので、テーブルFから直接求められ、F[1][‘s’]=2であるから、
C[‘p’]+f(4,‘s’)=7+2=9
となり、endには9が代入される。これは、検索のための中間パターンであるP[2 3]=“si”が、テキストTに対する接尾辞配列SAのどの範囲に位置しているかを示す。すなわち、SA[8]={7}とSA[9]={4}とに対応するテキストTの要素(テキストTの7番目と4番目の要素)から始まる要素数2のパターンが中間パターン“si”と一致する。
【0048】
次に、end(=9)>start(=8)であるからステップ302に戻り(ステップ304参照)、i=1(=2−1)>0であるので再度ステップ303に進み、cにP[i]が代入される(ステップ302参照)。そして、start及びendに代入される値を計算する。すなわち、
ここで、f(8,‘s’)は、k*i=4*2なので、テーブルFから直接求められ、F[2][‘s’]=3であるから、
C[‘p’]+f(8,‘s’)=7+3=10
となり、startには10が代入される。また、
ここで、f(9,‘s’)は、k*i=11なのでテーブルFから直接は求められず、4*(i−1)<9<=4*iからi=3であるから、
C[‘p’]+f(9,‘s’)=7+F[3−1][‘s’]+f’(9,‘s’)
ここで、F[2][‘s’]はテーブルFから3、f’(9,‘s’)は、g(3,‘s’,x)でx=1の時に
で、解はこれだけなので、f’(9,‘s’)=x=1である。したがって、
C[‘p’]+f(9,‘s’)=7+3+1=11
となり、endには11が代入される。
【0049】
次に、end(=11)>start(=10)であるからステップ302に戻り(ステップ304参照)、i=0(=1−1)となったので(ステップ302参照)、start≦j≦endであるような全てのjに対して、SA[j]の位置から始まるテキストTの接尾辞を求める(ステップ306参照)。ここでは、start=10、end=11であるから、SA[10]=6、SA[11]=3であり、T[3・・・5]=T[6・・・8]=“ssi”となっており、パターンPと一致している。
【0050】
上記の動作例では、k=4である場合について説明したが、kの値は、検索対象であるテキストTの文字数(n)、検索パターンPの文字数(m)、テキストTを構成するアルファベットにおける文字の種類の数(s)などに応じて適宜に設定することができる。この場合、kの値に応じて、上述した前処理及び検索処理に必要なメインメモリ103の記憶容量とこれらの処理に要する時間とが変化する。大まかにはk=O(s)、すなわちsの定数倍とすると、メインメモリ103に必要な記憶容量はO(n log n)ビット、検索時間はO(m log s)となり、従来の接尾辞木を用いる検索方法における理論値と同じである。例えばk=sのとき、3n log s+2n log nビットが必要となる。ただし、この場合が最小であるわけではない。
実際には、メインメモリ103の記憶容量は、8ビット、16ビット、32ビットの倍数(場合によっては約数)であることがほとんどなので、このことを考慮してkを設定することが好ましい。
【0051】
次に、具体的なテキストTに対して本実施の形態を適用した場合におけるメインメモリ103に必要な記憶容量(データサイズ)と検索時間とを例示する。
〔適用例1〕
文字が1バイトで表され、256種類である場合(終了判定文字$も同時に表したい場合は255種類)。通常の英文テキストなどがこれに該当する。
この場合、テキストTの文字数をnとすれば、テキストTのサイズはnバイト、接尾辞配列SAのサイズは4nバイトである。
例えば、k=65536(=216)とすると、k以下の数字は2バイトで表すことができる。これにより、上述したテーブルF、L、G、Cの合計サイズは、2nバイト強となる。したがって、テキストT及び接尾辞配列SA、テキストTを含んだデータサイズでも7nバイト強である。これは当該テキストTに対する接尾辞木のサイズ(20n〜40nバイト程度)の3分の1程度である。
一方、検索速度は、log kに比例するので、kを小さくすると速度を上げることが可能である。
例えば、k=256(=28)とすると、k=65536の場合に対して2倍の検索速度を見込める。この場合、テーブルF、L、G、Cを持つために必要なメインメモリ103の記憶容量は6nバイトである。すなわち、テキストT及び接尾辞配列SAを加えた総量でも11nバイトのデータサイズとなり、やはり接尾辞木よりも小さい。
【0052】
〔適用例2〕
文字が2バイトで表され、65536(=216)種類ある場合。日本語のテキストなどがこれに該当する。
この場合、k=65536とすると、テーブルF、L、G、Cの合計サイズは、8nバイトであり、テキストT及び接尾辞配列SAを加えた総量でも14nバイトである。
なお、この例の場合、k=256などの小さい値とするのは、データサイズが大きくなってしまうので現実的ではない。
【0053】
〔適用例3〕
DNAの配列(文字の種類数は4)の場合。
2bitの文字、4bitの文字を扱うことを許すならば、k=4の場合、テーブルF、L、G、CとテキストT及び接尾辞配列SAとを加えた総データサイズは8.75nバイト程度となる。また、k=16の場合、総データサイズは5.375nバイト程度となる。特に後者の場合、接尾辞配列SAそのものとほとんど変わらないデータサイズとなっている。
【0054】
次に、実際のDNA配列に対する検索速度の測定例を示す。
この測定例では、本実施の形態による検索方法と、接尾辞配列SAを2分探索する従来の検索方法とを用いて、大腸菌の全配列に対し、同じクエリーを10000000回繰り返した場合の計算時間を比較している。なお、計算機は、CPUが333MHzPower PCのRS6000(米国IBM社のワークステーション)である。
検索パターンP=“CACATAA”
本実施の形態による検索時間 :0.38秒
従来の2分探索による検索時間:4.30秒
検索パターンP=“AGAGCGGC”
本実施の形態による検索時間 :0.47秒
従来の2分探索による検索時間:4.02秒
検索パターンP=“CCCGCTTCGGC”
本実施の形態による検索時間 :0.76秒
従来の2分探索による検索時間:3.35秒
検索パターンP=“ACCGCGAAATACCGGCGCGGAAATCATCGACTTACGCATAGGCGC”
本実施の形態による検索時間 :3.13秒
従来の2分探索による検索時間:3.88秒
検索パターンP=“CGGCGTCAGGTACTGACCGCGACCAATGCGA”
本実施の形態による検索時間 :0.84秒
従来の2分探索による検索時間:3.41秒
以上のように、全ての例において、本実施の形態の方が2分探索よりも計算時間が短縮(高速化)されている。最も高速化されている例(検索パターンP=“AGAGCGGC”)では10倍以上高速になっている。また、短い配列のクエリーほど高速化の効果があることがわかる。
【0055】
なお、本実施の形態では、テキストTの接尾辞配列SAを探索して所望のパターンPを検索する場合について説明したが、テキストTの接頭辞配列を探索してパターンPを検索することも可能である。
ここで、接頭辞とは、所定の文字列において、所定の文字を特定した場合の当該文字以前の文字列である。この接頭辞に対して、接尾辞に対する接尾辞木と同様の接頭辞木を生成することができる。また、接頭辞配列とは、テキストTにおける全ての接頭辞を後から順に並べた文字列を、辞書的順序で並べ替えた場合のインデックスの配列である。すなわち、文字列の先頭方向と末尾方向(左右)を逆にしたテキストTに対する接尾辞配列と本質的に同じである。したがって、方向を考慮することにより、上述した手法をそのまま接頭辞配列に対しても用いることができる。
【0056】
【発明の効果】
以上説明したように、本発明によれば、大規模テキストデータベースの検索において、処理を行うためのデータ構造におけるデータサイズの増大を抑えながら、高速な検索を実現することができる。
【図面の簡単な説明】
【図1】 本実施の形態を実現するのに好適なコンピュータ装置のハードウェア構成の例を模式的に示した図である。
【図2】 本実施の形態におけるデータ構造の構築及び検索を行うための機能ブロックを示す図である。
【図3】 本実施の形態におけるパターンの検索アルゴリズムを説明するフローチャートである。
【図4】 本実施の形態において用いられるテーブルFの構成例を示す図である。
【図5】 本実施の形態において用いられるテーブルLの構成例を示す図である。
【図6】 接尾辞木の例を示す図である。
【符号の説明】
10…接尾辞配列生成部、20…前処理部、30…検索部、101…CPU(中央処理装置)、102…M/B(マザーボード)チップセット、103…メインメモリ、104…ビデオカード、105…ハードディスク、106…ネットワークインタフェース、107…フロッピーディスクドライブ、108…キーボード、109…シリアルI/Oポート、110…ブリッジ回路
Claims (13)
- コンピュータにより、検索対象である文字列中から所望のパターンを検索するパターン検索方法において、
前記コンピュータの検索手段が、前記パターンの最後の文字から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の文字を対象文字として下記の第1乃至第3のステップを行うことにより、当該中間パターンの先頭の文字が前記文字列に対する接尾辞配列のどの範囲に存在するかを順次検索する範囲検索ステップと、
前記コンピュータの検索手段が、前記範囲検索ステップの検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記文字列の要素を特定し、当該文字列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分文字列を抽出する文字列抽出ステップとを含み、
前記範囲検索ステップは、
検索対象である前記文字列に対する接尾辞配列の各要素に関して、当該各要素に対応する前記文字列中の各文字の一つ前に位置する前置文字を特定する第1のステップと、
前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の中に含まれる、前記パターン中の前記対象文字の個数を求める第2のステップと、
検索対象である前記文字列に含まれる前記パターン中の前記対象文字よりも辞書的順序で早い文字の総数と前記第2のステップで求まった前記所定の要素に対する前記対象文字の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象文字の位置を検出する第3のステップとを含むことを特徴とするパターン検索方法。 - 前記コンピュータの前処理手段が、検索対象である前記文字列に対して、前記前置文字の個数を、前記接尾辞配列における要素の位置と前記文字列を構成する文字の種類とに対応付けて格納したテーブルを作成し、記憶装置に格納するテーブル作成ステップをさらに有し、
前記範囲検索ステップでは、前記テーブル作成ステップにより作成された前記テーブルが参照されて前記第2のステップが実行されることを特徴とする請求項1に記載のパターン検索方法。 - 前記コンピュータの前処理手段が、検索対象である前記文字列に対し、前記接尾辞配列の所定数個おきの要素の位置に関して、前記前置文字の個数を、前記接尾辞配列における要素の位置と前記文字列を構成する文字の種類とに対応付けて格納した第1のテーブルを作成して記憶装置に格納し、かつ当該第1のテーブルにおいて情報が管理される接尾辞配列の所定の位置に基づいて、当該位置の間における接尾辞配列の要素に対する前置文字に関する情報を格納した第2のテーブルを作成して記憶装置に格納するテーブル作成ステップをさらに有し、
前記範囲検索ステップでは、前記テーブル作成ステップにより作成された前記第1、第2のテーブルが参照されて前記第2のステップが実行されることを特徴とする請求項1に記載のパターン検索方法。 - コンピュータにより、検索対象である遺伝子配列中から所望のパターンを検索するパターン検索方法において、
前記コンピュータの検索手段が、前記パターンの最後の要素から前方へ一つずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の要素を対象要素として下記の第1乃至第3のステップを行うことにより、当該中間パターンの先頭の要素が前記遺伝子配列に対する接尾辞配列のどの範囲に存在するかを順次検索する範囲検索ステップと、
前記コンピュータの検索手段が、前記範囲検索ステップの検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記遺伝子配列の要素を特定し、当該遺伝子配列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分配列を抽出する配列抽出ステップとを含み、
前記範囲検索ステップは、
検索対象である前記遺伝子配列に対する接尾辞配列の各要素に関して、当該各要素に対応する前記遺伝子配列中の各要素の一つ前に位置する前置要素を特定する第1のステップと、
前記接尾辞配列中の所定の要素以前の各要素における前記前置要素の中に含まれる、前記パターン中の前記対象要素の個数を求める第2のステップと、
検索対象である前記遺伝子配列に含まれる、前記パターン中の前記対象要素よりも辞書的順序で早い要素の総数と前記第2のステップで求まった前記所定の要素に対する前記対象要素の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象要素の位置を検出する第3のステップとを含むことを特徴とするパターン検索方法。 - 検索対象である文字列中から所望のパターンを検索するパターン検索装置において、
前記文字列の接尾辞配列に基づいて前記パターンを検索するためのデータ構造を構築する前処理部と、
前記前処理部により構築されたデータ構造を用いて所望の前記パターンを検索する検索部とを備え、
前記前処理部は、
前記接尾辞配列の各要素に関して、当該各要素に対応する前記文字列中の各文字の一つ前に位置する前置文字を特定し、
前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の、前記文字列を構成する文字の種類ごとの個数を求めることにより前記データ構造を構築し、
前記検索部は、
前記パターンの最後の文字から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の文字を対象文字とし、検索対象である前記文字列に含まれる当該対象文字よりも辞書的順序で早い文字の総数と前記データ構造から求まる前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の中に含まれる当該対象文字の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象文字の位置を検出し、この検出結果に基づき当該中間パターンの先頭の文字が前記接尾辞配列のどの範囲に存在するかを順次検索し、
前記検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記文字列の要素を特定し、当該文字列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分文字列を抽出することを特徴とするパターン検索装置。 - 前記前処理部は、前記前置文字の個数を、前記接尾辞配列における要素の位置と、前記文字列を構成する文字の種類とに対応付けて格納したテーブルを持つことを特徴とする請求項5に記載のパターン検索装置。
- 前記前処理部は、前記接尾辞配列の所定数個おきの要素の位置に関して生成された前記テーブルを持つことを特徴とする請求項6に記載のパターン検索装置。
- 前記前処理部は、前記テーブルにおいて情報が管理される前記接尾辞配列の所定の位置に基づいて、当該位置の間における前記接尾辞配列の要素に対する前記前置文字に関する情報を格納した他のテーブルをさらに持つことを特徴とする請求項7に記載のパターン検索装置。
- コンピュータに、検索対象である文字列中から所望のパターンを検索する処理を実行させるコンピュータプログラムにおいて、
検索対象である前記文字列の接尾辞配列に基づいて前記パターンを検索するためのデータ構造を構築し記憶装置に格納する前処理手段と、
前記前処理手段により構築され記憶装置に格納されたデータ構造を用いて所望の前記パターンを検索する検索手段として、前記コンピュータを機能させ、
前記前処理手段の機能として、前記コンピュータに、
前記接尾辞配列の各要素に関して、当該各要素に対応する前記文字列中の各文字の一つ前に位置する前置文字を特定する処理と、
前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の、前記文字列を構成する文字の種類ごとの個数を求めることにより前記データ構造を構築する処理とを実行させ、
前記検索手段の機能として、前記コンピュータに、
前記パターンの最後の文字から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の文字を対象文字とし、検索対象である前記文字列に含まれる当該対象文字よりも辞書的順序で早い文字の総数と前記データ構造から求まる前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の中に含まれる当該対象文字の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象文字の位置を検出し、この検出結果に基づき当該中間パターンの先頭の文字が前記接尾辞配列のどの範囲に存在するかを順次検索する第1の処理と、
前記検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記文字列の要素を特定し、当該文字列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分文字列を抽出する第2の処理と
を実行させることを特徴とするコンピュータプログラム。 - 検索対象である前記文字列に対して、前記前置文字の個数を、前記接尾辞配列における要素の位置と前記文字列を構成する文字の種類とに対応付けて格納したテーブルを作成し、記憶装置に格納するテーブル作成手段として、前記コンピュータをさらに機能させ、
前記前処理手段は、前記テーブル作成手段により作成され記憶装置に格納された前記テーブルを参照して前記第1の処理を実行することを特徴とする請求項9に記載のコンピュータプログラム。 - コンピュータに、検索対象である配列中から所望のパターンを検索する処理を実行させるコンピュータプログラムにおいて、
検索対象である前記配列に対する接尾辞配列の各要素に関して、当該各要素に対応する前記配列中の各要素の一つ前に位置する前置要素を特定する処理と、
前記前置要素の個数を、前記接尾辞配列における要素の位置と前記配列を構成する要素の種類とに対応付けて格納したテーブルを生成し記憶装置に保持する処理と、
前記記憶装置に保持された前記テーブルを参照し、前記接尾辞配列中の所定の要素以前の各要素における前記前置要素の、前記配列を構成する要素の種類ごとの個数を求める処理と、
前記パターンの最後の要素から前方へ一つずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の文字を対象文字とし、検索対象である前記文字列に含まれる当該対象文字よりも辞書的順序で早い文字の総数と前記テーブルを参照して得られる前記接尾辞配列中の所定の要素以前の各要素における前記前置要素の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象文字の位置を検出し、この検出結果に基づき当該中間パターンの先頭の文字が前記配列に対する接尾辞配列のどの範囲に存在するかを順次検索する処理と、
前記検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記配列の要素を特定し、当該配列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分配列を抽出する処理と
を前記コンピュータに実行させることを特徴とするコンピュータプログラム。 - コンピュータに検索対象である文字列中から所望のパターンを検索する処理を実行させるプログラムを当該コンピュータの入力手段が読取可能に記憶した記憶媒体において、
前記プログラムは、
検索対象である前記文字列の接尾辞配列に基づいて前記パターンを検索するためのデータ構造を構築し記憶装置に格納する前処理手段と、
前記前処理手段により構築され記憶装置に格納されたデータ構造を用いて所望の前記パターンを検索する検索手段として、前記コンピュータを機能させ、
前記前処理手段の機能として、前記コンピュータに、
前記接尾辞配列の各要素に関して、当該各要素に対応する前記文字列中の各文字の一つ前に位置する前置文字を特定する処理と、
前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の、前記文字列を構成する文字の種類ごとの個数を求めることにより前記データ構造を構築する処理とを実行させ、
前記検索手段の機能として、前記コンピュータに、
前記パターンの最後の文字から前方へ1文字ずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の文字を対象文字とし、検索対象である前記文字列に含まれる当該対象文字よりも辞書的順序で早い文字の総数と前記データ構造から求まる前記接尾辞配列中の所定の要素以前の各要素における前記前置文字の中に含まれる当該対象文字の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象文字の位置を検出し、この検出結果に基づき当該中間パターンの先頭の文字が前記接尾辞配列のどの範囲に存在するかを順次検索する第1の処理と、
前記検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記文字列の要素を特定し、当該文字列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分文字列を抽出する第2の処理と
を実行させることを特徴とする記憶媒体。 - コンピュータに検索対象である配列中から所望のパターンを検索する処理を実行させるプログラムを当該コンピュータの入力手段が読取可能に記憶した記憶媒体において、
検索対象である前記配列に対する接尾辞配列の各要素に関して、当該各要素に対応する前記配列中の各要素の一つ前に位置する前置要素を特定する処理と、
前記前置要素の個数を、前記接尾辞配列における要素の位置と前記配列を構成する要素の種類とに対応付けて格納したテーブルを生成し記憶装置に保持する処理と、
前記記憶装置に保持された前記テーブルを参照し、前記接尾辞配列中の所定の要素以前の各要素における前記前置要素の、前記配列を構成する要素の種類ごとの個数を求める処理と、
前記パターンの最後の要素から前方へ一つずつ順に加えて得られる各中間パターンに関して、当該中間パターンの先頭の文字を対象文字とし、検索対象である前記配列に含まれる当該対象文字よりも辞書的順序で早い文字の総数と前記テーブルを参照して得られる前記接尾辞配列中の所定の要素以前の各要素における前記前置要素の個数とを加算し、得られた値を当該接尾辞配列の要素の順番に対応付けることにより、当該接尾辞配列における当該対象文字の位置を検出し、この検出結果に基づき当該中間パターンの先頭の文字が前記配列に対する接尾辞配列のどの範囲に存在するかを順次検索する処理と、
前記検索により前記パターン自体に関して得られた前記接尾辞配列の前記範囲に含まれる各要素に対応する前記配列の要素を特定し、当該配列の各要素を先頭として前記パターンの要素数と同じ数の要素からなる部分配列を抽出する処理と
を前記コンピュータに実行させる前記プログラムを記憶したことを特徴とする記憶媒体。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2001004189A JP3672242B2 (ja) | 2001-01-11 | 2001-01-11 | パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 |
US10/043,564 US7016896B2 (en) | 2001-01-11 | 2002-01-11 | Pattern search method, pattern search apparatus and computer program therefor, and storage medium thereof |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2001004189A JP3672242B2 (ja) | 2001-01-11 | 2001-01-11 | パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2002229987A JP2002229987A (ja) | 2002-08-16 |
JP3672242B2 true JP3672242B2 (ja) | 2005-07-20 |
Family
ID=18872411
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2001004189A Expired - Fee Related JP3672242B2 (ja) | 2001-01-11 | 2001-01-11 | パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 |
Country Status (2)
Country | Link |
---|---|
US (1) | US7016896B2 (ja) |
JP (1) | JP3672242B2 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010116435A1 (ja) | 2009-03-29 | 2010-10-14 | 株式会社エスグランツ | コード列検索装置、検索方法及びプログラム |
Families Citing this family (46)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7949732B1 (en) | 2003-05-12 | 2011-05-24 | Sourcefire, Inc. | Systems and methods for determining characteristics of a network and enforcing policy |
JP4114600B2 (ja) * | 2003-12-02 | 2008-07-09 | 日本電気株式会社 | 可変長文字列検索装置及び可変長文字列検索方法並びにプログラム |
US7539681B2 (en) * | 2004-07-26 | 2009-05-26 | Sourcefire, Inc. | Methods and systems for multi-pattern searching |
EP1635273A1 (fr) * | 2004-09-10 | 2006-03-15 | France Telecom | Construction informatique d'un arbre lexical |
US8046833B2 (en) * | 2005-11-14 | 2011-10-25 | Sourcefire, Inc. | Intrusion event correlation with network discovery information |
US7733803B2 (en) | 2005-11-14 | 2010-06-08 | Sourcefire, Inc. | Systems and methods for modifying network map attributes |
US7948988B2 (en) * | 2006-07-27 | 2011-05-24 | Sourcefire, Inc. | Device, system and method for analysis of fragments in a fragment train |
US9183297B1 (en) * | 2006-08-01 | 2015-11-10 | Google Inc. | Method and apparatus for generating lexical synonyms for query terms |
US7701945B2 (en) * | 2006-08-10 | 2010-04-20 | Sourcefire, Inc. | Device, system and method for analysis of segments in a transmission control protocol (TCP) session |
EP2076866A2 (en) * | 2006-10-06 | 2009-07-08 | Sourcefire, Inc. | Device, system and method for use of micro-policies in intrusion detection/prevention |
US7630982B2 (en) | 2007-02-24 | 2009-12-08 | Trend Micro Incorporated | Fast identification of complex strings in a data stream |
US8069352B2 (en) * | 2007-02-28 | 2011-11-29 | Sourcefire, Inc. | Device, system and method for timestamp analysis of segments in a transmission control protocol (TCP) session |
CA2685292C (en) * | 2007-04-30 | 2013-09-24 | Sourcefire, Inc. | Real-time user awareness for a computer network |
US7679504B2 (en) * | 2007-05-16 | 2010-03-16 | General Electric Company | System and method of discovering, detecting and classifying alarm patterns for electrophysiological monitoring systems |
US8954484B2 (en) | 2009-06-12 | 2015-02-10 | Cray Inc. | Inclusive or bit matrix to compare multiple corresponding subfields |
WO2009079875A1 (en) * | 2007-12-14 | 2009-07-02 | Shanghai Hewlett-Packard Co., Ltd | Systems and methods for extracting phrases from text |
US8474043B2 (en) | 2008-04-17 | 2013-06-25 | Sourcefire, Inc. | Speed and memory optimization of intrusion detection system (IDS) and intrusion prevention system (IPS) rule processing |
US8108353B2 (en) * | 2008-06-11 | 2012-01-31 | International Business Machines Corporation | Method and apparatus for block size optimization in de-duplication |
US9009655B2 (en) | 2008-09-28 | 2015-04-14 | KOUSOKUYA, Inc. | Code string search apparatus, search method, and program |
JP4429373B1 (ja) * | 2009-03-18 | 2010-03-10 | 株式会社エスグランツ | コード列検索装置、検索方法及びプログラム |
US8272055B2 (en) | 2008-10-08 | 2012-09-18 | Sourcefire, Inc. | Target-based SMB and DCE/RPC processing for an intrusion detection system or intrusion prevention system |
US8140491B2 (en) * | 2009-03-26 | 2012-03-20 | International Business Machines Corporation | Storage management through adaptive deduplication |
CN101853263B (zh) * | 2009-04-03 | 2012-09-19 | 鸿富锦精密工业(深圳)有限公司 | 资料结构化处理系统及方法 |
WO2011056086A2 (en) * | 2009-11-05 | 2011-05-12 | Google Inc. | Statistical stemming |
JP5190898B2 (ja) * | 2010-01-18 | 2013-04-24 | 株式会社高速屋 | コード列検索装置、検索方法及びプログラム |
US8407193B2 (en) * | 2010-01-27 | 2013-03-26 | International Business Machines Corporation | Data deduplication for streaming sequential data storage applications |
WO2011130510A1 (en) | 2010-04-16 | 2011-10-20 | Sourcefire, Inc. | System and method for near-real time network attack detection, and system and method for unified detection via detection routing |
US8433790B2 (en) | 2010-06-11 | 2013-04-30 | Sourcefire, Inc. | System and method for assigning network blocks to sensors |
US8671182B2 (en) | 2010-06-22 | 2014-03-11 | Sourcefire, Inc. | System and method for resolving operating system or service identity conflicts |
US8745061B2 (en) * | 2010-11-09 | 2014-06-03 | Tibco Software Inc. | Suffix array candidate selection and index data structure |
US8527483B2 (en) * | 2011-02-04 | 2013-09-03 | Mikko VÄÄNÄNEN | Method and means for browsing by walking |
JP5617674B2 (ja) * | 2011-02-14 | 2014-11-05 | 日本電気株式会社 | 文書間類似度算出装置、文書間類似度算出方法、及び、文書間類似度算出プログラム |
US8601034B2 (en) | 2011-03-11 | 2013-12-03 | Sourcefire, Inc. | System and method for real time data awareness |
JP5582358B2 (ja) * | 2011-03-23 | 2014-09-03 | 株式会社日立製作所 | 文書検索システム、文書検索方法、及びプログラム |
US9116947B2 (en) * | 2012-03-15 | 2015-08-25 | Hewlett-Packard Development Company, L.P. | Data-record pattern searching |
US20150161266A1 (en) * | 2012-06-28 | 2015-06-11 | Google Inc. | Systems and methods for more efficient source code searching |
CN104252469B (zh) | 2013-06-27 | 2017-10-20 | 国际商业机器公司 | 用于模式匹配的方法、设备和电路 |
WO2015025751A1 (ja) * | 2013-08-23 | 2015-02-26 | 日本電気株式会社 | 頻出系列の列挙装置、方法および記録媒体 |
KR102182672B1 (ko) * | 2014-01-11 | 2020-11-24 | (주)네온베리 | 다국어 통합 자음 패턴 검색 방법 및 그 장치 |
CN105608113B (zh) * | 2015-12-10 | 2018-09-11 | 北京奇虎科技有限公司 | 判断文本中poi数据的方法及装置 |
WO2018159361A1 (ja) * | 2017-03-03 | 2018-09-07 | 日本電信電話株式会社 | 攻撃パターン抽出装置、攻撃パターン抽出方法および攻撃パターン抽出プログラム |
CN108920483B (zh) * | 2018-04-28 | 2022-02-01 | 南京搜文信息技术有限公司 | 基于后缀数组的字符串快速匹配方法 |
US20210406701A1 (en) * | 2018-09-28 | 2021-12-30 | Dow Global Technologies Llc | Hybrid machine learning model for code classification |
CN110837584B (zh) * | 2019-10-18 | 2022-10-04 | 中山大学 | 一种分块并行构造后缀数组的方法及系统 |
CN112069366B (zh) * | 2020-08-28 | 2024-02-09 | 喜大(上海)网络科技有限公司 | 召回确定方法、装置、设备及存储介质 |
JP2024169825A (ja) * | 2023-05-26 | 2024-12-06 | 先端加速システムズ株式会社 | インデックス作成用コンピュータプログラム、マッピング用コンピュータプログラム、インデックス作成用コンピュータ装置、マッピング用コンピュータ装置、階層的インデックスのデータ構造。 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000259638A (ja) * | 1999-03-12 | 2000-09-22 | Ricoh Co Ltd | 記号列処理装置 |
JP3344394B2 (ja) * | 1999-12-24 | 2002-11-11 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 配列の変換方法、構造解析方法、装置及び記録媒体 |
US6633817B1 (en) * | 1999-12-29 | 2003-10-14 | Incyte Genomics, Inc. | Sequence database search with sequence search trees |
US6751624B2 (en) * | 2000-04-04 | 2004-06-15 | Globalscape, Inc. | Method and system for conducting a full text search on a client system by a server system |
-
2001
- 2001-01-11 JP JP2001004189A patent/JP3672242B2/ja not_active Expired - Fee Related
-
2002
- 2002-01-11 US US10/043,564 patent/US7016896B2/en not_active Expired - Fee Related
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010116435A1 (ja) | 2009-03-29 | 2010-10-14 | 株式会社エスグランツ | コード列検索装置、検索方法及びプログラム |
Also Published As
Publication number | Publication date |
---|---|
JP2002229987A (ja) | 2002-08-16 |
US7016896B2 (en) | 2006-03-21 |
US20020123995A1 (en) | 2002-09-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3672242B2 (ja) | パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 | |
US9195738B2 (en) | Tokenization platform | |
JP3566111B2 (ja) | 記号辞書作成方法及び記号辞書検索方法 | |
US9529891B2 (en) | Method and system for rapid searching of genomic data and uses thereof | |
US20070174261A1 (en) | Database retrieval apparatus, retrieval method, storage medium, and progam | |
JP4114600B2 (ja) | 可変長文字列検索装置及び可変長文字列検索方法並びにプログラム | |
CN102867049A (zh) | 一种基于单词查找树实现的汉语拼音快速分词方法 | |
TW201931181A (zh) | 用於基因定序資料的資料處理方法及系統 | |
CN114036371A (zh) | 搜索词推荐方法、装置、设备和计算机可读存储介质 | |
JPH09245043A (ja) | 情報検索装置 | |
KR102594625B1 (ko) | K-부정합 검색을 위한 필터를 생성하는 시스템 및 방법 | |
US10867134B2 (en) | Method for generating text string dictionary, method for searching text string dictionary, and system for processing text string dictionary | |
US20100070511A1 (en) | Reducing use of randomness in consistent uniform hashing | |
CN109740249B (zh) | 一种mux树逻辑结构优化方法、模块及存储介质 | |
CN110543622A (zh) | 文本相似度检测方法、装置、电子设备及可读存储介质 | |
JP7422367B2 (ja) | 近似文字列照合方法及び該方法を実現するためのコンピュータプログラム | |
WO2024185097A1 (ja) | 近似文字列照合方法及び該方法を実現するためのコンピュータプログラム | |
JP4319827B2 (ja) | 文書検索プログラム | |
JPH09212523A (ja) | 全文検索方法 | |
JP2001117929A (ja) | データ検索方法、データ整列方法およびデータ検索装置 | |
JP2024169825A (ja) | インデックス作成用コンピュータプログラム、マッピング用コンピュータプログラム、インデックス作成用コンピュータ装置、マッピング用コンピュータ装置、階層的インデックスのデータ構造。 | |
WO2014207416A1 (en) | Method and system for searching and storing data | |
Kaniwa et al. | Repeat finding techniques, data structures and algorithms in DNA sequences: a survey | |
JP2003296368A (ja) | データベース探索装置および探索方法ならびに記憶媒体、プログラム | |
JPH03108063A (ja) | 後方一致検索方法および装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040817 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20041110 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20041214 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050309 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20050329 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20050330 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050415 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080428 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090428 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090428 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100428 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |