JP2004152023A - 文字列解析方法 - Google Patents
文字列解析方法 Download PDFInfo
- Publication number
- JP2004152023A JP2004152023A JP2002316654A JP2002316654A JP2004152023A JP 2004152023 A JP2004152023 A JP 2004152023A JP 2002316654 A JP2002316654 A JP 2002316654A JP 2002316654 A JP2002316654 A JP 2002316654A JP 2004152023 A JP2004152023 A JP 2004152023A
- Authority
- JP
- Japan
- Prior art keywords
- character string
- mum
- given
- strings
- substring
- 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.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
【課題】互いにスプライシングバリアントの関係にある配列を含む多数の生体高分子配列データから,個々のエクソンに相当する部分配列を,効率よく抽出する。
【解決手段】エクソン配列が満たすべき条件を用いて,エクソン配列のモデルを構築し,そのモデルに沿ってエクソン配列を定義する。そして,モデルで定義されたエクソン配列を,入力として与えられた生体高分子配列から抽出する。本発明の方法は,与えられた生体高分子配列に基づきsuffix treeを構築し,配列中の文字数や配列数に依存しない回数の,suffix tree上の深さ優先探査および配列中の各文字の位置に関する処理によって,入力として与えられた生体高分子配列の長さの総和に対し,線形時間で抽出処理を完了できる。
【選択図】 図1
【解決手段】エクソン配列が満たすべき条件を用いて,エクソン配列のモデルを構築し,そのモデルに沿ってエクソン配列を定義する。そして,モデルで定義されたエクソン配列を,入力として与えられた生体高分子配列から抽出する。本発明の方法は,与えられた生体高分子配列に基づきsuffix treeを構築し,配列中の文字数や配列数に依存しない回数の,suffix tree上の深さ優先探査および配列中の各文字の位置に関する処理によって,入力として与えられた生体高分子配列の長さの総和に対し,線形時間で抽出処理を完了できる。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
本発明は,複数の文字列,特に生体高分子配列に共通に存在する部分文字列を抽出するための文字列解析方法に関し,生体高分子配列のスプライシングパターン解析方法に適用して好適な方法に関する。
【0002】
【従来の技術】
国際共同プロジェクト及び米国ベンチャー企業により,2000年6月にヒトゲノムの文字配列決定の完了が宣言された。ゲノム配列の解析が進む一方で,発現している遺伝子について調べるために,mRNAの解析が行なわれている。mRNAは,遺伝子が発現する際,ゲノムDNAから生成されるRNA分子で,遺伝子の機能発現の過程で不可欠な物質である。mRNA分子は分解しやすいため,逆転写によりmRNAよりも安定な物質であるcDNAに転換し解析されることが多い。cDNAのシングルパス配列決定で得られた配列は,ESTと呼ばれる。ESTには様々な利用価値があるが,そのひとつが,遺伝子がどのようなエクソンにより構成されているかを明らかにすることである。
【0003】
図2は,ゲノム配列201上の遺伝子202と,mRNA 207との関係を説明する図である。遺伝子が発現する際,ゲノム配列上の該遺伝子202が転写されmRNA前駆体203が作られる。矢印204で象徴的に示すスプライシングと呼ばれる過程を経てmRNA前駆体203のイントロン205が除去されてエクソン206のみから成るmRNA 207が構成される。生体内では,このmRNA 207に基づき,タンパク質が合成される。
【0004】
スプライシングの過程で,同一エクソンが常に同じように残されるとは限らない。図2に示したように,同一遺伝子由来のmRNAであっても,あるmRNA207で残されたエクソン208が,別のmRNA 209では除去されることがあり,逆に,あるmRNA 207で除去されたエクソン210が別のmRNA209では残される場合もある。mRNA 207とmRNA 209のように,同一遺伝子由来のmRNAで,スプライシングを受ける領域が異なるものを,互いにスプライシングバリアントであると言う。ヒトの場合,生体内のタンパク質は10万種類以上存在するといわれる一方,遺伝子数は3万〜4万のみといわれており,スプライシングバリアントがこの差を埋めていると考えられている。こうしたスプライシングバリアントの解析は,遺伝子の機能発現を解析するにあたり不可避であり,生命現象の解明や,ゲノム創薬のために不可欠である。
【0005】
同一遺伝子に由来するあらゆるスプライシングバリアントの配列を網羅する十分な量のESTを収集し解析することは,mRNAのエクソン構造を明らかにする有力な手段となる。ESTなど転写産物由来の配列のみに基づきスプライシングバリアントの解析を行なうためには,複数の配列から個々のエクソンに相当する部分配列をいかにして抽出するかが課題となる。ところが,与えられた配列データのあらゆる部分配列を網羅的に列挙し,エクソン配列か否かを調べるアプローチは,各入力配列に対してその配列長の2乗のオーダーの部分配列が存在し,複数の入力配列間でそれらの比較を行なうと,与えられた配列の文字の総数をさらに乗じたオーダーの計算時間が必要となる。従って,処理すべきデータ量が増加すると,処理に必要な時間が急激に増加し,実用的なシステムを作ることは困難である。その一方で,米国公共機関のデータベースに蓄積されているESTのデータ量は,配列決定技術の進歩に伴い急速に増大しつつあり,ヒトだけで450万配列を超えている。こうした膨大な配列データを解析するために,高速な計算方法が必要である。
【0006】
Altschul, S.F. et al., Nucleic Acid Research, 25:3389−3402, 1997のホモロジー検索の方法はESTの解析にも使われている。もし,EST以外にゲノム配列も利用可能ならば,ゲノム配列の部分文字列で, ESTにも存在する部分文字列がエクソンであると,高い精度で予想することができる。ただし,対応するゲノム配列が無いESTを解析する場合に,ホモロジー検索の方法を使って転写産物由来配列間の相互の関係を調べようとすれば,最悪の場合配列数の2乗のオーダーの計算が必要となり,配列数が増加するとエクソン構造を予想することは容易ではない。しかも,Altschulらの方法ではショートエクソンを捕らえられない場合がある。
【0007】
複数の配列に共通する部分配列の抽出を効率よく行なう手法として,Delcher et al., Nucleic Acids Research, 1999, 27(11):2369−2376の方法が知られている。Delcherらの手法は,主に2つの近縁種のゲノムを比較することを目的としている。この手法では,まず次の(D1)−(D4)の条件を満足するMUM(Maximal Unique Match)と呼ばれる部分配列を探索する。
(D1) MUMは,長さがユーザに指定されたパラメータ以上の配列長をもつ部分配列である。
(D2) MUMは,2つの配列の,共通の部分配列である。
(D3) MUMは,2つのそれぞれの配列内に,1つしか含まれない。
(D4) MUMは,別のMUMの部分配列にならない。すなわち,前記(D1)−(D3)を満足する配列を,可能な限り延長して得られた配列のみがMUMである。
【0008】
Delcherらの方法をESTに適用し,MUMとしてアラインされる部分や大きな挿入や欠失が入る位置を同定すれば,MUMはエクソン配列に対応し,大きな挿入や欠失は,選択的なエクソンに対応すると考えることができ,エクソン構造を同定するためのツールとして使うことができる。しかし,Delcherらの方法は2配列のみを対象としており,配列数が3つ以上になったときには適用することができない。
【0009】
3つ以上の文字列から共通する部分配列を抽出する方法としては,文字列処理に広く応用されているデータ構造であるsuffix treeを活用したGusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York のchapter 9に記載の,longest common substring problemに対する線形時間解法が知られている。この方法を用いると,任意の数の文字列について,指定された数以上の文字列に共通の部分文字列の中でもっとも長い部分文字列を,文字総数の線形時間で抽出することができる。ただし,複数のエクソンを連結した文字列や,互いに重なっている文字列を抽出してしまう場合があり,この方法で抽出した配列がそのままエクソンに相当する配列と考えることはできない。
【0010】
【発明が解決しようとする課題】
本発明は,転写産物由来の複数の配列に基づき,これらの配列に含まれるエクソン配列を抽出することを目的としている。
【0011】
転写産物由来の配列だけに基づき,個々のエクソンの配列を完全に同定できれば理想だが,現実にはそれが常に可能なわけではない。ある遺伝子が4つのエクソンA,B,C,Dを持ち,それらのエクソンはこの順序でゲノム上に並んでいるとする。仮に,BとCがスプライシングの過程を経て常に同時にmRNAに現れるならば,ESTだけを見ている限り,B,Cという2つの別のエクソンがあることや,EST上のどこにB,Cの境界があるかを知ることは不可能である。そこで本発明では,ゲノム上の隣り合うエクソンで常に共存するものは,同一のエクソンとみなす。このほか,エクソンBが直後にCかDを必ず伴うとし,CとDには必ずBが先行する場合を考える。CとDの先頭の配列が一致するならば,B,C,Dというエクソンの存在を知ることができても,どこがB,C,Dの境界なのかを知ることはできない。そこで本発明では,確実に同一のエクソンに由来すると考えられる,エクソンの部分配列を抽出する。また,本発明では,1つの遺伝子には同一配列のエクソンは存在しないと仮定し,1配列に高々1回しか現れない部分配列のみを処理対象とする。さらに,例えば数文字程度の,長さが極端に短い部分配列は入力配列上のいたるところに現れるが,それらはエクソン配列と見なすべきでなく,エクソンはある程度以上長い部分配列であるべきである。本発明では,エクソン配列に関する上記の性質を踏まえ,エクソン配列のモデルであるUEB(Unique Exon Block)(図3の文字列305参照)を定義し,UEBを抽出することを目指す。
【0012】
ところで,次の条件を満たす文字列mは,複数のエクソン配列を連結した文字列になっている可能性がある。
(M1) 1つ以上の文字列の部分文字列である。
(M2) 長さu以上。ただし,uとは最も短いエクソンの長さで,パラメータとして与えられる整数である。
(M3) 各入力文字列に,高々1回しか出現しない。
(M4) ある文字列sが出現する入力文字列の集合をP(s)とする。このとき,任意の文字aに対してP(m)≠P(ma)である。ここに,maは文字列mの末尾に文字aを付加した文字列である。
(M5) 任意の文字aに対してP(m)≠P(am)である。ここに,amは文字列mの先頭に文字aを付加した文字列である。
【0013】
なお,(M1)−(M5)を満たす文字列は,Delcherらの方法におけるMUMの概念を,2配列以外の場合でも適用可能なように拡張したものである。本明細書ではこれ以降,(M1)−(M5)を満たす文字列をMUM(図3の文字列303参照)と呼ぶ。
【0014】
UEB 305は,MUM 303を部分文字列として完全に含んでいたり,重なっていたりしない文字列であるべきである。UEB 305を正確に定義するために,「文字列が重なる」とはどういうことか,正確に定義する必要がある。本明細書では,図15に示したように,次の4つの条件を満足する文字列t,t’,t’’が存在するときに,かつそのときに限り,「文字列s,s’が重なる」という。
(1) t,t’,t’’は,長さが1以上の文字列である。
(2) s=tt’,すなわち,sはtとt’を連結した文字列である。
(3) s’=t’t’’,すなわち,s’はt’とt’’を連結した文字列である。
(4) ある入力文字列が,tt’t’’を部分文字列として含む。
【0015】
なお,(1)−(4)が満足されるとき,「sはs’と右で重なる」,「s’はsと左で重なる」という。これらの概念を用いて,UEBを次の条件を満たす文字列と定義する。
(A1) 少なくとも1つの入力文字列の部分文字列。
(A2) 長さu以上。
(A3) 各入力文字列に,高々1回しか出現しない。
(A4) MUMと重ならない。
(A5) MUMを真の部分文字列としない。なお,ある文字列の真の部分文字列とは,その文字列自身を除く部分文字列のことである。
(A6) (A1)−(A5)を満たす文字列の,真の部分文字列にならない。
巨大なデータを効率よく処理するためには,処理時間を入力文字列の文字数の総数に関し線形時間に抑えることが望ましい。
【0016】
以上を踏まえ,本発明の課題は,複数の生体高分子配列に相当する文字列が与えられたときに,(A1)−(A6)を満足する文字列すなわちUEBを,与えられた入力文字列の総文字数の線形時間で抽出する方法を提供することである。
【0017】
【課題を解決するための手段】
本発明では,入力として複数の文字列301が与えられたとき,後述の右MUM 302,後述の左MUMまたはMUM 303,後述の右UEB−holder 304を順次抽出し,それらを利用してUEB 305を抽出する。
【0018】
なお,左MUMの抽出(ステップS503)と,MUMの抽出(ステップS504)は,どちらか片方だけを行なえばよい。ステップS503により左MUMを使う方法はわかりやすく実装の手間もそれほどではないが,計算機の主記憶を多く使用する問題がある。一方,ステップS504によりMUMを抽出する方法は,実装の手間が若干かかるものの,消費する計算機の主記憶が少なく,速度も速いと予想される。
以下,本発明の特徴を述べる。
【0019】
本発明の方法は,複数の入力文字列が与えられたときに,UEBを抽出する方法であって,入力文字列の文字数の総和に対し線形時間で処理を完了できる。
本発明の方法は,UEBを抽出するために,右MUMを抽出する工程と,MUMを抽出する工程または前述の左MUMを抽出する工程と,右UEB−holderを抽出する工程とを有し,それぞれの工程で,入力文字列を格納したsuffix treeを用いることを特徴とする。
【0020】
本発明の方法はまた,MUMを抽出する工程において,右MUMを抽出しその中からMUMの条件を満足する部分文字列を選択し,抽出することを特徴とする。
本発明の方法はまた,MUMを抽出する工程において,suffix tree内のノードについて,そのノードを参照するsuffix linkの数を数えることを特徴とする。
本発明の方法はまた,右UEB−holderを抽出する工程を有することを特徴とする。
【0021】
本発明の方法はまた,右UEB−holderを抽出する工程において,入力文字列上のMUMの位置を解析するために,他の右MUMを真のsuffixとしない右MUMの位置のみを計算することを特徴とする。
本発明の方法はまた,右UEB−holderのprefixのみを,UEBの候補とみなすことを特徴とする。
【0022】
【発明の実施の形態】
以下,図面を参照して本発明の実施の形態について説明する。最初に,本明細書で使用する記号と用語及び概念を定義する。なお,本発明の方法は,塩基配列だけでなく,アミノ酸配列など他の種類の文字列に対しても適用可能である。そこで,以下では,配列を文字列と呼び,塩基を文字と呼ぶこととする。
【0023】
はじめに,すでに公知である概念について,本明細書で用いる記号および厳密な意味を定義する。
●空文字列
長さが0の文字列。本明細書では,以下,空文字列をεと表記する。
●文字列の連結
文字列s,tを連結した文字列をstと表記する。
●Prefix
ある文字列の部分文字列で,先頭がもとの文字列に一致するもの。
ある文字列tがt=psと書けるとき,pはtのprefixである。ここで,sは空文字列であってもよい。すなわち,tはt自身のprefixである。s≠εのとき,pをtの真のprefixと呼ぶ。
例えば,「A」,「AT」,「ATA」,「ATAT」,「ATATG」は文字列「ATATG」のprefixである。これらのうち「ATATG」以外は,真のprefixである。
【0024】
●Suffix
ある文字列の部分文字列で,末尾がもとの文字列に一致するもの。
ある文字列tがt=psと書けるとき,sはtのsuffixである。ここで,pは空文字列であってもよい。すなわち,tはt自身のsuffixである。p≠εのとき,sをtの真のsuffixと呼ぶ。
例えば,「G」,「TG」,「ATG」,「TATG」,「ATATG」は文字列「ATATG」のsuffixである。これらのうち「ATATG」以外は,真のsuffixである。
【0025】
●|s|
文字列sの長さ。
●|A|
集合Aの要素数。
●⊆,⊇,⊂,⊃
本明細書では,2つの集合A,Bについて,「A⊆B」とは,Aの全ての要素がBの要素であることを表し,「A⊇B」とはB⊆Aを表す。「A⊂B」とは,A⊆B かつA≠Bのことであり,「A⊃B」とはB⊂A を表す。
【0026】
●O(f(n))
g(n)=O(f(n)) であるとは,ある定数Cが存在して,十分大きなnに対しg(n)≦Cf(n)が成立することである。また,ある量が「O(f(n))である」とは,その量がnのある関数g(n)以下であり,g(n)=O(f(n))であることを意味する。このような表記法は,big−O notationと呼ばれている。
【0027】
●Suffix tree
文字列P1,P2,…,Pnのsuffix tree とは,P1,…,Pnに現れる全てのsuffix を格納したtree状のデータ構造で,以下の性質をもつ。なお,2つの文字列「ATATG」,「TTAGTA」を格納したsuffix tree 401を図4に図示した。
(S1) ルートノード402を持つ有向木である。
(S2) P1, …, Pn の文字列長の総和に等しい数のリーフ403を持つ。それらのリーフには,文字列番号と文字列中の位置が,互いに重複しないように割り当てられる。
(S3) それぞれのエッジ404には,P1,..., Pnのうち,どれか1つの文字列の部分文字列がラベル405として付加されている。さらに,リーフに直接至るエッジ以外のラベルは,空文字列406であってはならない。なお本明細書では,文字列iのj番目の文字で始まるsuffixに対応するリーフを,以下ではリーフ(i,j)と呼ぶ。また,本明細書では,文字列の先頭の文字を0番目と数える。
(S4) 任意のノード407を起点とするエッジに,同じ文字で始まるラベル405を持つエッジのペアは存在しない。
(S5) ルートノード402から文字列番号iと文字列中の位置jが割り当てられたリーフ403へのパス上にあるエッジのラベルを,このパス上で出会う順に連結すると,文字列iのj番目の文字で始まるsuffixとなる。
(S6) 任意のノードvを起点として伸びるエッジの数は1でない。
なお本明細書では,文字列iのj番目の文字で始まるsuffixに対応するリーフ403を,以下ではリーフ(i,j)と呼ぶ。
Suffix treeに格納されている文字列の文字数の合計をnとするとき,リーフ403の数がnなので,リーフ以外のノードの数はn−1個以下である。したがって,suffix treeのノード数は2n−1個以下で,O(n)である。
【0028】
●パスラベル
Suffix tree中のノード407のパスラベルとは,ルートノード402からこのノード407にいたるパス408上のエッジのラベルを,連結して得られる文字列である。本明細書では,「パスラベルがsのノード」と言った場合には,パスラベルがsで,かつルートノード402からそのノード407までのパス上に空文字列406をラベルとするエッジが存在しないノードを表すこととする。
【0029】
●Suffix link
ノードvのパスラベルが,ある文字aとある文字列sによりasと表現できるとき,パスラベルをsとするノードへのポインタをsuffix linkと呼ぶ。本明細書では,ノードvのsuffix linkを,該ノードvに直接至るエッジのラベルがεでない場合に定義し,suffixlink(v)と表記する。ノードvのパスラベルがasならば,suffixlink(v)が指し示すべきノード,すなわち文字列sをパスラベルとするノードは必ず存在することが知られている(Gusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York, chapter 6)。図4の409は,suffix linkの例である。なお,誤解を招く恐れのないときは,「suffixlink(v)」という表記を,suffixlink(v)が指すノードと同一視する場合がある。
次に,本明細書で特に用いる記号・用語および,本発明の新規な概念について,以下で定義する。
【0030】
●入力文字列(図3の301参照)
本発明の方法に入力として与えられる,塩基配列やアミノ酸配列などの,生体高分子配列。
●N
本発明の方法を適用すべき入力文字列の文字数の総和。
●u
本発明の方法に与えられるパラメータで,エクソン配列と考えられる最も短い文字列の長さを指定する整数である。
●p(v)
ノードvのパスラベル。
●v(s)
パスラベルが文字列sのノード。
●P(s)
文字列sを部分文字列として含む入力文字列の集合。なお,文字列sが文字列s’の部分文字列ならば,P(s)⊇P(s’)が成り立つ。
【0031】
●MUM(図3の303参照)
上述の条件(M1)−(M5)を満たす文字列。
●UEB(図3の305参照)
上述の条件(A1)−(A6)を満たす文字列。
●右MUM(図3の302参照)
右MUMとは,次の条件(R1)−(R4)を満たす文字列である。
(R1) 1つ以上の入力文字列の部分文字列である。
(R2) 長さはu以上である。
(R3) 各入力文字列には,高々1回しか出現しない。
(R4) 右MUM rは,任意の文字aに対してP(r)≠P(ra)を満たす。すなわち,右MUMは,この右MUMを部分文字列として共有するすべての入力文字列を維持したまま右側へ延長することはできない。
【0032】
なお,任意の右MUM rに対し,P(sr)=P(r)を満たす空文字列かも知れない最長の文字列sをとることができ,srは(M1)−(M5)を満たすので,MUMである。したがって,次の性質(R5)が成り立つ。
(R5) 任意の右MUM rについて,rをsuffixとするMUM mで,P(m)=P(r)を満たすものが存在する。
【0033】
また,右MUM rがあるMUM mのprefixであると仮定する。このとき,任意の文字aについてP(am)≠P(m)よりP(am)⊂P(m)だから,P(m)の入力文字列のうち,少なくとも1つの入力文字列iはP(am)に属さない。rは,mを含む入力文字列にはmのprefixとしてしか現れないから,入力文字列i上のrの左には文字aがないため,P(ar)に属さない。しかし,i∈P(m)⊆P(r)。したがって,P(ar)≠P(r)であり,rは(M5)を満たす。つまり,右MUMについて,次の性質(R6)が成り立つ。
(R6) MUMのprefixである右MUMは,MUMである。
【0034】
●左MUM
左MUMとは,次の条件(L1)−(L4)を満たす文字列である。
(L1) 1つ以上の入力文字列の部分文字列である。
(L2) 長さはu以上である。
(L3) 各入力文字列には,高々1回しか出現しない。
(L4) 左MUM lは,任意の文字aに対してP(l)≠P(al) を満たす。すなわち,左MUMは,この左MUMを部分文字列として共有するすべての文字列を維持したまま左側へ延長することはできない。
【0035】
●右UEB−holder(図3の304参照)
右UEB−holderとは,次の条件(H1)−(H3)を満たす文字列である。
(H1) 右MUMである。
(H2) 次の(H2a),(H2b)のうち,どちらかの条件を満たす。
(H2a) MUMである。
(H2b) あるMUM mが存在し,mhが少なくとも1つの入力文字列の部分文字列となるような,文字列hである。
(H3) 右MUMを真のprefixとして持たない。
【0036】
上述したように,本発明では右MUM,左MUM又はMUM,右UEB−holderを順次抽出し,それらを利用してUEBを抽出する。図5は,本発明による処理の全体を示すフローチャートである。以下では,図5を参照して,右MUM,左MUM,MUM,右UEB−holder,UEBを抽出する方法を説明する。
【0037】
■Suffix tree Tの構築(ステップS501)
本発明の方法では,まず,入力文字列に基づきsuffix tree Tを構築する。Suffix tree T は,Ukkonen のアルゴリズム(Gusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York, chapter 6)を用いて,O(N)で,全suffix linkを設定する工程を含めて構築可能である。
【0038】
本発明の方法は,こののち,suffix tree T上の深さ優先探査を繰り返し実行する。以下の説明では特に断らない限り,suffix tree T上の深さ優先探査において,ラベルが空文字列であるエッジとそのエッジが指し示すリーフを無視する。
【0039】
■右MUMの抽出(ステップS502)
本発明の方法は,右MUMを以下の(r1)−(r3)の方法により抽出する。
(r1) Suffix tree Tを用いて,Gusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York, chapter 9記載の方法により,suffix tree Tの任意のノードvの部分木に同一の入力文字列由来のリーフが存在するとき,かつそのときに限り,ノードvの部分木の少なくとも1つのノードv’について,h(v’)>0となるように,h(v)の値を設定可能である。この(r1)のステップはO(N)で完了できることが知られている。
(r2) suffix tree Tの任意のノードvについて,変数d(v)を設け,suffix tree Tを深さ優先探査する。この深さ優先探査では,ラベルが空文字列であるエッジと,そのエッジの指し示すリーフも探査する。探査の過程で遭遇したノードvがリーフか否かにより,(r2a)または(r2b)の処理を行なう。
(r2a)ノードvがリーフのとき,1を報告する。もし,ノードvに至るエッジのラベルが空文字列でなければ,d(v)を1にセットする。
(r2b)ノードvがリーフでないときは,まず部分木それぞれの深さ優先探査を行なう。少なくとも1つの部分木の深さ優先探査で−1との報告があった場合およびh(v)≠0の場合は,d(v)=0とし−1を報告する。これ以外の場合,部分木の探査で報告されたそれぞれの部分木のリーフ数の和をd(v)にセットし,セットした値を報告する。
(r3) suffix tree Tを再び深さ優先探査し,次の(r3a)および(r3b)を満足するノードvに出会ったとき,そのノードに「右MUMである」との印をつける。なお,(r3a)の条件を満たすか否か判定するために必要なパスラベル長は,探査の際にルートノードからvまでのパス上のエッジ長の和を保持することで,各ノードごとに定数時間で計算できる。なお,(r3)の深さ優先探査では,ラベルが空文字列であるエッジと,そのエッジの指し示すリーフは無視する。
(r3a)パスラベルの長さがu以上
(r3b)d(v)>0
(r1)−(r3)の処理が完了した時点で,「右MUMである」と印がついたノードのパスラベルは右MUMであり,かつそれらだけが右MUMである。その理由を述べる。
【0040】
まず,(r1)によって,ノードvの部分木に同一の入力文字列由来のリーフが存在するとき,かつそのときに限り,ノードvの部分木の少なくとも1つのノードv’について,h(v’)>0となるように,h(v)の値が設定される。したがって,(r2)において,各ノードvの変数d(v)は,以下の条件(d1)および(d2)を満足するように設定される。
(d1)ノードvのパスラベルp(v)が,2回以上出現する入力文字列が存在するときはd(v)=0。
(d2)ノードvのパスラベルp(v)が,任意の入力文字列に高々1回しか出現しない場合には,d(v)≠0。
【0041】
d(v)の値が(d1)と(d2)を満足することを踏まえ,本発明の方法で「右MUMである」と印がついたノードのパスラベルが,右MUMの条件(R1)−(R4)を満足することを示す。
(R1)について:
suffix tree T の任意のノードのパスラベルは,少なくとも1つの入力文字列のsuffixのprefixである。つまり,少なくとも1つの文字列の部分文字列である。したがって,(R1)は満たされる。
(R2)について:
本発明の方法で「右MUMである」と印がつくノードは,長さu以上のパスラベルを持つノードだけである。したがって,(R2)も満たされる。
(R3)について:
d(v)>0なるノードだけに「右MUM」であるとの印がつく。d(v)の性質より,これらのノードvのパスラベルは,各入力文字列中に高々1回しか出現しない。したがって,(R3)も満たされる。
(R4)について:
「右MUM」であるとの印がついたノードvのパスラベルp(v)について,どのように文字aを選んでも,ある入力文字列i∈P(v)が存在し,その入力文字列iはp(v)aを部分文字列として持たない。もし,そのような入力文字列iが存在しないなら,vから出るエッジはすべてaで始まるため,suffix treeの条件(S4)に反するからである。したがって,p(v)は(R4)を満足する。
さらに,本発明の方法で右MUMの印がついたノードのパスラベルの文字列でなければ,(R1)−(R4)のどれかの条件を満足しないことを示す。
【0042】
まず,suffix tree Tのパスラベルのprefixとして現れない文字列は,どの入力文字列の部分文字列でもないから,(R1)に反する。
次に,ノードのパスラベルのprefixとなっている文字列rに,対応するノードv(r)が存在しないと仮定する。このとき,ある文字aについてP(r)=P(ra)である。なぜなら,こうした文字aが存在しないならば,rをsuffixとする入力文字列が存在するか,aでない文字bについてrbを含む入力文字列が存在することを意味し,どちらの場合もv(r)が存在しないとの仮定に反するからである。よって,P(r)=P(ra)なるaが存在するからrは(R4)を満足しない。
【0043】
さらに,本発明の方法は,パスラベルが長さu未満のノードには印をつけないが,これらのノードのパスラベルは(R2)を満足しない。しかも,本発明の方法はd(v)=0のノードには印をつけないが,それらは少なくとも1つの入力文字列に2回以上出現する部分文字列である。ゆえに,(R3)を満足しない。
【0044】
以上で検討した以外に,(r1)−(r3)の方法で「右MUMである」と印がつかないノードのパスラベル以外の文字列は存在しない。つまり(r1)−(r3)の方法ですべての右MUMに対して,対応するノードに過不足なく「右MUMである」と印をつけることができる。
【0045】
■左MUMの抽出(ステップS503)
ステップS501でsuffix tree Tを構築し,ステップS502で右MUMを抽出したのと同様の方法で,左MUMを抽出する。なお,ステップS504によりMUMを抽出する場合,左MUMを抽出するステップS503は行なわなくてもよい。
【0046】
ステップS503では,左MUMを抽出するために,すべての入力文字列を逆順に見た文字列について,suffix tree T’を構築する。例えば,入力文字列がATATGとTTAGTAの場合は,これらを逆順にして得られるGTATAとATGATTについて,suffix tree T’を構築する。そして,「suffix tree T」を「suffix tree T’」に,「右MUM」を「左MUM」に読み替えて(r1)−(r3)を実行する。この方法で,左MUMを過不足無く抽出できるのは,ステップS502で過不足なく右MUMが抽出されることから明らかである。
【0047】
■MUMの抽出(ステップS504)
MUMを抽出する方法について述べる。なお,ステップS503により左MUMの抽出を行なった場合,MUMを抽出するステップS504は行なわなくてもよい。
【0048】
全てのMUMは,(M1)−(M4)より(R1)−(R4)を満たし,右MUMである。右MUMのノードには既に上記の方法で「右MUMである」と印がついているので,MUMを抽出するためには(M5)を満足する右MUMをパスラベルとするノードの中から,MUMをパスラベルとするノードを選び「MUMである」と印をつければよい。
【0049】
最も単純な方法は,右MUMに対応する全てのノードvについて,vのパスラベルを部分文字列として含む入力文字列の集合すなわちP(p(v))を記録し,任意の文字aについてP(ap(v))≠P(p(v))か否か調べる方法である。ところが,この方法では計算時間をO(N)とできない。計算時間がO(N)を超える例を以下に示す。
【0050】
文字列t(n,k)を,長さがnでk番目の文字がA,それ以外の文字がTである文字列とし,入力文字列集合601が[t(n,k):0≦k≦n−1]である場合を考える。n=5の例を図6に示す。このとき,0≦k≦k’−1, 1≦k’≦nである任意のk,k’について,u=1とすれば,t(k’,k) 602は(M1)−(M5)を満たし,MUMになる。t(k’,k)は先頭と末尾のAの数の合計に等しい数の入力文字列を除き,すべての入力文字列上に存在するから,n−(k’−1)個の入力文字列上に存在する。この例の入力文字列集合601の総文字数はN=n^2であることを考慮すれば,MUMの総数は式(1)よりN/2より多く,全てのMUMについてP(p(v))を求めるだけで,Nに入力文字列数を乗じた数のオーダーの計算時間が必要とわかる。したがって,処理時間をO(N)に抑えることができない。
【0051】
【数1】
【0052】
本発明は,O(N)の処理時間で,(M5)を満たす右MUMと印のついたノードに,過不足無く「MUMである」と印をつける方法を提供する。まず,入力文字列のprefixになっているMUMのノードに,次の方法(m1)で「MUMである」と印をつける。
(m1) suffix tree Tを深さ優先探査し,ノードに出会ったら,以下の処理を行なう。この深さ優先探査は,ラベルがεのエッジおよびその先のリーフも探査の対象とする。
(m1a) そのノードvがリーフなら,そのリーフ(i,j)において,j=0のとき,trueを返す。このとき,vに右MUMの印がついているならば,vに「MUMである」と印をつける。p(v)がどの入力文字列のprefixでもなかったら,印をつけずにfalseを返す。なお,j=0のとき,リーフ(i,j)のパスラベルは入力文字列iに一致し,ルートノードからリーフ(i,j)に至るパス上の任意のノードのパスラベルは,入力文字列iのprefixである。
(m1b) そのノードvがリーフでなければ,先に全ての部分木の探査を行なう。1つでもtrueを返す部分木があり,vに右MUMの印がついているならば,vに「MUMである」と印をつけてtrueを返す。それ以外の場合,印をつけずにfalseを返す。右MUM rが,少なくとも1つの入力文字列のprefixとなっているならば(M5)を満足し,そのようなrには(m1)の方法で「MUMである」と過不足なく印がつく。
【0053】
次に,どの入力文字列のprefixでもない右MUMをパスラベルとするノードのうち,MUMをパスラベルとするノードに(m2)−(m7)の方法で印をつける。
(m2) suffix tree Tの全てのノードvについて,vに直接至るエッジのラベルがεでないときに,変数C(v), N(v)を用意し,0で初期化する。
(m3) 深さ優先探査で,出会ったノードvについて,変数C(suffixlink(v))に1を加える。
(m4) 再び深さ優先探査で,出会ったノードvについて,vに「右MUMである」と印があり,C(v)=0であれば,vに「MUMである」と印をつける。
(m5) 再び深さ優先探査で,出会ったノードvについて,そのノードをルートノードとする部分木のvを含む全ノードv’のC(v’)の値の合計値を求め,C(v)をその合計値にセットする。
(m6) 再び深さ優先探査で,出会ったノードvについて,そのノードをルートノードとする部分木のvを含む全ノードで該ノードに至るエッジのパスラベルがεでないものの数を求め,N(v)にセットする。
(m7) 再び深さ優先探査で,出会ったノードvについて,suffixlink(v)が右MUMへのポインタであり,N(v)≠C(suffixlink(v))ならば,suffixlink(v)の指し示すノードに「MUMである」との印をつける。
【0054】
(m4)で,MUMである右MUM rをパスラベルとするノードv(r)に「MUMである」と印がつけば,rはMUMであることを説明する。まず,rがある入力文字列のprefixならばrはC(v(r))の値に関わらずMUMである。どの入力文字列のprefixでもないrについて検討する。このとき,arが少なくとも1つの入力文字列の部分文字列であるように,文字aを選ぶことができる。P(ar)=P(ars)を満たす最長の文字列をsとする。このとき,arsは(R1)と(R4)を満たし,rを部分文字列とするから(R2)と(R3)も満たすので右MUMである。s=εと仮定すれば,v(ar)が存在してv(r)にsuffix linkを持ちC(v(r))≠0だから,(m4)でv(r)に印がつくことに矛盾するのでs≠εである。sの先頭の文字をbとする。rが右MUMだから,P(rb)≠P(r)。rが少なくとも1つの入力文字列のsuffixであるとすれば,rはどの入力文字列のprefixでもないから,rより1文字長いsuffixをパスラベルとするノードからv(r)にsuffixlinkがあるはずでC(v(r))≠0だから,(m4)でv(r)に印がつくことに矛盾。よって,bと異なる文字b’を,rb’が少なくとも1つの入力文字列の部分文字列となるように選べる。P(rb)⊇P(ars)=P(ar)であることと,rb’はrbを部分文字列とする入力文字列上には存在しないことから,rb’はarを部分文字列とする任意の入力文字列上に存在しない。しかし,rはどの入力のprefixでもないから,a’rb’が少なくとも1つの入力文字列の部分文字列になるようにaでない文字a’を選べる。したがって,右MUM rは,a≠a’より(M5)を満たし,MUMであることがわかる。
【0055】
(m7)で印がついたノードのパスラベルのうち,どの入力文字列のprefixでもない文字列もMUMであることを説明する。これ以降,N(v(ar)),C(v(r))は,(m1)−(m6)が完了し,(m7)のステップを実行するときの値とする。まず,ある文字列arをパスラベルとするノードv(ar)に関して,N(v(ar))=C(v(r))が成り立つときに,かつそのときに限り,P(ar)=P(r)であることを説明する。
【0056】
はじめに,P(ar)=P(r)が成り立つときN(v(ar))=C(v(r))である理由を述べる。まず,P(ar)=P(r)を仮定すると,N(v(ar))≧C(v(r))であることを説明する。v(r)の部分木の,あるノードwについて,C(w)がv(ar)の部分木にないノードw’からのsuffix linkにより(m3)において増えたとする。このとき,aでない文字bが存在しp(w’)=brs。一方,P(brs)に属する任意の入力文字列は,a≠bよりarを部分文字列として持たない。したがって,P(brs)⊆P(r)よりP(ar)≠P(r)であり,仮定に矛盾する。つまり,C(v(r))はv(ar)の部分木のノードからのsuffix link以外で増えることができないから,N(v(ar))≧C(v(r))。ところが,次に述べる理由により,N(v(ar))≦C(v(r))である。v(ar)の部分木の任意のノードwのパスラベルは,ある文字列sを用いてarsと書ける。このとき,suffixlink(w)はv(rs)を指しており,v(rs)は,v(r)の部分木のノードである。よって,N(v(ar))個あるv(ar)の部分木の任意のノード1つにつき,v(r)の部分木のどれか1つのノードw’についてC(w’)が(m3)のステップで1つ増える。C(v(r))は,(m5)が終了した時点でv(r)の部分木の全てのノードw’のC(w’)が(m3)で増やされた回数の総和に更新されるから,N(v(ar))≦C(v(r))になる。したがって,N(v(ar))=C(v(r))が成り立つ。
【0057】
次に,N(v(ar))=C(v(r))が成り立つときP(ar)=P(r)である理由を述べる。P(ar)⊆P(r)は明らか。P(r)に属しP(ar)に属さない入力文字列iの存在を仮定する。rはどの入力文字列のprefixでもないから,入力文字列i上ではrの左にaでない文字bが存在する。v(ar),v(br)をルートノードとする部分木の任意のノードは,v(r)をルートノードとする部分木のノードへのsuffix linkを持つから,C(v(r))≧N(v(ar))+N(v(br))が成り立つ。ところが,brは入力文字列i上の部分文字列だから,suffix tree Tにbrをパスラベルのprefixとするノードが少なくとも1つ存在する。よって,N(v(br))>0。したがって,C(v(r))>N(v(ar))。これはC(v(r))=N(v(ar))に矛盾する。ゆえに,P(r)に属しP(ar)に属さないような入力文字列iが存在すると仮定したのが誤りで,P(r)=P(ar)が成り立つとわかる。
【0058】
(m7)では,N(v)≠C(suffixlink(v))のとき,suffixlink(v)が指し示すノードwが右MUMをパスラベルとするなら,wに「MUMである」と印をつけている。r=p(w)とすれば,ある文字aが存在してarがvのパスラベルである。すなわち,(m7)ではN(v(ar))≠C(v(r))なる右MUMのノードv(r)にのみ印がつくが,rがどの入力文字列のprefixでもなければ,P(ar)≠P(r)よりrはMUMである。一方,rが少なくとも1つの入力文字列のprefixならば,rがMUMであることは自明。つまり,(m7)でもMUMをパスラベルとするノードにしか「MUMである」と印をつけないことがわかる。
【0059】
逆に,(m1)−(m7)の方法で印が付かないMUMは存在しないことを示す。まず,入力文字列のprefixであるMUMをパスラベルにもち,(m1)で印がつかないノードが存在しない。次に,どの入力文字列のprefixでもないMUM mについて考察する。このようなmをパスラベルとするノードv(m)を指し示すsuffix linkが存在しないときは,(m4)で印がつく。一方,ノードv(m)を指し示すsuffix linkが存在するときは,そのsuffix linkの起点となっているノードに(m7)の深さ優先探査で出会ったときにv(m)に「MUMである」と印がつく。以上の理由により,すべてのMUMに(m1)−(m7)の方法で「MUMである」と印がつく。
【0060】
■MUM末端位置の抽出(ステップS505)
ステップS502で抽出した右MUMの情報と,ステップS503で抽出した左MUMの情報またはステップS504で抽出したMUMの情報を用いて,ステップS505で2次元配列Head,Tailを以下のように設定する。なお,Head, Tailは,入力文字列iと該入力文字列の長さよりも小さな非負整数jに対して値を持つ。
Head[i,j] :
入力文字列iのj番目の塩基から始まる部分文字列に,MUMであるものが存在すれば1。それ以外の場合は0。(図7参照)
Tail[i,j] :
入力文字列iのj番目の塩基で終わる部分文字列に,MUMであるものが存在すれば1。それ以外の場合は0。(図7参照)
【0061】
まず,Tailの値を設定する方法について述べる。本発明の方法では,Tailの値を設定するにあたり,MUMの位置を直接計算する代わりに,他の右MUMをsuffixとして持たない右MUM rの位置を計算する。そのような任意のrについて,rが入力文字列iのj番目塩基を末尾とする部分文字列であるなら,Tail[i,j] 702に,1を書き込む。このような,他の右MUMをsuffixとしない右MUM r (以下,極小右MUMと呼ぶ)の終了位置の集合と,全てのMUMの終了位置の集合は等しい。その理由は,全ての右MUM rには(R5)よりrをsuffix としP(r)=P(m)であるMUM mが存在する一方,全てのMUM mは極小右MUM rをsuffixとして持ち,P(m)⊆P(r) が成り立つからである。以上を踏まえ,次の(t1)−(t4)の方法で,全ての右MUMの末端に対応するTail[i,j] 702を1に設定することができる。
(t1) suffix tree Tを,深さ優先探査し,「右MUMである」と印があるノードvについて,suffixlink(v)が指し示すノードが右MUMでないとき,vに「極小右MUM」と印を付ける。
(t2) 2次元配列Tail 701の全ての要素を0で初期化。
3_right_MUMを空リストで初期化する。
(t4) 再びsuffix tree Tを深さ優先探査し,出会ったノードvに対し(t4a),(t4b)の処理を行なう。この深さ優先探査では,ラベルがεであるエッジの終端にあるノードも含めて全ノードを探査する。
(t4a) vに「極小右MUMである」と印がついている場合には,リストminimal_right_MUMの末尾に,vのパスラベルの長さ|p(v)|を追加する。なお,リストminimal_right_MUMに追加した値は,ノードvをルートノードとする部分木の処理が終了した時点で削除する。この削除の操作は,単にminimal_right_MUMの末尾の要素を削除するだけで実現できる。
(t4b) vがリーフ(i,j)のとき,リストminimal_right_MUMの任意の要素kについて,Tail[i,j+k−1] 701を1に設定する。
【0062】
(t1)で,極小右MUMのノードに,過不足無く印がつく。よって,(t2)−(t4)で,入力文字列iのj番目の文字で終了する極小右MUMが存在するときに,かつそのときに限り,Tail[i,j]に1を書き込む。逆に,このようなi,j以外では,Tail[i,j]は1にならない。この方法で,同一のi,jに対し,2回以上Tail[i,j]が更新されることはないから,(t1)−(t4)はO(N)で完了できる。
【0063】
なお,極小右MUMの位置のみを計算するのではなく,全てのMUM mや右MUM rについて,それらが出現するすべての入力文字列iについてmやrの最後の文字がj番目の文字のときTail[i,j]に印をつける方法では,O(N)の処理時間では完了できない場合がある。ステップS504の説明で述べたときの入力文字列集合601が,その例となっている。0≦k≦k’−1, 1≦k’≦nである任意のk,k’について,t(k’,k) 602はMUMであり右MUMであるが,これらが入力文字列に出現する回数の総和は式(2)で表される。したがって,入力文字列iのj番目の文字で終了するような全てのi,jについてTail[i,j]=1とする処理のステップ数が,N^(3/2)のオーダーの計算時間を要する例が存在し,直接MUMや右MUMの位置を計算する方法では,O(N)の処理時間でTailの値を設定するのは不可能とわかる。
【0064】
【数2】
【0065】
次に,Head[i,j] 701を設定する方法を示す。まず,ステップS503で,左MUMの抽出が完了している場合に,Head[i,j] 701を設定する方法を示す。他の左MUMをprefixとしない左MUMを極小左MUMとする。Head[i,j]を設定するためには,suffix tree Tをsuffix tree T’,右MUMを左MUM,極小右MUMを極小左MUM,Tail[i,j+k−1]をHead[i,(入力文字列iの長さ)−1−(j+k−1)]と読み替えて,(t1)−(t4)を適用すればよい。この方法で2次元配列Headを正しく設定できることは,(t1)−(t4)がTailを正しく設定することから自明であり,O(N)の時間で処理を完了できる。
【0066】
一方,ステップS503ではなくステップS504を実行した場合には,suffix tree Tを深さ優先探査し,「MUMである」と印がついたノードvで,ルートノードからvに至るパス上に別の「MUMである」と印のついたノードが存在しないノードvを発見した場合,vの部分木内では,ラベルがεのエッジおよびそのエッジの先にあるリーフも対象とする深さ優先探査に変更し,出会った任意のリーフ(i,j)について,Head[i,j] 701を1に設定すればよい。この方法で,同一のi,jの組に対し,2回以上Head[i,j] 701が更新されることはないから,(t1)−(t4)はO(N)の処理時間で完了できる。ところで,この方法により他のMUM mを真のprefixとして持つMUM m’の位置は計算されないが,mはm’のprefixでありP(m)⊇P(m’)だから,m’が入力文字列iのj番目の文字で始まる部分文字列ならば,mもそうであり,Head[i,j]は正しく1に設定される。この方法で,入力文字列iのj番目から始まる任意の文字列がMUMでない場合に,Head[i,j]が1にならないことは明らかである。
【0067】
■右UEB−holderの抽出(ステップS506)
以下に述べる方法(h1)−(h3)によって,右UEB−holderである文字列をパスラベルとするノードに「右UEB−holderである」と印を付けることができる。事前に,2次元配列Tvを用意する。TvもHead,Tailと同様に,入力文字列iと該文字列の長さよりも小さな非負整数jに対して値が定義される。
(h1) Tvの全要素をヌルポインタで初期化する。また,変数shortest_right_MUMにヌルポインタを代入する。
(h2) suffix tree Tを深さ優先探査し,出会ったノードvについて,(h2a)と(h2b)の処理を行なう。なお,この深さ優先探査ではラベルがεのエッジとそのエッジが至るリーフも処理の対象とする。
(h2a) ノードvに「右MUMである」と印があり,shortest_right_MUMがヌルポインタであれば,shortest_right_MUMにvへのポインタを代入する。なお,vをルートノードとする部分木の処理が終了した段階で,shortest_right_MUMの値はヌルポインタに戻す。
(h2b) ノードvがリーフ(i,j)であった場合には,変数shortest_right_MUMの値をTv[i,j]に代入する。
(h3) 全ての入力文字列iについて,入力文字列のiの長さより小さい任意の非負整数jに対し,次の(h3a),(h3b)の条件がともに満たされるとき,Tv[i,j]が指し示すノードに「右UEB−holder」と印を付ける。
(h3a) Head[i,j]が1であるか,j≧1かつTail[i,j−1]が1。
(h3b) Tv[i,j]がヌルポインタでない。
【0068】
この方法(h1)−(h3)で,右UEB−holderをパスラベルとするノードに,かつそれらのノードに限り,「右UEB−holderである」と印がつくことを示す。まず,(h2)によって,Tv[i,j]の値は,以下の値に設定される。
(1) 入力文字列iのj番目の文字から始まる部分文字列である右MUM rが存在するなら,rをパスラベルとするノードvへのポインタ。ただし,ルートノードからvに至るパス上に,v以外に「右MUMである」と印がついたノードは存在しない。
(2) 入力文字列iのj番目の文字から始まる部分文字列である右MUMが存在しないなら,ヌルポインタ。
【0069】
これを踏まえ,(h3)において,「右UEB−holderである」と印がついたノードは,実際に右UEB−holderをパスラベルとするノードであることを示す。
(H1)について:
右MUMのノードにしか印をつけないので,そのパスラベルは(H1)を満たす。
(H3)について:
Tv[i,j]がヌルポインタでないとき,Tv[i,j]は,「右MUMである」と印が付いたノードvへのポインタで,suffix tree Tのルートノードからvに至るまでのパス上に「右MUMである」と印がついたノードは存在しない。よって,Tv[i,j]の指し示すノードのパスラベルは,(H3)を満足する。
(H2)について:
Head[i,j]が1であるか,j≧1かつTail[i,j−1]が1であるようなTv[i,j]の指すノードにしか印を付けない。したがって,Tv[i,j]の示すノードのパスラベルをrとすると,rは入力文字列iにおいてj番目の文字で始まるMUM mのprefixである右MUMか,入力文字列iにおいてあるMUMの次の文字から始まる右MUMである。前者の場合,rは(R6)よりMUMである。したがって,(H2)も満たされる。
【0070】
次に,ある右UEB−holder hについて,本発明の方法によりv(h)に右UEB−holderの印がつかないと仮定する。まず,Tv[i,j]にv(h)へのポインタが入らないと仮定する。このとき,hは右MUMでないか,hを真のprefixとする右MUMが存在する。それぞれ,(H1),(H3)よりhが右UEB−holderであることに矛盾しTv[i,j]にはv(h)へのポインタが入らなければならないことがわかる。それでもhに「右UEB−holderである」との印がつかないということは,hが入力文字列iのj番目から始まるような任意のi,jについて,Head[i,j]=0 かつTail[i,j−1]=0( j≧1のとき)ということである。このとき,入力文字列iのj番目から始まるMUMが存在せず,かつ入力文字列iのj−1番目の文字を末端とするMUMも存在しないが,そのようなhは(H2a),(H2b)をいずれも満たさないため,やはりhが右UEB−holderであることに矛盾する。したがって,v(h)に「右UEB−holderの印がつかない」と仮定したことが誤りであり,本発明の方法はの右UEB−holderをパスラベルとする全てのノードに印をつけられることがわかる。
【0071】
■UEBの抽出(ステップS507)
UEBは,次の(e1)−(e3)の方法によって,過不足なく抽出することができる。なお,UEBを抽出するために,ステップS505,S506で計算したHead, Tail, Tvの値を利用する。
(e1) suffix tree T内の全てのノードvについて,vに至るエッジのラベルがεでないときに,変数UEBlength(v)を設ける。そして,深さ優先探査を行ないUEBlength(v)=|p(v)|と初期化する。
(e2) 全ての入力文字列iについて,次の(e2a)−(e2d)までの処理を行なう。
(e2a) 変数cを1,変数jを入力文字列iの長さから1を減じた値で,初期化する。(e2b) Tv[i,j]がヌルポインタでなければ,Tv[i,j]が指し示すノードをvとし,変数UEBlength(v)の値を,cの値703とUEBlength(v)の値のうち小さい方の値で置き換える。
(e2c) Head[i,j]が1であるか,j≧1かつTail[i,j−1]が1であれば,cに1を代入し,それ以外のときはcに1を加える。
(e2d) jの値から1を減じる。jが0以上ならば,(e2b)−(e2d)までの処理を再び行なう。jが0より小さければ,入力文字列iに関する処理は終了である。
(e3) suffix tree Tを,各ノードvのパスラベルの長さ|p(v)|を求めながら深さ優先探査する。ルートノードからvに至るパス上の,直接vに至るエッジの長さをedgelength(v)とする。ノードvが,次の2つの条件(e3a),(e3b)をともに満たすとき,vに「UEBである」と印をつける。
(e3a) edgelength(v) > |p(v)|−UEBlength(v)
(e3b) UEBlength(v)≧u
【0072】
以上の方法で,「UEBである」と印がついたノードvの長さUEBlength(v)のprefixはUEBであり,かつそれらだけがUEBであることを説明する。その説明に先立ち,(A1)−(A6)の条件が次の(E1)−(E6)の条件と等価であることを示す。
(E1) ある右UEB−holderのprefixである。
(E2) 長さがu以上である。
(E3) 同一文字列には,高々1回しか出現しない。
(E4) 右でも左でも,MUMと重ならない。
(E5) MUMを真の部分文字列としない。
(E6) (E1)−(E5)を満足する文字列の真のprefixにならない。
【0073】
条件(A1)−(A6)と(E1)−(E6)が等価であることを説明する準備として,まず,文字列eが(E1)−(E3)を満足するなら,eは次の性質(E7)を持つことを示す。
(E7) eをprefixとする右UEB−holder hは一意に決まり,かつその右UEB−holder hについて,P(e)=P(h)である。
【0074】
(E7)が成り立つことを示すために,(E1)−(E3)を満たす文字列eについて検討する。(E1)より,eはある右UEB−holder hのprefixである。eをprefixとする右UEB−holder h’の存在を仮定し,h≠h’とする。(H3)より,hはh’の真のprefixではなく,h’もhの真のprefixではない。しかし,eがh,h’の共通のprefixだから,図14に示すように,空文字列かも知れない文字列s,s’,s’’と,a≠a’なる文字a,a’が存在してh=esas’,h’=esa’s’’と書くことができる。このとき,esはh,h’の共通のprefixである。a≠a’より任意の文字bについてP(esb)≠P(es)であり,esは(R4)を満たす。さらに,esは右UEB−holder hの部分文字列だから(R1)を満たし,eが(E2)と(E3)を満たすから(R2)と(R3)を満たす。したがって,esは右MUMである。ところが,h,h’は右UEB−holderだから,(H3)より右MUMをprefixとして持たないはずである。したがって,h≠h’とした仮定が誤りで,右UEB−holderは一意であることがわかる。
【0075】
さらに,hが P(e)=P(h)を満たすことを示す。sをP(e)=P(es)を満たす最長の文字列とする。P(es)=P(e)⊇P(h)より,esはhを部分文字列とする任意の入力文字列の部分文字列になっている。文字列eは,(E3)よりどの入力文字列上にも高々1回しか出現しないため,esとhは,一方が他方のprefixの関係にある。ところで,esはP(e)=P(es)より(R1)を満たし,eを部分文字列とするから(R2)と(R3)を満たし,sの定義より(R4)を満たす。よって,esは右MUMである。(H3)より,hは右MUMをprefixとしないからhがesのprefix。よって,P(h)⊇P(es)=P(e)⊇P(h)だからP(h)=P(es)=P(e)である。
すなわち,(E1)−(E3)を満たす文字列eをprefixとする右UEB−holder hは一意であり,P(e)=P(h)であることがわかった。
【0076】
条件(A1)−(A6)と(E1)−(E6)が等価であることを示すにあたり,はじめに,(E1)−(E6)を満たす文字列eは,(A1)−(A6)を満たすことを示す。
(A1)について:
eは(E1)より右UEB−holderのprefixだが,任意の右UEB−holderは右MUMだから(R1)を満たすので,少なくとも1つの入力文字列の部分文字列である。したがって,文字列eは(A1)を満たす。
(A2)について:
文字列eは(E2)を満たすから,明らかに(A2)を満たす。
(A3)について:
文字列eは(E3)を満たすから,明らかに(A3)を満たす。
(A4)について:
文字列eは(A4)を満たすから,明らかに(A4)を満たす。
(A5)について:
文字列eは(E5)を満たすから,明らかに(A5)を満たす
(A6)について:
(A1)−(A5)を満たし,eを真の部分文字列とする文字列e’の存在を仮定する。このとき,ある文字列s,s’を用いてe’=ses’と書ける。(E7)よりeをprefixとして持つ右UEB−holder hが一意に存在する。図10は,e,e’,s,s’,hの関係を図示したものである。
【0077】
まず,s=εではないことを説明する。もし,s=εだと仮定すると,e’=es’だから,eはe’のprefixであり,e’とhは一方が他方のprefixの関係にある。さらに,e’≠eよりs’≠εである。一方,hは右MUMだから(R5)よりhをsuffixとしP(h)=P(m)であるMUM mが存在する。ここで,hがe’の真のprefixと仮定すれば,s’≠εよりe’はmと左で重なって(A4)に矛盾するか,h=mを部分文字列とし(A5)に矛盾。したがって,e’がhのprefixである。ところが,e’がhのprefixならばe’は(E1)を満たし,(A2)−(A5)を満たすから(E2)−(E5)を満たすが,eはe’の真の部分文字列だからeが(E6)の条件を満たすことに矛盾する。したがって,s=εであってはならないことがわかる。
【0078】
そこで,s≠εを仮定する。hがMUMであった場合は,e’はhの長さにより,hと右で重なり(A4)に矛盾するか,hを真の部分文字列として含み(A5)と矛盾するかのいずれかとなるため,hはMUMではない。つまり,hはMUMでない右UEB−holder であるから,(H2b)よりあるMUM m’が存在し,m’hが少なくとも1つの入力文字列の部分文字列となる。ところが,(E7)よりP(h)=P(e)⊇P(e’)だから,m’hが存在する入力文字列1001上に,必ずe’が存在する。s≠εだから,e’はm’と左で重なり(A4)に矛盾するか,m’を部分文字列として含み(A5)に矛盾する。
結局,eを真の部分文字列とする文字列e’を(A1)−(A5)を満たすようにとれば,必ず矛盾が生じるとわかる。したがって,eは(A6)を満たす。
【0079】
次に,(A1)−(A6)を満たす文字列eは,(E1)−(E6)を満たすことを示す。
(E1)について:
文字列sを,P(e)=P(es)なる最長の文字列とする。このesが,(H1)−(H3)を満たし,右UEB−holderになることを示す。まず,eは(R2)と(R3)を満たすからesも(R2)と(R3)を満たし,sの定義より文字列esは(R1)と(R4)も満たすので,右MUMである。ゆえに,esは(H1)を満たす。
【0080】
次に,文字列eが右MUM rを真のprefixとして持つと仮定する。このとき,(R5)よりrをsuffixとし,P(r)=P(m)であるMUM mが存在する。すると,P(e)⊆P(r)=P(m)よりeはある入力文字列上でmと左で重なり(A4)に矛盾するか,mを真の部分文字列とするため(A5)に矛盾し,こうしたrは存在しないことがわかる。また,esが|e|≦|r|なる右MUM rを真のprefixとして持つと仮定すると,ある文字aについて|e|≦|r|≦|ra|≦|es|だから,P(e)⊇P(r)⊇P(ra)⊇P(es)であり,P(es)=P(e)よりP(e)=P(r)=P(ra)=P(es)である。これはrが右MUMで(R4)を満たすことに矛盾するから,結局esの真のprefixに右MUMは存在しないことがわかる。したがって,esは(H3)を満たす。
【0081】
このesが右UEB−holderでないと仮定する。このとき,esは(H1),(H3)を満足するから(H2)を満足しない。すなわち,esはMUMでなく,かつ任意のMUM mについて,文字列mesを部分文字列とする入力文字列は存在しない。esがMUMでないから,ある文字aについて,P(e)=P(ae)が成り立つ。このaeが,(A1)−A5)満たすことを示す。
【0082】
文字列aeは,P(e)=P(ae)だから(A1)を満たし,eをsuffixとして含むから(A2)と(A3)を満たす。
文字列aeがあるMUM mと左で重なると仮定すれば,eは(A4)よりmと重ならないから,図11に示すように空文字列でないある文字列tについてm=taと書くことができ,tae=meが少なくとも1つの入力文字列1101の部分文字列になる。ところで,P(es)=P(e)だからeは必ずsを伴って入力文字列中に現れるので,mesも入力文字列1101の部分文字列になるが,esは(H2b)を満たさないから,このようなMUM mは存在しないはずで,矛盾が生じる。したがって,aeは左ではMUMと重ならない。
【0083】
一方,aeがあるMUM mと右で重なると仮定すると,eが(A4)を満たすからeとmは重ならないため,図12に示すようにeはmのprefixである。P(m)⊆P(e)=P(es)より,少なくとも1つの入力文字列1201上にmとesが,この入力文字列上に1度しか出現しないeをprefixとして出現するため,mとesは一方が他方のprefixの関係にある。ところが,esが(H3)を満たすことをすでに述べたから,mはesの真のprefixでない。よってesがmのprefix。(R6)より,MUMのprefixである右MUMは,MUMである。ゆえに,esはMUMでなければならないが,esが(H2a)を満たさないことに矛盾する。したがって,aeもMUMと右で重ならない。すなわち,aeは(A4)を満たす。
【0084】
さらに,aeの真の部分文字列でMUMである文字列mが存在すると仮定する。e=mと仮定すると,s=εならばm=e=esだからesが(H2a)を満たさないことに矛盾し,s≠εならば,m=eはesの真のprefixであり,mは右MUMだから,esが(H3)を満たすことに矛盾する。ゆえに,e≠m。さらに,eが(A5)を満たすから,mはeの部分文字列でもない。よって,図13に示すように,mはaeの真のprefixである。したがって,ある文字列t,t’を用いてm=at,e=tt’と書くことができる。ここで,m=aならば,P(ae)=P(e)=P(es)よりある入力文字列1301上にaes=mesが部分文字列として存在し,esが(H2b)を満たさないことに矛盾するから,m≠aであり,t≠εである。一方,t’=εならば,m=at=aeよりmはaeの真の部分文字列でなくなるから,t’≠ε。ところで,P(e)=P(ae)よりae=att’=mt’は少なくとも1つの入力文字列1301の部分文字列である。したがって,e=tt’はm=atと左で重なってしまうので(A4)に矛盾するから,aeの真のprefixでMUMである文字列の存在は否定される。よって,aeの真の部分文字列にMUMは存在しない。つまり,aeは(A5)を満たす。
【0085】
以上で,aeが(A1)−(A5)を満たすとわかった。ところが,eはaeの真の部分文字列であり,eが(A6)を満たすことに矛盾する。したがって,esが(H2)を満足しないとした仮定が誤りであることがわかる。すなわち,esは(H2)も満足し,右UEB−holderである。ゆえに,eは(E1)を満たす。
(E2)について:
文字列eは(A2)を満たすから,明らかに(E2)を満たす。
(E3)について:
文字列eは(A3)を満たすから,明らかに(E3)を満たす。
(E4)について:
文字列eは(A4)を満たすから,明らかに(E4)を満たす。
(E5)について:
文字列eは(A5)を満たすから,明らかに(E5)を満たす。
(E6)について:
UEB eをprefixとして持ち,(E1)−(E5)を満たす文字列e’の存在を仮定する。(A1)−(A5)は,(E1)−(E5)のみから導けたから,e’は(A1)−(A5)を満たす。しかし,eは(A6)を満たすから,このようなe’は存在しないはずである。よって,(E6)も満たされる。
【0086】
以上で,条件(A1)−(A6)が条件(E1)−(E6)と等価であることを示した。したがって,本発明のUEB抽出方法で,条件(A1)−(A6)を満たす文字列すなわちUEBを過不足無く抽出できることを示すには,(E1)−(E6)の条件を満たす文字列を過不足なく抽出できることを示せばよい。
【0087】
まず,(e1)−(e3)の方法で,「UEBである」と印がついたノードvのパスラベルの,長さUEBlength(v)のprefix eは,(E1)−(E6)を満たすことを示す。
(E1)について:
右UEB−holderのprefixである文字列だけを抽出するから,eは(E1)を満たす。(E2)について:
条件(e3b)より,UEBlength(v)がu以上の,「右UEB−holderである」と印があるノードvだけにUEBであるとの印をつけるから,eは(E2)を満たす。
(E3)について:
文字列eが(E3)を満たさないと仮定すると,eはある入力文字列i上でj番目とj’番目に現れ,j≠j’である。すると,入力文字列iのj番目の文字とj’番目の文字から始まるsuffixのprefixはeだから,リーフ(i,j)とリーフ(i,j’)のパスラベルがいずれもeをprefixにもつ。eの長さはUEBlength(v)だから,条件(e3a)が満たされたことよりパスラベルのprefixにeを持つリーフへのポインタは,必ずvを通る。しかし,hは右UEB−holderであり,どの入力文字列中にも高々1回しか現れないので,リーフ(i,j)とリーフ(i,j’)のうち,少なくともどちらか片方のリーフへのパスはvを通ることができないから,矛盾を生じる。つまり,eが(E3)を満たさないと矛盾が生じるから,eは(E3)を満足しなければならないことがわかる。(E4),(E5)について:
ステップ(e2b)において,変数cの値703(図7参照)は,入力文字列iにおいてj番目の文字から始まる部分文字列で,入力文字列iにおいてj番目の文字以外には,任意のMUMの先頭の文字と,任意のMUMの終端の次の文字を含まない,最も長い文字列の長さとなっている。一方,任意の右UEB−holder hについて,p(v)=hなるノードをvとすると,hが入力文字列iのj番目の文字で始まるような全てのi,jについて,ステップ(e2b)でUEBlength(v)はその時点のUEBlength(v)と変数cの値703のうち,小さいほうの値に更新される。また,UEBlength(v)の初期値は,|p(v)|=|h|である。したがって,(e2)が完了した時点で,UEBlength(v)は,次の条件(e4a)および(e4b)を満足する最大の整数kとなる。
(e4a) k≦|h|
(e4b) hの長さkのprefixで,MUMと重なる文字列や,MUMを部分文字列とする文字列は存在しない。
【0088】
ゆえに,文字列eは(E4)と(E5)を満たす。
(E6)について:
UEBlength(v)は,eをprefixとする右UEB−holderのprefixで,(E4)と(E5)を満たす最長のものの長さである。eの長さはUEBlength(v)だから,(E6)も満たされる。
【0089】
逆に,本発明の方法で「UEBである」と印がついたノードvのUEBlength(v)のprefix以外の文字列は,UEBでないことを示す。まず,右UEB−holderのprefix以外の文字列はUEBとみなされないが,(E1)よりこれらの文字列はUEBでない。(e3a)を満足しないために印がつかなかった右UEB−holder hのprefix eについては,hの真のprefixで,eをprefixとして含む文字列sをパスラベルとするノードwが存在する。このsが,任意の入力文字列に高々1回しか現れないと仮定すると,sは(R3)を満たし,wのパスラベルだから(R1)を満たす。|e|≧uのとき,|s|≧|e|≧uだからsは(R2)を満たし,suffix tree Tのノードのパスラベルだから(R4)を満たす。つまり,|e|<u でない限り,sは右MUMであり,hが右UEB−holderであることに矛盾。したがって,sは,少なくとも1つの入力文字列に2回以上出現する部分文字列である。ところが,eはsのprefixだから,eもこの入力文字列上に2回以上出現し,(E3)を満たさないからUEBでない。|e|<uのときは,(E2)を満たさないから明らかにUEBでない。結局,(e3a)を満足しないために印がつかなかった右UEB−holderのprefix eは,UEBでない。(e3b)を満足しないために印がつかなかった右UEB−holder hのprefix eは,長さがu未満だから明らかに(E2)に反し,UEBでない。さらに,UEBlength(v)はp(v)のprefixで(E4)と(E5)を満たす最も長い文字列の長さだから,vのパスラベルのprefixでUEBlength(v)より長い文字列は(E4)または(E5)に矛盾し,UEBlength(v)より短い文字列は(E6)に矛盾する。
以上により,本発明の方法でUEBであると判断されない文字列は,UEBではないことがわかった。
【0090】
■本発明の方法の処理時間
本発明の方法の処理時間の,入力文字列の文字の総数Nに対する振る舞いについて検討する。本発明の処理は,O(N)の時間で完了できることが知られている(r1)の方法と,入力文字列数や入力文字列の文字数に依存しない回数のsuffix tree Tに対する深さ優先探査と,それぞれの深さ優先探査における各ノードに対する定数時間の処理と,全要素数がNである3つの2次元配列Head, Tail, Tvの各要素に対する入力文字列数や入力文字列の文字数に依存しない回数の定数時間の処理により完了できる。suffix treeに対する深さ優先探索は,1回あたりO(N)の時間で完了できる。したがって,本発明の方法全体の計算時間は,O(N)である。
【0091】
■本発明の方法の効率的な実装方法
本発明の方法では,suffix treeの深さ優先探査を繰り返し行なっているが,いくつかの処理でsuffix treeの深さ優先探査の処理を統合することができる。(r2)と(r3),(m1)と(m3),(m4)と(m5),(m6)と(m7)は,変数を更新する順序に考慮しつつそれぞれ1回の深さ優先探査にまとめることができる。これにより,本発明の方法を実装することが容易になるとともに,実装されたシステムの性能向上も図ることができる。また,あるステップが終了した後には参照されない変数に割り当てられる記憶装置を,別の変数を記録するために再利用し,記憶装置の利用効率を向上させることができる。例えば,変数h(v),d(v),C(v),UEBlength(v)は,同一の記憶領域を共有できる。また,変数N(v)の値は,探査するノードvのパスラベルの長さを再帰的に計算しつつステップ(m7)を行なうこととすれば,記憶装置内にN(v)の値を保持する必要はない。
【0092】
■本発明の方法を実現する装置
本発明は,前記方法を実行するための装置も提供する。図8に,装置の構成の一例を示す。該装置は,主記憶806に上記方法を実行するプログラム805を格納し,さらにsuffix tree T 808や入力文字列を格納する。プログラム805は,中央演算装置801により実行される。計算結果は,ディスプレイ802を通じて表示されるか,補助記憶装置807に格納されるか,またはそれら両方の処理が行なわれる。ユーザからの入力はキーボード803およびポインティングデバイス804を用いて行なわれる。
【0093】
本発明の方法で得られたUEBを表示する場合,見易さや解析の容易さの観点から,図1の例のように,UEBを入力文字列そのものまたは該入力文字列を象徴的に示す線分や矩形101上の,UEBである部分文字列に相当する位置102に,色を変えたり文字や記号で示すなど視覚的に見やすい方法で表示することが好ましい。また,入力文字列をそのものまたは該入力文字列を象徴的に示す線分や矩形101とともに表示するか否かに関わらず,UEBの入力文字列上の位置103を表示してもよい。また,同じ入力文字列に由来するUEBを表示する際には,各UEBの開始位置の昇順とすることが好ましい。昇順の表示は,各入力文字列iについて変数jを,0から,入力文字列iの長さから1を減じた値まで増加させ,Tv[i,j]が「UEBである」と印がついたノードvへのポインタであったとき,p(v)のprefixで長さがUEBlength(v)であるUEBを表示することで,容易に実現できる。UEBを補助記憶装置807に格納する際にも,同じ入力文字列から得られたUEBをともに格納する場合には,上記の表示方法で開始位置の昇順の表示を得たのと同様の方法で,UEBの開始位置の昇順を得てその順に格納することが好ましい。また,UEBを表示する場合には,複数の入力文字列に存在するUEBが同一であるとわかるように,色や記号,文字,線104などを用いて判断できるように表示することが好ましい。また,補助記憶装置に807に記録する際も,複数のUEBが同一であると識別可能なように番号あるいはUEBごとに一意である数値または文字列を同時に記録することが好ましい。
【0094】
■計算機実験による,本発明の方法のエクソン抽出能力の検証
本発明の方法を実装したシステムを作成し,本発明の方法で塩基配列のスプライシングパターンを解析できることを実証した。以下では,uの値を15とした場合の結果について述べる。
【0095】
はじめに,乱数を用いて,長さが30文字の次の4つの塩基配列s1,s2,s3,s4を用意した。そして,これらを組み合わせ,長さが90の4つの入力文字列s1s2s3,s1s2s4,s1s3s4,s2s3s4を作成し,本発明の方法を実装したソフトウェアを用いて,これらがs1,s2,s3,s4の組み合わせであることを認識できるか試みた。パラメータuの値は,15とした。なお,ここで用いたs1,s2,s3,s4は以下の配列である。
s1= TTCAACAAAGACGGAAGTGTCCTAAATAGG
s2= GTGCTGACAGTGCTGTTAGAACTACAGGCT
s3= GAAGAAAGGTAACGCATATAGTGCGACGAA
s4= GGTGGCATGCCATGGACGCATACTCCGTAA
【0096】
処理の結果,図1に示す4つのUEB(エクソン1,エクソン2,エクソン3,エクソン4)が得られた。この結果より,s1は,エクソン1として抽出されたが,s2,s3,s4はそれぞれ先頭の1塩基が欠けた配列として抽出された。この原因は,s2,s3,s4がいずれもGで始まるため,s1およびs2の末尾にGを加えた配列がMUMとなり,s2,s3,s4の先頭が1塩基削られた配列が右UEB−holderとなったためである。このように,末尾での配列の偶然の一致により,UEBは実際のエクソンより短くなる場合がありうる。しかし,完全に一致していないとはいえ,エクソン2,エクソン3,エクソン4はそれぞれs2,s3,s4にほぼ一致した。つまり,本発明の方法により,入力文字列が長さ30塩基程度の4つの配列の組み合わせであると認識することができた。
【0097】
次に,本発明の方法を実装したシステムを用いて,米国公共機関NCBIの遺伝子データベースに登録されているスプライシングバリアント配列からUEBを抽出し,得られたスプライシングパターンを該遺伝子データベースの記述と比較する実験を行なった。使用したのはヒトのウィルムス腫瘍遺伝子WT1の配列で,アクセッション番号がNM_004906, NM_152857, NM_152858の3つの配列である。データベースには,NM_152857の576番塩基以降とNM_152858の675番塩基以降の配列が選択的3’端配列であることと,NM_152857に選択的5’端配列が存在することが記載されている。この3配列に対し,本発明の方法を実装したシステムを適用した結果は,図9の通りである。データベース記載されていたNM_152857, NM_152858の選択的3’配列は,開始位置を含めて正確にUEB5として認識された。さらに,NM_152857の選択的5’端配列に関しては,データベースに位置の記述はなかったが,先頭から115番目の塩基までの配列が選択的5’端配列であり,NM_004906, NM_152858の先頭から213番目の塩基までの5’端配列に置き換わっていることがわかった。配列末尾のpoly−A部分がUEB6として認識されたが,UEBがエクソンでなくpoly−A配列であることは,poly−A配列が入力配列の末尾にあること,配列中のアデニン(A)の割合が極めて高いことから容易に判定できる。
【0098】
なお,ウィルムス腫瘍遺伝子の配列について,本システムが認識したスプライシングパターンは,Altschul, S.F. et al., Nucleic Acid Research, 25:3389−3402, 1997 の方法で,3つの配列の関係をペアワイズに比較した結果と,数塩基の差異を除き矛盾しないことを確認した。入力配列の総塩基数は5,529bpで,計算時間はCPUのクロック周波数が1.7GHzであるパーソナルコンピュータを用いて0.1秒程度であった。
【0099】
■本発明の方法の,cDNA配列以外への適用
本発明は,mRNA配列のスプライシングパターン解析を目的としているが,比較ゲノム解析にも応用が可能である。入力文字列をmRNA配列の代わりにゲノム配列とし,得られたUEBがゲノム内の保存領域と解釈すれば,本発明の方法により,ゲノム配列の保存領域の位置と,複数のゲノム配列中の保存領域の対応関係が明らかにでき,比較ゲノム解析の有力な手段となる。
【0100】
この他,文字列に使用される文字の種類が有限であれば,本発明の方法は塩基配列に依存せず一般の文字列を処理することができるため,アミノ酸配列のような塩基配列以外の配列や文字列に対しても,そのまま適用可能である。
【0101】
【発明の効果】
本発明によれば,ESTのような生体高分子配列から,エクソン配列が満たすべき条件を用いて構築されたエクソン配列のモデルで定義された配列を,与えられた配列長の総和の線形時間で抽出することができる。
【図面の簡単な説明】
【図1】4つのエクソンの組み合わせになっている4つの入力配列を,本発明の方法により解析した結果を表示した例を示す図。
【図2】ゲノム上の遺伝子の,発現およびスプライシングの説明図。
【図3】入力文字列,右MUM,MUM,右UEB−holder,UEBの説明図。
【図4】Suffix treeの説明図。
【図5】本発明の方法における,処理全体のフローチャート。
【図6】MUMの総数がNのオーダー,それぞれのMUMの出現回数の総和がNの3/2乗のオーダーとなる入力文字列集合の,n=5の例を示す図。
【図7】図5中,ステップS505の右UEB−holder抽出,および,ステップS506のUEB抽出方法の説明図。
【図8】本発明の方法を実現する装置の一例の説明図。
【図9】本発明の方法により,ウィルムス腫瘍遺伝子のスプライシングバリアントからエクソン配列を抽出した結果を表示した例を示す図。
【図10】条件(E1)−(E6)より条件(A6)が導かれることの説明において検討する文字列e,e’,s,s’,h,m’の関係を説明する図。
【図11】条件(A1)−(A6)より条件(E1)が導かれることの説明において,aeと左で重なるMUMが存在しないことを説明するために定義された文字列m,tと,a,e,sの関係を表した図。
【図12】条件(A1)−(A6)より条件(E1)が導かれることの説明において,aeと右で重なるMUMが存在しないことを説明するために定義された文字列mと,a,e,sの関係を表した図。
【図13】条件(A1)−(A6)より条件(E1)が導かれることの説明において,aeの真の部分文字列であるMUMが存在しないことを説明するために定義された文字列m,t,t’と,a,eの関係を表した図。
【図14】条件(E1)−(E3)を満足する文字列eが(E7)を満足することの説明において,e,s,s’,s’’,a,a’,h,h’の関係を表した図。なお,h’のうち,入力文字列1401上にあるのは,esに一致するprefixの部分だけである。
【図15】文字列s,s’が重なることの定義を説明する図。
【符号の説明】
101: 入力文字列を象徴的に示す矩形
102: 101上で,UEBである部分文字列に相当する位置
103: UEBの入力文字列上の位置
104: 複数の入力文字列上にあるUEBが同一であることを象徴的に示す線
201: ゲノムDNA
202: ゲノム上の遺伝子
203: mRNA前駆体
204: スプライシングの過程を象徴的に表す矢印
205: イントロン
206: エクソン
207: mRNA
208: 207でスプライシングの過程で除去されずに残ったエクソンの1つ209: mRNA 207 のスプライシングバリアントの1つ
210: mRNA 207で除去されたが,mRNA 209で残ったエクソン
301: 入力文字列の例
302: 301の入力文字列集合に対する右MUMを列挙したもの
303: 301の入力文字列集合に対するMUMを列挙したもの
304: 301の入力文字列集合に対する右UEB−holderを列挙したもの
305: 301の入力文字列集合に対するUEBを列挙したもの
401: 文字列ATATGとTTAGTAから構築されたsuffix tree
402: Suffix tree 401のルートノード
403: Suffix tree 401のリーフの1つ(「i, j」と書かれているリーフは,文字列iのj番目から始まるsuffixに対応)
404: Suffix tree 401のエッジの1つ
405: Suffix tree 401のエッジのラベルの1つ
406: Suffix tree 401のエッジの空文字列であるラベル
407: Suffix tree 401のノードの1つ
408: Suffix tree 401のルートノード402からノード407にいたるパス
409: Suffix tree 401のsuffix linkの1つ
601: MUMの総数がNのオーダー,それぞれのMUMの出現回数の総和がNの3/2乗のオーダーとなる入力文字列集合の,n=5の例
602: 入力配列集合601のMUMの1つ(t(3,1))
701: 2次元配列Headの,入力文字列3についての要素を取り出したもの
702: 2次元配列Tailの,入力文字列3についての要素を取り出したもの
703: UEB抽出方法において用いられる変数cのステップ(e2b)での値
801: 本発明の装置の中央演算装置
802: 本発明の装置のディスプレイ
803: 本発明の装置のキーボード
804: 本発明の装置のポインティングデバイス
805: 本発明の方法を実行するためのプログラム
806: 本発明の装置の主記憶装置
807: 本発明の装置の補助記憶装置
808: 本発明の装置の主記憶装置に記録されたsuffix tree T
1001: ある入力文字列を象徴的に表す線分
1101: ある入力文字列を象徴的に表す線分
1201: ある入力文字列を象徴的に表す線分
1301: ある入力文字列を象徴的に表す線分
1401: ある入力文字列を象徴的に表す線分
1501: ある入力文字列を象徴的に表す線分
【発明の属する技術分野】
本発明は,複数の文字列,特に生体高分子配列に共通に存在する部分文字列を抽出するための文字列解析方法に関し,生体高分子配列のスプライシングパターン解析方法に適用して好適な方法に関する。
【0002】
【従来の技術】
国際共同プロジェクト及び米国ベンチャー企業により,2000年6月にヒトゲノムの文字配列決定の完了が宣言された。ゲノム配列の解析が進む一方で,発現している遺伝子について調べるために,mRNAの解析が行なわれている。mRNAは,遺伝子が発現する際,ゲノムDNAから生成されるRNA分子で,遺伝子の機能発現の過程で不可欠な物質である。mRNA分子は分解しやすいため,逆転写によりmRNAよりも安定な物質であるcDNAに転換し解析されることが多い。cDNAのシングルパス配列決定で得られた配列は,ESTと呼ばれる。ESTには様々な利用価値があるが,そのひとつが,遺伝子がどのようなエクソンにより構成されているかを明らかにすることである。
【0003】
図2は,ゲノム配列201上の遺伝子202と,mRNA 207との関係を説明する図である。遺伝子が発現する際,ゲノム配列上の該遺伝子202が転写されmRNA前駆体203が作られる。矢印204で象徴的に示すスプライシングと呼ばれる過程を経てmRNA前駆体203のイントロン205が除去されてエクソン206のみから成るmRNA 207が構成される。生体内では,このmRNA 207に基づき,タンパク質が合成される。
【0004】
スプライシングの過程で,同一エクソンが常に同じように残されるとは限らない。図2に示したように,同一遺伝子由来のmRNAであっても,あるmRNA207で残されたエクソン208が,別のmRNA 209では除去されることがあり,逆に,あるmRNA 207で除去されたエクソン210が別のmRNA209では残される場合もある。mRNA 207とmRNA 209のように,同一遺伝子由来のmRNAで,スプライシングを受ける領域が異なるものを,互いにスプライシングバリアントであると言う。ヒトの場合,生体内のタンパク質は10万種類以上存在するといわれる一方,遺伝子数は3万〜4万のみといわれており,スプライシングバリアントがこの差を埋めていると考えられている。こうしたスプライシングバリアントの解析は,遺伝子の機能発現を解析するにあたり不可避であり,生命現象の解明や,ゲノム創薬のために不可欠である。
【0005】
同一遺伝子に由来するあらゆるスプライシングバリアントの配列を網羅する十分な量のESTを収集し解析することは,mRNAのエクソン構造を明らかにする有力な手段となる。ESTなど転写産物由来の配列のみに基づきスプライシングバリアントの解析を行なうためには,複数の配列から個々のエクソンに相当する部分配列をいかにして抽出するかが課題となる。ところが,与えられた配列データのあらゆる部分配列を網羅的に列挙し,エクソン配列か否かを調べるアプローチは,各入力配列に対してその配列長の2乗のオーダーの部分配列が存在し,複数の入力配列間でそれらの比較を行なうと,与えられた配列の文字の総数をさらに乗じたオーダーの計算時間が必要となる。従って,処理すべきデータ量が増加すると,処理に必要な時間が急激に増加し,実用的なシステムを作ることは困難である。その一方で,米国公共機関のデータベースに蓄積されているESTのデータ量は,配列決定技術の進歩に伴い急速に増大しつつあり,ヒトだけで450万配列を超えている。こうした膨大な配列データを解析するために,高速な計算方法が必要である。
【0006】
Altschul, S.F. et al., Nucleic Acid Research, 25:3389−3402, 1997のホモロジー検索の方法はESTの解析にも使われている。もし,EST以外にゲノム配列も利用可能ならば,ゲノム配列の部分文字列で, ESTにも存在する部分文字列がエクソンであると,高い精度で予想することができる。ただし,対応するゲノム配列が無いESTを解析する場合に,ホモロジー検索の方法を使って転写産物由来配列間の相互の関係を調べようとすれば,最悪の場合配列数の2乗のオーダーの計算が必要となり,配列数が増加するとエクソン構造を予想することは容易ではない。しかも,Altschulらの方法ではショートエクソンを捕らえられない場合がある。
【0007】
複数の配列に共通する部分配列の抽出を効率よく行なう手法として,Delcher et al., Nucleic Acids Research, 1999, 27(11):2369−2376の方法が知られている。Delcherらの手法は,主に2つの近縁種のゲノムを比較することを目的としている。この手法では,まず次の(D1)−(D4)の条件を満足するMUM(Maximal Unique Match)と呼ばれる部分配列を探索する。
(D1) MUMは,長さがユーザに指定されたパラメータ以上の配列長をもつ部分配列である。
(D2) MUMは,2つの配列の,共通の部分配列である。
(D3) MUMは,2つのそれぞれの配列内に,1つしか含まれない。
(D4) MUMは,別のMUMの部分配列にならない。すなわち,前記(D1)−(D3)を満足する配列を,可能な限り延長して得られた配列のみがMUMである。
【0008】
Delcherらの方法をESTに適用し,MUMとしてアラインされる部分や大きな挿入や欠失が入る位置を同定すれば,MUMはエクソン配列に対応し,大きな挿入や欠失は,選択的なエクソンに対応すると考えることができ,エクソン構造を同定するためのツールとして使うことができる。しかし,Delcherらの方法は2配列のみを対象としており,配列数が3つ以上になったときには適用することができない。
【0009】
3つ以上の文字列から共通する部分配列を抽出する方法としては,文字列処理に広く応用されているデータ構造であるsuffix treeを活用したGusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York のchapter 9に記載の,longest common substring problemに対する線形時間解法が知られている。この方法を用いると,任意の数の文字列について,指定された数以上の文字列に共通の部分文字列の中でもっとも長い部分文字列を,文字総数の線形時間で抽出することができる。ただし,複数のエクソンを連結した文字列や,互いに重なっている文字列を抽出してしまう場合があり,この方法で抽出した配列がそのままエクソンに相当する配列と考えることはできない。
【0010】
【発明が解決しようとする課題】
本発明は,転写産物由来の複数の配列に基づき,これらの配列に含まれるエクソン配列を抽出することを目的としている。
【0011】
転写産物由来の配列だけに基づき,個々のエクソンの配列を完全に同定できれば理想だが,現実にはそれが常に可能なわけではない。ある遺伝子が4つのエクソンA,B,C,Dを持ち,それらのエクソンはこの順序でゲノム上に並んでいるとする。仮に,BとCがスプライシングの過程を経て常に同時にmRNAに現れるならば,ESTだけを見ている限り,B,Cという2つの別のエクソンがあることや,EST上のどこにB,Cの境界があるかを知ることは不可能である。そこで本発明では,ゲノム上の隣り合うエクソンで常に共存するものは,同一のエクソンとみなす。このほか,エクソンBが直後にCかDを必ず伴うとし,CとDには必ずBが先行する場合を考える。CとDの先頭の配列が一致するならば,B,C,Dというエクソンの存在を知ることができても,どこがB,C,Dの境界なのかを知ることはできない。そこで本発明では,確実に同一のエクソンに由来すると考えられる,エクソンの部分配列を抽出する。また,本発明では,1つの遺伝子には同一配列のエクソンは存在しないと仮定し,1配列に高々1回しか現れない部分配列のみを処理対象とする。さらに,例えば数文字程度の,長さが極端に短い部分配列は入力配列上のいたるところに現れるが,それらはエクソン配列と見なすべきでなく,エクソンはある程度以上長い部分配列であるべきである。本発明では,エクソン配列に関する上記の性質を踏まえ,エクソン配列のモデルであるUEB(Unique Exon Block)(図3の文字列305参照)を定義し,UEBを抽出することを目指す。
【0012】
ところで,次の条件を満たす文字列mは,複数のエクソン配列を連結した文字列になっている可能性がある。
(M1) 1つ以上の文字列の部分文字列である。
(M2) 長さu以上。ただし,uとは最も短いエクソンの長さで,パラメータとして与えられる整数である。
(M3) 各入力文字列に,高々1回しか出現しない。
(M4) ある文字列sが出現する入力文字列の集合をP(s)とする。このとき,任意の文字aに対してP(m)≠P(ma)である。ここに,maは文字列mの末尾に文字aを付加した文字列である。
(M5) 任意の文字aに対してP(m)≠P(am)である。ここに,amは文字列mの先頭に文字aを付加した文字列である。
【0013】
なお,(M1)−(M5)を満たす文字列は,Delcherらの方法におけるMUMの概念を,2配列以外の場合でも適用可能なように拡張したものである。本明細書ではこれ以降,(M1)−(M5)を満たす文字列をMUM(図3の文字列303参照)と呼ぶ。
【0014】
UEB 305は,MUM 303を部分文字列として完全に含んでいたり,重なっていたりしない文字列であるべきである。UEB 305を正確に定義するために,「文字列が重なる」とはどういうことか,正確に定義する必要がある。本明細書では,図15に示したように,次の4つの条件を満足する文字列t,t’,t’’が存在するときに,かつそのときに限り,「文字列s,s’が重なる」という。
(1) t,t’,t’’は,長さが1以上の文字列である。
(2) s=tt’,すなわち,sはtとt’を連結した文字列である。
(3) s’=t’t’’,すなわち,s’はt’とt’’を連結した文字列である。
(4) ある入力文字列が,tt’t’’を部分文字列として含む。
【0015】
なお,(1)−(4)が満足されるとき,「sはs’と右で重なる」,「s’はsと左で重なる」という。これらの概念を用いて,UEBを次の条件を満たす文字列と定義する。
(A1) 少なくとも1つの入力文字列の部分文字列。
(A2) 長さu以上。
(A3) 各入力文字列に,高々1回しか出現しない。
(A4) MUMと重ならない。
(A5) MUMを真の部分文字列としない。なお,ある文字列の真の部分文字列とは,その文字列自身を除く部分文字列のことである。
(A6) (A1)−(A5)を満たす文字列の,真の部分文字列にならない。
巨大なデータを効率よく処理するためには,処理時間を入力文字列の文字数の総数に関し線形時間に抑えることが望ましい。
【0016】
以上を踏まえ,本発明の課題は,複数の生体高分子配列に相当する文字列が与えられたときに,(A1)−(A6)を満足する文字列すなわちUEBを,与えられた入力文字列の総文字数の線形時間で抽出する方法を提供することである。
【0017】
【課題を解決するための手段】
本発明では,入力として複数の文字列301が与えられたとき,後述の右MUM 302,後述の左MUMまたはMUM 303,後述の右UEB−holder 304を順次抽出し,それらを利用してUEB 305を抽出する。
【0018】
なお,左MUMの抽出(ステップS503)と,MUMの抽出(ステップS504)は,どちらか片方だけを行なえばよい。ステップS503により左MUMを使う方法はわかりやすく実装の手間もそれほどではないが,計算機の主記憶を多く使用する問題がある。一方,ステップS504によりMUMを抽出する方法は,実装の手間が若干かかるものの,消費する計算機の主記憶が少なく,速度も速いと予想される。
以下,本発明の特徴を述べる。
【0019】
本発明の方法は,複数の入力文字列が与えられたときに,UEBを抽出する方法であって,入力文字列の文字数の総和に対し線形時間で処理を完了できる。
本発明の方法は,UEBを抽出するために,右MUMを抽出する工程と,MUMを抽出する工程または前述の左MUMを抽出する工程と,右UEB−holderを抽出する工程とを有し,それぞれの工程で,入力文字列を格納したsuffix treeを用いることを特徴とする。
【0020】
本発明の方法はまた,MUMを抽出する工程において,右MUMを抽出しその中からMUMの条件を満足する部分文字列を選択し,抽出することを特徴とする。
本発明の方法はまた,MUMを抽出する工程において,suffix tree内のノードについて,そのノードを参照するsuffix linkの数を数えることを特徴とする。
本発明の方法はまた,右UEB−holderを抽出する工程を有することを特徴とする。
【0021】
本発明の方法はまた,右UEB−holderを抽出する工程において,入力文字列上のMUMの位置を解析するために,他の右MUMを真のsuffixとしない右MUMの位置のみを計算することを特徴とする。
本発明の方法はまた,右UEB−holderのprefixのみを,UEBの候補とみなすことを特徴とする。
【0022】
【発明の実施の形態】
以下,図面を参照して本発明の実施の形態について説明する。最初に,本明細書で使用する記号と用語及び概念を定義する。なお,本発明の方法は,塩基配列だけでなく,アミノ酸配列など他の種類の文字列に対しても適用可能である。そこで,以下では,配列を文字列と呼び,塩基を文字と呼ぶこととする。
【0023】
はじめに,すでに公知である概念について,本明細書で用いる記号および厳密な意味を定義する。
●空文字列
長さが0の文字列。本明細書では,以下,空文字列をεと表記する。
●文字列の連結
文字列s,tを連結した文字列をstと表記する。
●Prefix
ある文字列の部分文字列で,先頭がもとの文字列に一致するもの。
ある文字列tがt=psと書けるとき,pはtのprefixである。ここで,sは空文字列であってもよい。すなわち,tはt自身のprefixである。s≠εのとき,pをtの真のprefixと呼ぶ。
例えば,「A」,「AT」,「ATA」,「ATAT」,「ATATG」は文字列「ATATG」のprefixである。これらのうち「ATATG」以外は,真のprefixである。
【0024】
●Suffix
ある文字列の部分文字列で,末尾がもとの文字列に一致するもの。
ある文字列tがt=psと書けるとき,sはtのsuffixである。ここで,pは空文字列であってもよい。すなわち,tはt自身のsuffixである。p≠εのとき,sをtの真のsuffixと呼ぶ。
例えば,「G」,「TG」,「ATG」,「TATG」,「ATATG」は文字列「ATATG」のsuffixである。これらのうち「ATATG」以外は,真のsuffixである。
【0025】
●|s|
文字列sの長さ。
●|A|
集合Aの要素数。
●⊆,⊇,⊂,⊃
本明細書では,2つの集合A,Bについて,「A⊆B」とは,Aの全ての要素がBの要素であることを表し,「A⊇B」とはB⊆Aを表す。「A⊂B」とは,A⊆B かつA≠Bのことであり,「A⊃B」とはB⊂A を表す。
【0026】
●O(f(n))
g(n)=O(f(n)) であるとは,ある定数Cが存在して,十分大きなnに対しg(n)≦Cf(n)が成立することである。また,ある量が「O(f(n))である」とは,その量がnのある関数g(n)以下であり,g(n)=O(f(n))であることを意味する。このような表記法は,big−O notationと呼ばれている。
【0027】
●Suffix tree
文字列P1,P2,…,Pnのsuffix tree とは,P1,…,Pnに現れる全てのsuffix を格納したtree状のデータ構造で,以下の性質をもつ。なお,2つの文字列「ATATG」,「TTAGTA」を格納したsuffix tree 401を図4に図示した。
(S1) ルートノード402を持つ有向木である。
(S2) P1, …, Pn の文字列長の総和に等しい数のリーフ403を持つ。それらのリーフには,文字列番号と文字列中の位置が,互いに重複しないように割り当てられる。
(S3) それぞれのエッジ404には,P1,..., Pnのうち,どれか1つの文字列の部分文字列がラベル405として付加されている。さらに,リーフに直接至るエッジ以外のラベルは,空文字列406であってはならない。なお本明細書では,文字列iのj番目の文字で始まるsuffixに対応するリーフを,以下ではリーフ(i,j)と呼ぶ。また,本明細書では,文字列の先頭の文字を0番目と数える。
(S4) 任意のノード407を起点とするエッジに,同じ文字で始まるラベル405を持つエッジのペアは存在しない。
(S5) ルートノード402から文字列番号iと文字列中の位置jが割り当てられたリーフ403へのパス上にあるエッジのラベルを,このパス上で出会う順に連結すると,文字列iのj番目の文字で始まるsuffixとなる。
(S6) 任意のノードvを起点として伸びるエッジの数は1でない。
なお本明細書では,文字列iのj番目の文字で始まるsuffixに対応するリーフ403を,以下ではリーフ(i,j)と呼ぶ。
Suffix treeに格納されている文字列の文字数の合計をnとするとき,リーフ403の数がnなので,リーフ以外のノードの数はn−1個以下である。したがって,suffix treeのノード数は2n−1個以下で,O(n)である。
【0028】
●パスラベル
Suffix tree中のノード407のパスラベルとは,ルートノード402からこのノード407にいたるパス408上のエッジのラベルを,連結して得られる文字列である。本明細書では,「パスラベルがsのノード」と言った場合には,パスラベルがsで,かつルートノード402からそのノード407までのパス上に空文字列406をラベルとするエッジが存在しないノードを表すこととする。
【0029】
●Suffix link
ノードvのパスラベルが,ある文字aとある文字列sによりasと表現できるとき,パスラベルをsとするノードへのポインタをsuffix linkと呼ぶ。本明細書では,ノードvのsuffix linkを,該ノードvに直接至るエッジのラベルがεでない場合に定義し,suffixlink(v)と表記する。ノードvのパスラベルがasならば,suffixlink(v)が指し示すべきノード,すなわち文字列sをパスラベルとするノードは必ず存在することが知られている(Gusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York, chapter 6)。図4の409は,suffix linkの例である。なお,誤解を招く恐れのないときは,「suffixlink(v)」という表記を,suffixlink(v)が指すノードと同一視する場合がある。
次に,本明細書で特に用いる記号・用語および,本発明の新規な概念について,以下で定義する。
【0030】
●入力文字列(図3の301参照)
本発明の方法に入力として与えられる,塩基配列やアミノ酸配列などの,生体高分子配列。
●N
本発明の方法を適用すべき入力文字列の文字数の総和。
●u
本発明の方法に与えられるパラメータで,エクソン配列と考えられる最も短い文字列の長さを指定する整数である。
●p(v)
ノードvのパスラベル。
●v(s)
パスラベルが文字列sのノード。
●P(s)
文字列sを部分文字列として含む入力文字列の集合。なお,文字列sが文字列s’の部分文字列ならば,P(s)⊇P(s’)が成り立つ。
【0031】
●MUM(図3の303参照)
上述の条件(M1)−(M5)を満たす文字列。
●UEB(図3の305参照)
上述の条件(A1)−(A6)を満たす文字列。
●右MUM(図3の302参照)
右MUMとは,次の条件(R1)−(R4)を満たす文字列である。
(R1) 1つ以上の入力文字列の部分文字列である。
(R2) 長さはu以上である。
(R3) 各入力文字列には,高々1回しか出現しない。
(R4) 右MUM rは,任意の文字aに対してP(r)≠P(ra)を満たす。すなわち,右MUMは,この右MUMを部分文字列として共有するすべての入力文字列を維持したまま右側へ延長することはできない。
【0032】
なお,任意の右MUM rに対し,P(sr)=P(r)を満たす空文字列かも知れない最長の文字列sをとることができ,srは(M1)−(M5)を満たすので,MUMである。したがって,次の性質(R5)が成り立つ。
(R5) 任意の右MUM rについて,rをsuffixとするMUM mで,P(m)=P(r)を満たすものが存在する。
【0033】
また,右MUM rがあるMUM mのprefixであると仮定する。このとき,任意の文字aについてP(am)≠P(m)よりP(am)⊂P(m)だから,P(m)の入力文字列のうち,少なくとも1つの入力文字列iはP(am)に属さない。rは,mを含む入力文字列にはmのprefixとしてしか現れないから,入力文字列i上のrの左には文字aがないため,P(ar)に属さない。しかし,i∈P(m)⊆P(r)。したがって,P(ar)≠P(r)であり,rは(M5)を満たす。つまり,右MUMについて,次の性質(R6)が成り立つ。
(R6) MUMのprefixである右MUMは,MUMである。
【0034】
●左MUM
左MUMとは,次の条件(L1)−(L4)を満たす文字列である。
(L1) 1つ以上の入力文字列の部分文字列である。
(L2) 長さはu以上である。
(L3) 各入力文字列には,高々1回しか出現しない。
(L4) 左MUM lは,任意の文字aに対してP(l)≠P(al) を満たす。すなわち,左MUMは,この左MUMを部分文字列として共有するすべての文字列を維持したまま左側へ延長することはできない。
【0035】
●右UEB−holder(図3の304参照)
右UEB−holderとは,次の条件(H1)−(H3)を満たす文字列である。
(H1) 右MUMである。
(H2) 次の(H2a),(H2b)のうち,どちらかの条件を満たす。
(H2a) MUMである。
(H2b) あるMUM mが存在し,mhが少なくとも1つの入力文字列の部分文字列となるような,文字列hである。
(H3) 右MUMを真のprefixとして持たない。
【0036】
上述したように,本発明では右MUM,左MUM又はMUM,右UEB−holderを順次抽出し,それらを利用してUEBを抽出する。図5は,本発明による処理の全体を示すフローチャートである。以下では,図5を参照して,右MUM,左MUM,MUM,右UEB−holder,UEBを抽出する方法を説明する。
【0037】
■Suffix tree Tの構築(ステップS501)
本発明の方法では,まず,入力文字列に基づきsuffix tree Tを構築する。Suffix tree T は,Ukkonen のアルゴリズム(Gusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York, chapter 6)を用いて,O(N)で,全suffix linkを設定する工程を含めて構築可能である。
【0038】
本発明の方法は,こののち,suffix tree T上の深さ優先探査を繰り返し実行する。以下の説明では特に断らない限り,suffix tree T上の深さ優先探査において,ラベルが空文字列であるエッジとそのエッジが指し示すリーフを無視する。
【0039】
■右MUMの抽出(ステップS502)
本発明の方法は,右MUMを以下の(r1)−(r3)の方法により抽出する。
(r1) Suffix tree Tを用いて,Gusfield, D., Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology. Cambridge University Press, New York, chapter 9記載の方法により,suffix tree Tの任意のノードvの部分木に同一の入力文字列由来のリーフが存在するとき,かつそのときに限り,ノードvの部分木の少なくとも1つのノードv’について,h(v’)>0となるように,h(v)の値を設定可能である。この(r1)のステップはO(N)で完了できることが知られている。
(r2) suffix tree Tの任意のノードvについて,変数d(v)を設け,suffix tree Tを深さ優先探査する。この深さ優先探査では,ラベルが空文字列であるエッジと,そのエッジの指し示すリーフも探査する。探査の過程で遭遇したノードvがリーフか否かにより,(r2a)または(r2b)の処理を行なう。
(r2a)ノードvがリーフのとき,1を報告する。もし,ノードvに至るエッジのラベルが空文字列でなければ,d(v)を1にセットする。
(r2b)ノードvがリーフでないときは,まず部分木それぞれの深さ優先探査を行なう。少なくとも1つの部分木の深さ優先探査で−1との報告があった場合およびh(v)≠0の場合は,d(v)=0とし−1を報告する。これ以外の場合,部分木の探査で報告されたそれぞれの部分木のリーフ数の和をd(v)にセットし,セットした値を報告する。
(r3) suffix tree Tを再び深さ優先探査し,次の(r3a)および(r3b)を満足するノードvに出会ったとき,そのノードに「右MUMである」との印をつける。なお,(r3a)の条件を満たすか否か判定するために必要なパスラベル長は,探査の際にルートノードからvまでのパス上のエッジ長の和を保持することで,各ノードごとに定数時間で計算できる。なお,(r3)の深さ優先探査では,ラベルが空文字列であるエッジと,そのエッジの指し示すリーフは無視する。
(r3a)パスラベルの長さがu以上
(r3b)d(v)>0
(r1)−(r3)の処理が完了した時点で,「右MUMである」と印がついたノードのパスラベルは右MUMであり,かつそれらだけが右MUMである。その理由を述べる。
【0040】
まず,(r1)によって,ノードvの部分木に同一の入力文字列由来のリーフが存在するとき,かつそのときに限り,ノードvの部分木の少なくとも1つのノードv’について,h(v’)>0となるように,h(v)の値が設定される。したがって,(r2)において,各ノードvの変数d(v)は,以下の条件(d1)および(d2)を満足するように設定される。
(d1)ノードvのパスラベルp(v)が,2回以上出現する入力文字列が存在するときはd(v)=0。
(d2)ノードvのパスラベルp(v)が,任意の入力文字列に高々1回しか出現しない場合には,d(v)≠0。
【0041】
d(v)の値が(d1)と(d2)を満足することを踏まえ,本発明の方法で「右MUMである」と印がついたノードのパスラベルが,右MUMの条件(R1)−(R4)を満足することを示す。
(R1)について:
suffix tree T の任意のノードのパスラベルは,少なくとも1つの入力文字列のsuffixのprefixである。つまり,少なくとも1つの文字列の部分文字列である。したがって,(R1)は満たされる。
(R2)について:
本発明の方法で「右MUMである」と印がつくノードは,長さu以上のパスラベルを持つノードだけである。したがって,(R2)も満たされる。
(R3)について:
d(v)>0なるノードだけに「右MUM」であるとの印がつく。d(v)の性質より,これらのノードvのパスラベルは,各入力文字列中に高々1回しか出現しない。したがって,(R3)も満たされる。
(R4)について:
「右MUM」であるとの印がついたノードvのパスラベルp(v)について,どのように文字aを選んでも,ある入力文字列i∈P(v)が存在し,その入力文字列iはp(v)aを部分文字列として持たない。もし,そのような入力文字列iが存在しないなら,vから出るエッジはすべてaで始まるため,suffix treeの条件(S4)に反するからである。したがって,p(v)は(R4)を満足する。
さらに,本発明の方法で右MUMの印がついたノードのパスラベルの文字列でなければ,(R1)−(R4)のどれかの条件を満足しないことを示す。
【0042】
まず,suffix tree Tのパスラベルのprefixとして現れない文字列は,どの入力文字列の部分文字列でもないから,(R1)に反する。
次に,ノードのパスラベルのprefixとなっている文字列rに,対応するノードv(r)が存在しないと仮定する。このとき,ある文字aについてP(r)=P(ra)である。なぜなら,こうした文字aが存在しないならば,rをsuffixとする入力文字列が存在するか,aでない文字bについてrbを含む入力文字列が存在することを意味し,どちらの場合もv(r)が存在しないとの仮定に反するからである。よって,P(r)=P(ra)なるaが存在するからrは(R4)を満足しない。
【0043】
さらに,本発明の方法は,パスラベルが長さu未満のノードには印をつけないが,これらのノードのパスラベルは(R2)を満足しない。しかも,本発明の方法はd(v)=0のノードには印をつけないが,それらは少なくとも1つの入力文字列に2回以上出現する部分文字列である。ゆえに,(R3)を満足しない。
【0044】
以上で検討した以外に,(r1)−(r3)の方法で「右MUMである」と印がつかないノードのパスラベル以外の文字列は存在しない。つまり(r1)−(r3)の方法ですべての右MUMに対して,対応するノードに過不足なく「右MUMである」と印をつけることができる。
【0045】
■左MUMの抽出(ステップS503)
ステップS501でsuffix tree Tを構築し,ステップS502で右MUMを抽出したのと同様の方法で,左MUMを抽出する。なお,ステップS504によりMUMを抽出する場合,左MUMを抽出するステップS503は行なわなくてもよい。
【0046】
ステップS503では,左MUMを抽出するために,すべての入力文字列を逆順に見た文字列について,suffix tree T’を構築する。例えば,入力文字列がATATGとTTAGTAの場合は,これらを逆順にして得られるGTATAとATGATTについて,suffix tree T’を構築する。そして,「suffix tree T」を「suffix tree T’」に,「右MUM」を「左MUM」に読み替えて(r1)−(r3)を実行する。この方法で,左MUMを過不足無く抽出できるのは,ステップS502で過不足なく右MUMが抽出されることから明らかである。
【0047】
■MUMの抽出(ステップS504)
MUMを抽出する方法について述べる。なお,ステップS503により左MUMの抽出を行なった場合,MUMを抽出するステップS504は行なわなくてもよい。
【0048】
全てのMUMは,(M1)−(M4)より(R1)−(R4)を満たし,右MUMである。右MUMのノードには既に上記の方法で「右MUMである」と印がついているので,MUMを抽出するためには(M5)を満足する右MUMをパスラベルとするノードの中から,MUMをパスラベルとするノードを選び「MUMである」と印をつければよい。
【0049】
最も単純な方法は,右MUMに対応する全てのノードvについて,vのパスラベルを部分文字列として含む入力文字列の集合すなわちP(p(v))を記録し,任意の文字aについてP(ap(v))≠P(p(v))か否か調べる方法である。ところが,この方法では計算時間をO(N)とできない。計算時間がO(N)を超える例を以下に示す。
【0050】
文字列t(n,k)を,長さがnでk番目の文字がA,それ以外の文字がTである文字列とし,入力文字列集合601が[t(n,k):0≦k≦n−1]である場合を考える。n=5の例を図6に示す。このとき,0≦k≦k’−1, 1≦k’≦nである任意のk,k’について,u=1とすれば,t(k’,k) 602は(M1)−(M5)を満たし,MUMになる。t(k’,k)は先頭と末尾のAの数の合計に等しい数の入力文字列を除き,すべての入力文字列上に存在するから,n−(k’−1)個の入力文字列上に存在する。この例の入力文字列集合601の総文字数はN=n^2であることを考慮すれば,MUMの総数は式(1)よりN/2より多く,全てのMUMについてP(p(v))を求めるだけで,Nに入力文字列数を乗じた数のオーダーの計算時間が必要とわかる。したがって,処理時間をO(N)に抑えることができない。
【0051】
【数1】
【0052】
本発明は,O(N)の処理時間で,(M5)を満たす右MUMと印のついたノードに,過不足無く「MUMである」と印をつける方法を提供する。まず,入力文字列のprefixになっているMUMのノードに,次の方法(m1)で「MUMである」と印をつける。
(m1) suffix tree Tを深さ優先探査し,ノードに出会ったら,以下の処理を行なう。この深さ優先探査は,ラベルがεのエッジおよびその先のリーフも探査の対象とする。
(m1a) そのノードvがリーフなら,そのリーフ(i,j)において,j=0のとき,trueを返す。このとき,vに右MUMの印がついているならば,vに「MUMである」と印をつける。p(v)がどの入力文字列のprefixでもなかったら,印をつけずにfalseを返す。なお,j=0のとき,リーフ(i,j)のパスラベルは入力文字列iに一致し,ルートノードからリーフ(i,j)に至るパス上の任意のノードのパスラベルは,入力文字列iのprefixである。
(m1b) そのノードvがリーフでなければ,先に全ての部分木の探査を行なう。1つでもtrueを返す部分木があり,vに右MUMの印がついているならば,vに「MUMである」と印をつけてtrueを返す。それ以外の場合,印をつけずにfalseを返す。右MUM rが,少なくとも1つの入力文字列のprefixとなっているならば(M5)を満足し,そのようなrには(m1)の方法で「MUMである」と過不足なく印がつく。
【0053】
次に,どの入力文字列のprefixでもない右MUMをパスラベルとするノードのうち,MUMをパスラベルとするノードに(m2)−(m7)の方法で印をつける。
(m2) suffix tree Tの全てのノードvについて,vに直接至るエッジのラベルがεでないときに,変数C(v), N(v)を用意し,0で初期化する。
(m3) 深さ優先探査で,出会ったノードvについて,変数C(suffixlink(v))に1を加える。
(m4) 再び深さ優先探査で,出会ったノードvについて,vに「右MUMである」と印があり,C(v)=0であれば,vに「MUMである」と印をつける。
(m5) 再び深さ優先探査で,出会ったノードvについて,そのノードをルートノードとする部分木のvを含む全ノードv’のC(v’)の値の合計値を求め,C(v)をその合計値にセットする。
(m6) 再び深さ優先探査で,出会ったノードvについて,そのノードをルートノードとする部分木のvを含む全ノードで該ノードに至るエッジのパスラベルがεでないものの数を求め,N(v)にセットする。
(m7) 再び深さ優先探査で,出会ったノードvについて,suffixlink(v)が右MUMへのポインタであり,N(v)≠C(suffixlink(v))ならば,suffixlink(v)の指し示すノードに「MUMである」との印をつける。
【0054】
(m4)で,MUMである右MUM rをパスラベルとするノードv(r)に「MUMである」と印がつけば,rはMUMであることを説明する。まず,rがある入力文字列のprefixならばrはC(v(r))の値に関わらずMUMである。どの入力文字列のprefixでもないrについて検討する。このとき,arが少なくとも1つの入力文字列の部分文字列であるように,文字aを選ぶことができる。P(ar)=P(ars)を満たす最長の文字列をsとする。このとき,arsは(R1)と(R4)を満たし,rを部分文字列とするから(R2)と(R3)も満たすので右MUMである。s=εと仮定すれば,v(ar)が存在してv(r)にsuffix linkを持ちC(v(r))≠0だから,(m4)でv(r)に印がつくことに矛盾するのでs≠εである。sの先頭の文字をbとする。rが右MUMだから,P(rb)≠P(r)。rが少なくとも1つの入力文字列のsuffixであるとすれば,rはどの入力文字列のprefixでもないから,rより1文字長いsuffixをパスラベルとするノードからv(r)にsuffixlinkがあるはずでC(v(r))≠0だから,(m4)でv(r)に印がつくことに矛盾。よって,bと異なる文字b’を,rb’が少なくとも1つの入力文字列の部分文字列となるように選べる。P(rb)⊇P(ars)=P(ar)であることと,rb’はrbを部分文字列とする入力文字列上には存在しないことから,rb’はarを部分文字列とする任意の入力文字列上に存在しない。しかし,rはどの入力のprefixでもないから,a’rb’が少なくとも1つの入力文字列の部分文字列になるようにaでない文字a’を選べる。したがって,右MUM rは,a≠a’より(M5)を満たし,MUMであることがわかる。
【0055】
(m7)で印がついたノードのパスラベルのうち,どの入力文字列のprefixでもない文字列もMUMであることを説明する。これ以降,N(v(ar)),C(v(r))は,(m1)−(m6)が完了し,(m7)のステップを実行するときの値とする。まず,ある文字列arをパスラベルとするノードv(ar)に関して,N(v(ar))=C(v(r))が成り立つときに,かつそのときに限り,P(ar)=P(r)であることを説明する。
【0056】
はじめに,P(ar)=P(r)が成り立つときN(v(ar))=C(v(r))である理由を述べる。まず,P(ar)=P(r)を仮定すると,N(v(ar))≧C(v(r))であることを説明する。v(r)の部分木の,あるノードwについて,C(w)がv(ar)の部分木にないノードw’からのsuffix linkにより(m3)において増えたとする。このとき,aでない文字bが存在しp(w’)=brs。一方,P(brs)に属する任意の入力文字列は,a≠bよりarを部分文字列として持たない。したがって,P(brs)⊆P(r)よりP(ar)≠P(r)であり,仮定に矛盾する。つまり,C(v(r))はv(ar)の部分木のノードからのsuffix link以外で増えることができないから,N(v(ar))≧C(v(r))。ところが,次に述べる理由により,N(v(ar))≦C(v(r))である。v(ar)の部分木の任意のノードwのパスラベルは,ある文字列sを用いてarsと書ける。このとき,suffixlink(w)はv(rs)を指しており,v(rs)は,v(r)の部分木のノードである。よって,N(v(ar))個あるv(ar)の部分木の任意のノード1つにつき,v(r)の部分木のどれか1つのノードw’についてC(w’)が(m3)のステップで1つ増える。C(v(r))は,(m5)が終了した時点でv(r)の部分木の全てのノードw’のC(w’)が(m3)で増やされた回数の総和に更新されるから,N(v(ar))≦C(v(r))になる。したがって,N(v(ar))=C(v(r))が成り立つ。
【0057】
次に,N(v(ar))=C(v(r))が成り立つときP(ar)=P(r)である理由を述べる。P(ar)⊆P(r)は明らか。P(r)に属しP(ar)に属さない入力文字列iの存在を仮定する。rはどの入力文字列のprefixでもないから,入力文字列i上ではrの左にaでない文字bが存在する。v(ar),v(br)をルートノードとする部分木の任意のノードは,v(r)をルートノードとする部分木のノードへのsuffix linkを持つから,C(v(r))≧N(v(ar))+N(v(br))が成り立つ。ところが,brは入力文字列i上の部分文字列だから,suffix tree Tにbrをパスラベルのprefixとするノードが少なくとも1つ存在する。よって,N(v(br))>0。したがって,C(v(r))>N(v(ar))。これはC(v(r))=N(v(ar))に矛盾する。ゆえに,P(r)に属しP(ar)に属さないような入力文字列iが存在すると仮定したのが誤りで,P(r)=P(ar)が成り立つとわかる。
【0058】
(m7)では,N(v)≠C(suffixlink(v))のとき,suffixlink(v)が指し示すノードwが右MUMをパスラベルとするなら,wに「MUMである」と印をつけている。r=p(w)とすれば,ある文字aが存在してarがvのパスラベルである。すなわち,(m7)ではN(v(ar))≠C(v(r))なる右MUMのノードv(r)にのみ印がつくが,rがどの入力文字列のprefixでもなければ,P(ar)≠P(r)よりrはMUMである。一方,rが少なくとも1つの入力文字列のprefixならば,rがMUMであることは自明。つまり,(m7)でもMUMをパスラベルとするノードにしか「MUMである」と印をつけないことがわかる。
【0059】
逆に,(m1)−(m7)の方法で印が付かないMUMは存在しないことを示す。まず,入力文字列のprefixであるMUMをパスラベルにもち,(m1)で印がつかないノードが存在しない。次に,どの入力文字列のprefixでもないMUM mについて考察する。このようなmをパスラベルとするノードv(m)を指し示すsuffix linkが存在しないときは,(m4)で印がつく。一方,ノードv(m)を指し示すsuffix linkが存在するときは,そのsuffix linkの起点となっているノードに(m7)の深さ優先探査で出会ったときにv(m)に「MUMである」と印がつく。以上の理由により,すべてのMUMに(m1)−(m7)の方法で「MUMである」と印がつく。
【0060】
■MUM末端位置の抽出(ステップS505)
ステップS502で抽出した右MUMの情報と,ステップS503で抽出した左MUMの情報またはステップS504で抽出したMUMの情報を用いて,ステップS505で2次元配列Head,Tailを以下のように設定する。なお,Head, Tailは,入力文字列iと該入力文字列の長さよりも小さな非負整数jに対して値を持つ。
Head[i,j] :
入力文字列iのj番目の塩基から始まる部分文字列に,MUMであるものが存在すれば1。それ以外の場合は0。(図7参照)
Tail[i,j] :
入力文字列iのj番目の塩基で終わる部分文字列に,MUMであるものが存在すれば1。それ以外の場合は0。(図7参照)
【0061】
まず,Tailの値を設定する方法について述べる。本発明の方法では,Tailの値を設定するにあたり,MUMの位置を直接計算する代わりに,他の右MUMをsuffixとして持たない右MUM rの位置を計算する。そのような任意のrについて,rが入力文字列iのj番目塩基を末尾とする部分文字列であるなら,Tail[i,j] 702に,1を書き込む。このような,他の右MUMをsuffixとしない右MUM r (以下,極小右MUMと呼ぶ)の終了位置の集合と,全てのMUMの終了位置の集合は等しい。その理由は,全ての右MUM rには(R5)よりrをsuffix としP(r)=P(m)であるMUM mが存在する一方,全てのMUM mは極小右MUM rをsuffixとして持ち,P(m)⊆P(r) が成り立つからである。以上を踏まえ,次の(t1)−(t4)の方法で,全ての右MUMの末端に対応するTail[i,j] 702を1に設定することができる。
(t1) suffix tree Tを,深さ優先探査し,「右MUMである」と印があるノードvについて,suffixlink(v)が指し示すノードが右MUMでないとき,vに「極小右MUM」と印を付ける。
(t2) 2次元配列Tail 701の全ての要素を0で初期化。
3_right_MUMを空リストで初期化する。
(t4) 再びsuffix tree Tを深さ優先探査し,出会ったノードvに対し(t4a),(t4b)の処理を行なう。この深さ優先探査では,ラベルがεであるエッジの終端にあるノードも含めて全ノードを探査する。
(t4a) vに「極小右MUMである」と印がついている場合には,リストminimal_right_MUMの末尾に,vのパスラベルの長さ|p(v)|を追加する。なお,リストminimal_right_MUMに追加した値は,ノードvをルートノードとする部分木の処理が終了した時点で削除する。この削除の操作は,単にminimal_right_MUMの末尾の要素を削除するだけで実現できる。
(t4b) vがリーフ(i,j)のとき,リストminimal_right_MUMの任意の要素kについて,Tail[i,j+k−1] 701を1に設定する。
【0062】
(t1)で,極小右MUMのノードに,過不足無く印がつく。よって,(t2)−(t4)で,入力文字列iのj番目の文字で終了する極小右MUMが存在するときに,かつそのときに限り,Tail[i,j]に1を書き込む。逆に,このようなi,j以外では,Tail[i,j]は1にならない。この方法で,同一のi,jに対し,2回以上Tail[i,j]が更新されることはないから,(t1)−(t4)はO(N)で完了できる。
【0063】
なお,極小右MUMの位置のみを計算するのではなく,全てのMUM mや右MUM rについて,それらが出現するすべての入力文字列iについてmやrの最後の文字がj番目の文字のときTail[i,j]に印をつける方法では,O(N)の処理時間では完了できない場合がある。ステップS504の説明で述べたときの入力文字列集合601が,その例となっている。0≦k≦k’−1, 1≦k’≦nである任意のk,k’について,t(k’,k) 602はMUMであり右MUMであるが,これらが入力文字列に出現する回数の総和は式(2)で表される。したがって,入力文字列iのj番目の文字で終了するような全てのi,jについてTail[i,j]=1とする処理のステップ数が,N^(3/2)のオーダーの計算時間を要する例が存在し,直接MUMや右MUMの位置を計算する方法では,O(N)の処理時間でTailの値を設定するのは不可能とわかる。
【0064】
【数2】
【0065】
次に,Head[i,j] 701を設定する方法を示す。まず,ステップS503で,左MUMの抽出が完了している場合に,Head[i,j] 701を設定する方法を示す。他の左MUMをprefixとしない左MUMを極小左MUMとする。Head[i,j]を設定するためには,suffix tree Tをsuffix tree T’,右MUMを左MUM,極小右MUMを極小左MUM,Tail[i,j+k−1]をHead[i,(入力文字列iの長さ)−1−(j+k−1)]と読み替えて,(t1)−(t4)を適用すればよい。この方法で2次元配列Headを正しく設定できることは,(t1)−(t4)がTailを正しく設定することから自明であり,O(N)の時間で処理を完了できる。
【0066】
一方,ステップS503ではなくステップS504を実行した場合には,suffix tree Tを深さ優先探査し,「MUMである」と印がついたノードvで,ルートノードからvに至るパス上に別の「MUMである」と印のついたノードが存在しないノードvを発見した場合,vの部分木内では,ラベルがεのエッジおよびそのエッジの先にあるリーフも対象とする深さ優先探査に変更し,出会った任意のリーフ(i,j)について,Head[i,j] 701を1に設定すればよい。この方法で,同一のi,jの組に対し,2回以上Head[i,j] 701が更新されることはないから,(t1)−(t4)はO(N)の処理時間で完了できる。ところで,この方法により他のMUM mを真のprefixとして持つMUM m’の位置は計算されないが,mはm’のprefixでありP(m)⊇P(m’)だから,m’が入力文字列iのj番目の文字で始まる部分文字列ならば,mもそうであり,Head[i,j]は正しく1に設定される。この方法で,入力文字列iのj番目から始まる任意の文字列がMUMでない場合に,Head[i,j]が1にならないことは明らかである。
【0067】
■右UEB−holderの抽出(ステップS506)
以下に述べる方法(h1)−(h3)によって,右UEB−holderである文字列をパスラベルとするノードに「右UEB−holderである」と印を付けることができる。事前に,2次元配列Tvを用意する。TvもHead,Tailと同様に,入力文字列iと該文字列の長さよりも小さな非負整数jに対して値が定義される。
(h1) Tvの全要素をヌルポインタで初期化する。また,変数shortest_right_MUMにヌルポインタを代入する。
(h2) suffix tree Tを深さ優先探査し,出会ったノードvについて,(h2a)と(h2b)の処理を行なう。なお,この深さ優先探査ではラベルがεのエッジとそのエッジが至るリーフも処理の対象とする。
(h2a) ノードvに「右MUMである」と印があり,shortest_right_MUMがヌルポインタであれば,shortest_right_MUMにvへのポインタを代入する。なお,vをルートノードとする部分木の処理が終了した段階で,shortest_right_MUMの値はヌルポインタに戻す。
(h2b) ノードvがリーフ(i,j)であった場合には,変数shortest_right_MUMの値をTv[i,j]に代入する。
(h3) 全ての入力文字列iについて,入力文字列のiの長さより小さい任意の非負整数jに対し,次の(h3a),(h3b)の条件がともに満たされるとき,Tv[i,j]が指し示すノードに「右UEB−holder」と印を付ける。
(h3a) Head[i,j]が1であるか,j≧1かつTail[i,j−1]が1。
(h3b) Tv[i,j]がヌルポインタでない。
【0068】
この方法(h1)−(h3)で,右UEB−holderをパスラベルとするノードに,かつそれらのノードに限り,「右UEB−holderである」と印がつくことを示す。まず,(h2)によって,Tv[i,j]の値は,以下の値に設定される。
(1) 入力文字列iのj番目の文字から始まる部分文字列である右MUM rが存在するなら,rをパスラベルとするノードvへのポインタ。ただし,ルートノードからvに至るパス上に,v以外に「右MUMである」と印がついたノードは存在しない。
(2) 入力文字列iのj番目の文字から始まる部分文字列である右MUMが存在しないなら,ヌルポインタ。
【0069】
これを踏まえ,(h3)において,「右UEB−holderである」と印がついたノードは,実際に右UEB−holderをパスラベルとするノードであることを示す。
(H1)について:
右MUMのノードにしか印をつけないので,そのパスラベルは(H1)を満たす。
(H3)について:
Tv[i,j]がヌルポインタでないとき,Tv[i,j]は,「右MUMである」と印が付いたノードvへのポインタで,suffix tree Tのルートノードからvに至るまでのパス上に「右MUMである」と印がついたノードは存在しない。よって,Tv[i,j]の指し示すノードのパスラベルは,(H3)を満足する。
(H2)について:
Head[i,j]が1であるか,j≧1かつTail[i,j−1]が1であるようなTv[i,j]の指すノードにしか印を付けない。したがって,Tv[i,j]の示すノードのパスラベルをrとすると,rは入力文字列iにおいてj番目の文字で始まるMUM mのprefixである右MUMか,入力文字列iにおいてあるMUMの次の文字から始まる右MUMである。前者の場合,rは(R6)よりMUMである。したがって,(H2)も満たされる。
【0070】
次に,ある右UEB−holder hについて,本発明の方法によりv(h)に右UEB−holderの印がつかないと仮定する。まず,Tv[i,j]にv(h)へのポインタが入らないと仮定する。このとき,hは右MUMでないか,hを真のprefixとする右MUMが存在する。それぞれ,(H1),(H3)よりhが右UEB−holderであることに矛盾しTv[i,j]にはv(h)へのポインタが入らなければならないことがわかる。それでもhに「右UEB−holderである」との印がつかないということは,hが入力文字列iのj番目から始まるような任意のi,jについて,Head[i,j]=0 かつTail[i,j−1]=0( j≧1のとき)ということである。このとき,入力文字列iのj番目から始まるMUMが存在せず,かつ入力文字列iのj−1番目の文字を末端とするMUMも存在しないが,そのようなhは(H2a),(H2b)をいずれも満たさないため,やはりhが右UEB−holderであることに矛盾する。したがって,v(h)に「右UEB−holderの印がつかない」と仮定したことが誤りであり,本発明の方法はの右UEB−holderをパスラベルとする全てのノードに印をつけられることがわかる。
【0071】
■UEBの抽出(ステップS507)
UEBは,次の(e1)−(e3)の方法によって,過不足なく抽出することができる。なお,UEBを抽出するために,ステップS505,S506で計算したHead, Tail, Tvの値を利用する。
(e1) suffix tree T内の全てのノードvについて,vに至るエッジのラベルがεでないときに,変数UEBlength(v)を設ける。そして,深さ優先探査を行ないUEBlength(v)=|p(v)|と初期化する。
(e2) 全ての入力文字列iについて,次の(e2a)−(e2d)までの処理を行なう。
(e2a) 変数cを1,変数jを入力文字列iの長さから1を減じた値で,初期化する。(e2b) Tv[i,j]がヌルポインタでなければ,Tv[i,j]が指し示すノードをvとし,変数UEBlength(v)の値を,cの値703とUEBlength(v)の値のうち小さい方の値で置き換える。
(e2c) Head[i,j]が1であるか,j≧1かつTail[i,j−1]が1であれば,cに1を代入し,それ以外のときはcに1を加える。
(e2d) jの値から1を減じる。jが0以上ならば,(e2b)−(e2d)までの処理を再び行なう。jが0より小さければ,入力文字列iに関する処理は終了である。
(e3) suffix tree Tを,各ノードvのパスラベルの長さ|p(v)|を求めながら深さ優先探査する。ルートノードからvに至るパス上の,直接vに至るエッジの長さをedgelength(v)とする。ノードvが,次の2つの条件(e3a),(e3b)をともに満たすとき,vに「UEBである」と印をつける。
(e3a) edgelength(v) > |p(v)|−UEBlength(v)
(e3b) UEBlength(v)≧u
【0072】
以上の方法で,「UEBである」と印がついたノードvの長さUEBlength(v)のprefixはUEBであり,かつそれらだけがUEBであることを説明する。その説明に先立ち,(A1)−(A6)の条件が次の(E1)−(E6)の条件と等価であることを示す。
(E1) ある右UEB−holderのprefixである。
(E2) 長さがu以上である。
(E3) 同一文字列には,高々1回しか出現しない。
(E4) 右でも左でも,MUMと重ならない。
(E5) MUMを真の部分文字列としない。
(E6) (E1)−(E5)を満足する文字列の真のprefixにならない。
【0073】
条件(A1)−(A6)と(E1)−(E6)が等価であることを説明する準備として,まず,文字列eが(E1)−(E3)を満足するなら,eは次の性質(E7)を持つことを示す。
(E7) eをprefixとする右UEB−holder hは一意に決まり,かつその右UEB−holder hについて,P(e)=P(h)である。
【0074】
(E7)が成り立つことを示すために,(E1)−(E3)を満たす文字列eについて検討する。(E1)より,eはある右UEB−holder hのprefixである。eをprefixとする右UEB−holder h’の存在を仮定し,h≠h’とする。(H3)より,hはh’の真のprefixではなく,h’もhの真のprefixではない。しかし,eがh,h’の共通のprefixだから,図14に示すように,空文字列かも知れない文字列s,s’,s’’と,a≠a’なる文字a,a’が存在してh=esas’,h’=esa’s’’と書くことができる。このとき,esはh,h’の共通のprefixである。a≠a’より任意の文字bについてP(esb)≠P(es)であり,esは(R4)を満たす。さらに,esは右UEB−holder hの部分文字列だから(R1)を満たし,eが(E2)と(E3)を満たすから(R2)と(R3)を満たす。したがって,esは右MUMである。ところが,h,h’は右UEB−holderだから,(H3)より右MUMをprefixとして持たないはずである。したがって,h≠h’とした仮定が誤りで,右UEB−holderは一意であることがわかる。
【0075】
さらに,hが P(e)=P(h)を満たすことを示す。sをP(e)=P(es)を満たす最長の文字列とする。P(es)=P(e)⊇P(h)より,esはhを部分文字列とする任意の入力文字列の部分文字列になっている。文字列eは,(E3)よりどの入力文字列上にも高々1回しか出現しないため,esとhは,一方が他方のprefixの関係にある。ところで,esはP(e)=P(es)より(R1)を満たし,eを部分文字列とするから(R2)と(R3)を満たし,sの定義より(R4)を満たす。よって,esは右MUMである。(H3)より,hは右MUMをprefixとしないからhがesのprefix。よって,P(h)⊇P(es)=P(e)⊇P(h)だからP(h)=P(es)=P(e)である。
すなわち,(E1)−(E3)を満たす文字列eをprefixとする右UEB−holder hは一意であり,P(e)=P(h)であることがわかった。
【0076】
条件(A1)−(A6)と(E1)−(E6)が等価であることを示すにあたり,はじめに,(E1)−(E6)を満たす文字列eは,(A1)−(A6)を満たすことを示す。
(A1)について:
eは(E1)より右UEB−holderのprefixだが,任意の右UEB−holderは右MUMだから(R1)を満たすので,少なくとも1つの入力文字列の部分文字列である。したがって,文字列eは(A1)を満たす。
(A2)について:
文字列eは(E2)を満たすから,明らかに(A2)を満たす。
(A3)について:
文字列eは(E3)を満たすから,明らかに(A3)を満たす。
(A4)について:
文字列eは(A4)を満たすから,明らかに(A4)を満たす。
(A5)について:
文字列eは(E5)を満たすから,明らかに(A5)を満たす
(A6)について:
(A1)−(A5)を満たし,eを真の部分文字列とする文字列e’の存在を仮定する。このとき,ある文字列s,s’を用いてe’=ses’と書ける。(E7)よりeをprefixとして持つ右UEB−holder hが一意に存在する。図10は,e,e’,s,s’,hの関係を図示したものである。
【0077】
まず,s=εではないことを説明する。もし,s=εだと仮定すると,e’=es’だから,eはe’のprefixであり,e’とhは一方が他方のprefixの関係にある。さらに,e’≠eよりs’≠εである。一方,hは右MUMだから(R5)よりhをsuffixとしP(h)=P(m)であるMUM mが存在する。ここで,hがe’の真のprefixと仮定すれば,s’≠εよりe’はmと左で重なって(A4)に矛盾するか,h=mを部分文字列とし(A5)に矛盾。したがって,e’がhのprefixである。ところが,e’がhのprefixならばe’は(E1)を満たし,(A2)−(A5)を満たすから(E2)−(E5)を満たすが,eはe’の真の部分文字列だからeが(E6)の条件を満たすことに矛盾する。したがって,s=εであってはならないことがわかる。
【0078】
そこで,s≠εを仮定する。hがMUMであった場合は,e’はhの長さにより,hと右で重なり(A4)に矛盾するか,hを真の部分文字列として含み(A5)と矛盾するかのいずれかとなるため,hはMUMではない。つまり,hはMUMでない右UEB−holder であるから,(H2b)よりあるMUM m’が存在し,m’hが少なくとも1つの入力文字列の部分文字列となる。ところが,(E7)よりP(h)=P(e)⊇P(e’)だから,m’hが存在する入力文字列1001上に,必ずe’が存在する。s≠εだから,e’はm’と左で重なり(A4)に矛盾するか,m’を部分文字列として含み(A5)に矛盾する。
結局,eを真の部分文字列とする文字列e’を(A1)−(A5)を満たすようにとれば,必ず矛盾が生じるとわかる。したがって,eは(A6)を満たす。
【0079】
次に,(A1)−(A6)を満たす文字列eは,(E1)−(E6)を満たすことを示す。
(E1)について:
文字列sを,P(e)=P(es)なる最長の文字列とする。このesが,(H1)−(H3)を満たし,右UEB−holderになることを示す。まず,eは(R2)と(R3)を満たすからesも(R2)と(R3)を満たし,sの定義より文字列esは(R1)と(R4)も満たすので,右MUMである。ゆえに,esは(H1)を満たす。
【0080】
次に,文字列eが右MUM rを真のprefixとして持つと仮定する。このとき,(R5)よりrをsuffixとし,P(r)=P(m)であるMUM mが存在する。すると,P(e)⊆P(r)=P(m)よりeはある入力文字列上でmと左で重なり(A4)に矛盾するか,mを真の部分文字列とするため(A5)に矛盾し,こうしたrは存在しないことがわかる。また,esが|e|≦|r|なる右MUM rを真のprefixとして持つと仮定すると,ある文字aについて|e|≦|r|≦|ra|≦|es|だから,P(e)⊇P(r)⊇P(ra)⊇P(es)であり,P(es)=P(e)よりP(e)=P(r)=P(ra)=P(es)である。これはrが右MUMで(R4)を満たすことに矛盾するから,結局esの真のprefixに右MUMは存在しないことがわかる。したがって,esは(H3)を満たす。
【0081】
このesが右UEB−holderでないと仮定する。このとき,esは(H1),(H3)を満足するから(H2)を満足しない。すなわち,esはMUMでなく,かつ任意のMUM mについて,文字列mesを部分文字列とする入力文字列は存在しない。esがMUMでないから,ある文字aについて,P(e)=P(ae)が成り立つ。このaeが,(A1)−A5)満たすことを示す。
【0082】
文字列aeは,P(e)=P(ae)だから(A1)を満たし,eをsuffixとして含むから(A2)と(A3)を満たす。
文字列aeがあるMUM mと左で重なると仮定すれば,eは(A4)よりmと重ならないから,図11に示すように空文字列でないある文字列tについてm=taと書くことができ,tae=meが少なくとも1つの入力文字列1101の部分文字列になる。ところで,P(es)=P(e)だからeは必ずsを伴って入力文字列中に現れるので,mesも入力文字列1101の部分文字列になるが,esは(H2b)を満たさないから,このようなMUM mは存在しないはずで,矛盾が生じる。したがって,aeは左ではMUMと重ならない。
【0083】
一方,aeがあるMUM mと右で重なると仮定すると,eが(A4)を満たすからeとmは重ならないため,図12に示すようにeはmのprefixである。P(m)⊆P(e)=P(es)より,少なくとも1つの入力文字列1201上にmとesが,この入力文字列上に1度しか出現しないeをprefixとして出現するため,mとesは一方が他方のprefixの関係にある。ところが,esが(H3)を満たすことをすでに述べたから,mはesの真のprefixでない。よってesがmのprefix。(R6)より,MUMのprefixである右MUMは,MUMである。ゆえに,esはMUMでなければならないが,esが(H2a)を満たさないことに矛盾する。したがって,aeもMUMと右で重ならない。すなわち,aeは(A4)を満たす。
【0084】
さらに,aeの真の部分文字列でMUMである文字列mが存在すると仮定する。e=mと仮定すると,s=εならばm=e=esだからesが(H2a)を満たさないことに矛盾し,s≠εならば,m=eはesの真のprefixであり,mは右MUMだから,esが(H3)を満たすことに矛盾する。ゆえに,e≠m。さらに,eが(A5)を満たすから,mはeの部分文字列でもない。よって,図13に示すように,mはaeの真のprefixである。したがって,ある文字列t,t’を用いてm=at,e=tt’と書くことができる。ここで,m=aならば,P(ae)=P(e)=P(es)よりある入力文字列1301上にaes=mesが部分文字列として存在し,esが(H2b)を満たさないことに矛盾するから,m≠aであり,t≠εである。一方,t’=εならば,m=at=aeよりmはaeの真の部分文字列でなくなるから,t’≠ε。ところで,P(e)=P(ae)よりae=att’=mt’は少なくとも1つの入力文字列1301の部分文字列である。したがって,e=tt’はm=atと左で重なってしまうので(A4)に矛盾するから,aeの真のprefixでMUMである文字列の存在は否定される。よって,aeの真の部分文字列にMUMは存在しない。つまり,aeは(A5)を満たす。
【0085】
以上で,aeが(A1)−(A5)を満たすとわかった。ところが,eはaeの真の部分文字列であり,eが(A6)を満たすことに矛盾する。したがって,esが(H2)を満足しないとした仮定が誤りであることがわかる。すなわち,esは(H2)も満足し,右UEB−holderである。ゆえに,eは(E1)を満たす。
(E2)について:
文字列eは(A2)を満たすから,明らかに(E2)を満たす。
(E3)について:
文字列eは(A3)を満たすから,明らかに(E3)を満たす。
(E4)について:
文字列eは(A4)を満たすから,明らかに(E4)を満たす。
(E5)について:
文字列eは(A5)を満たすから,明らかに(E5)を満たす。
(E6)について:
UEB eをprefixとして持ち,(E1)−(E5)を満たす文字列e’の存在を仮定する。(A1)−(A5)は,(E1)−(E5)のみから導けたから,e’は(A1)−(A5)を満たす。しかし,eは(A6)を満たすから,このようなe’は存在しないはずである。よって,(E6)も満たされる。
【0086】
以上で,条件(A1)−(A6)が条件(E1)−(E6)と等価であることを示した。したがって,本発明のUEB抽出方法で,条件(A1)−(A6)を満たす文字列すなわちUEBを過不足無く抽出できることを示すには,(E1)−(E6)の条件を満たす文字列を過不足なく抽出できることを示せばよい。
【0087】
まず,(e1)−(e3)の方法で,「UEBである」と印がついたノードvのパスラベルの,長さUEBlength(v)のprefix eは,(E1)−(E6)を満たすことを示す。
(E1)について:
右UEB−holderのprefixである文字列だけを抽出するから,eは(E1)を満たす。(E2)について:
条件(e3b)より,UEBlength(v)がu以上の,「右UEB−holderである」と印があるノードvだけにUEBであるとの印をつけるから,eは(E2)を満たす。
(E3)について:
文字列eが(E3)を満たさないと仮定すると,eはある入力文字列i上でj番目とj’番目に現れ,j≠j’である。すると,入力文字列iのj番目の文字とj’番目の文字から始まるsuffixのprefixはeだから,リーフ(i,j)とリーフ(i,j’)のパスラベルがいずれもeをprefixにもつ。eの長さはUEBlength(v)だから,条件(e3a)が満たされたことよりパスラベルのprefixにeを持つリーフへのポインタは,必ずvを通る。しかし,hは右UEB−holderであり,どの入力文字列中にも高々1回しか現れないので,リーフ(i,j)とリーフ(i,j’)のうち,少なくともどちらか片方のリーフへのパスはvを通ることができないから,矛盾を生じる。つまり,eが(E3)を満たさないと矛盾が生じるから,eは(E3)を満足しなければならないことがわかる。(E4),(E5)について:
ステップ(e2b)において,変数cの値703(図7参照)は,入力文字列iにおいてj番目の文字から始まる部分文字列で,入力文字列iにおいてj番目の文字以外には,任意のMUMの先頭の文字と,任意のMUMの終端の次の文字を含まない,最も長い文字列の長さとなっている。一方,任意の右UEB−holder hについて,p(v)=hなるノードをvとすると,hが入力文字列iのj番目の文字で始まるような全てのi,jについて,ステップ(e2b)でUEBlength(v)はその時点のUEBlength(v)と変数cの値703のうち,小さいほうの値に更新される。また,UEBlength(v)の初期値は,|p(v)|=|h|である。したがって,(e2)が完了した時点で,UEBlength(v)は,次の条件(e4a)および(e4b)を満足する最大の整数kとなる。
(e4a) k≦|h|
(e4b) hの長さkのprefixで,MUMと重なる文字列や,MUMを部分文字列とする文字列は存在しない。
【0088】
ゆえに,文字列eは(E4)と(E5)を満たす。
(E6)について:
UEBlength(v)は,eをprefixとする右UEB−holderのprefixで,(E4)と(E5)を満たす最長のものの長さである。eの長さはUEBlength(v)だから,(E6)も満たされる。
【0089】
逆に,本発明の方法で「UEBである」と印がついたノードvのUEBlength(v)のprefix以外の文字列は,UEBでないことを示す。まず,右UEB−holderのprefix以外の文字列はUEBとみなされないが,(E1)よりこれらの文字列はUEBでない。(e3a)を満足しないために印がつかなかった右UEB−holder hのprefix eについては,hの真のprefixで,eをprefixとして含む文字列sをパスラベルとするノードwが存在する。このsが,任意の入力文字列に高々1回しか現れないと仮定すると,sは(R3)を満たし,wのパスラベルだから(R1)を満たす。|e|≧uのとき,|s|≧|e|≧uだからsは(R2)を満たし,suffix tree Tのノードのパスラベルだから(R4)を満たす。つまり,|e|<u でない限り,sは右MUMであり,hが右UEB−holderであることに矛盾。したがって,sは,少なくとも1つの入力文字列に2回以上出現する部分文字列である。ところが,eはsのprefixだから,eもこの入力文字列上に2回以上出現し,(E3)を満たさないからUEBでない。|e|<uのときは,(E2)を満たさないから明らかにUEBでない。結局,(e3a)を満足しないために印がつかなかった右UEB−holderのprefix eは,UEBでない。(e3b)を満足しないために印がつかなかった右UEB−holder hのprefix eは,長さがu未満だから明らかに(E2)に反し,UEBでない。さらに,UEBlength(v)はp(v)のprefixで(E4)と(E5)を満たす最も長い文字列の長さだから,vのパスラベルのprefixでUEBlength(v)より長い文字列は(E4)または(E5)に矛盾し,UEBlength(v)より短い文字列は(E6)に矛盾する。
以上により,本発明の方法でUEBであると判断されない文字列は,UEBではないことがわかった。
【0090】
■本発明の方法の処理時間
本発明の方法の処理時間の,入力文字列の文字の総数Nに対する振る舞いについて検討する。本発明の処理は,O(N)の時間で完了できることが知られている(r1)の方法と,入力文字列数や入力文字列の文字数に依存しない回数のsuffix tree Tに対する深さ優先探査と,それぞれの深さ優先探査における各ノードに対する定数時間の処理と,全要素数がNである3つの2次元配列Head, Tail, Tvの各要素に対する入力文字列数や入力文字列の文字数に依存しない回数の定数時間の処理により完了できる。suffix treeに対する深さ優先探索は,1回あたりO(N)の時間で完了できる。したがって,本発明の方法全体の計算時間は,O(N)である。
【0091】
■本発明の方法の効率的な実装方法
本発明の方法では,suffix treeの深さ優先探査を繰り返し行なっているが,いくつかの処理でsuffix treeの深さ優先探査の処理を統合することができる。(r2)と(r3),(m1)と(m3),(m4)と(m5),(m6)と(m7)は,変数を更新する順序に考慮しつつそれぞれ1回の深さ優先探査にまとめることができる。これにより,本発明の方法を実装することが容易になるとともに,実装されたシステムの性能向上も図ることができる。また,あるステップが終了した後には参照されない変数に割り当てられる記憶装置を,別の変数を記録するために再利用し,記憶装置の利用効率を向上させることができる。例えば,変数h(v),d(v),C(v),UEBlength(v)は,同一の記憶領域を共有できる。また,変数N(v)の値は,探査するノードvのパスラベルの長さを再帰的に計算しつつステップ(m7)を行なうこととすれば,記憶装置内にN(v)の値を保持する必要はない。
【0092】
■本発明の方法を実現する装置
本発明は,前記方法を実行するための装置も提供する。図8に,装置の構成の一例を示す。該装置は,主記憶806に上記方法を実行するプログラム805を格納し,さらにsuffix tree T 808や入力文字列を格納する。プログラム805は,中央演算装置801により実行される。計算結果は,ディスプレイ802を通じて表示されるか,補助記憶装置807に格納されるか,またはそれら両方の処理が行なわれる。ユーザからの入力はキーボード803およびポインティングデバイス804を用いて行なわれる。
【0093】
本発明の方法で得られたUEBを表示する場合,見易さや解析の容易さの観点から,図1の例のように,UEBを入力文字列そのものまたは該入力文字列を象徴的に示す線分や矩形101上の,UEBである部分文字列に相当する位置102に,色を変えたり文字や記号で示すなど視覚的に見やすい方法で表示することが好ましい。また,入力文字列をそのものまたは該入力文字列を象徴的に示す線分や矩形101とともに表示するか否かに関わらず,UEBの入力文字列上の位置103を表示してもよい。また,同じ入力文字列に由来するUEBを表示する際には,各UEBの開始位置の昇順とすることが好ましい。昇順の表示は,各入力文字列iについて変数jを,0から,入力文字列iの長さから1を減じた値まで増加させ,Tv[i,j]が「UEBである」と印がついたノードvへのポインタであったとき,p(v)のprefixで長さがUEBlength(v)であるUEBを表示することで,容易に実現できる。UEBを補助記憶装置807に格納する際にも,同じ入力文字列から得られたUEBをともに格納する場合には,上記の表示方法で開始位置の昇順の表示を得たのと同様の方法で,UEBの開始位置の昇順を得てその順に格納することが好ましい。また,UEBを表示する場合には,複数の入力文字列に存在するUEBが同一であるとわかるように,色や記号,文字,線104などを用いて判断できるように表示することが好ましい。また,補助記憶装置に807に記録する際も,複数のUEBが同一であると識別可能なように番号あるいはUEBごとに一意である数値または文字列を同時に記録することが好ましい。
【0094】
■計算機実験による,本発明の方法のエクソン抽出能力の検証
本発明の方法を実装したシステムを作成し,本発明の方法で塩基配列のスプライシングパターンを解析できることを実証した。以下では,uの値を15とした場合の結果について述べる。
【0095】
はじめに,乱数を用いて,長さが30文字の次の4つの塩基配列s1,s2,s3,s4を用意した。そして,これらを組み合わせ,長さが90の4つの入力文字列s1s2s3,s1s2s4,s1s3s4,s2s3s4を作成し,本発明の方法を実装したソフトウェアを用いて,これらがs1,s2,s3,s4の組み合わせであることを認識できるか試みた。パラメータuの値は,15とした。なお,ここで用いたs1,s2,s3,s4は以下の配列である。
s1= TTCAACAAAGACGGAAGTGTCCTAAATAGG
s2= GTGCTGACAGTGCTGTTAGAACTACAGGCT
s3= GAAGAAAGGTAACGCATATAGTGCGACGAA
s4= GGTGGCATGCCATGGACGCATACTCCGTAA
【0096】
処理の結果,図1に示す4つのUEB(エクソン1,エクソン2,エクソン3,エクソン4)が得られた。この結果より,s1は,エクソン1として抽出されたが,s2,s3,s4はそれぞれ先頭の1塩基が欠けた配列として抽出された。この原因は,s2,s3,s4がいずれもGで始まるため,s1およびs2の末尾にGを加えた配列がMUMとなり,s2,s3,s4の先頭が1塩基削られた配列が右UEB−holderとなったためである。このように,末尾での配列の偶然の一致により,UEBは実際のエクソンより短くなる場合がありうる。しかし,完全に一致していないとはいえ,エクソン2,エクソン3,エクソン4はそれぞれs2,s3,s4にほぼ一致した。つまり,本発明の方法により,入力文字列が長さ30塩基程度の4つの配列の組み合わせであると認識することができた。
【0097】
次に,本発明の方法を実装したシステムを用いて,米国公共機関NCBIの遺伝子データベースに登録されているスプライシングバリアント配列からUEBを抽出し,得られたスプライシングパターンを該遺伝子データベースの記述と比較する実験を行なった。使用したのはヒトのウィルムス腫瘍遺伝子WT1の配列で,アクセッション番号がNM_004906, NM_152857, NM_152858の3つの配列である。データベースには,NM_152857の576番塩基以降とNM_152858の675番塩基以降の配列が選択的3’端配列であることと,NM_152857に選択的5’端配列が存在することが記載されている。この3配列に対し,本発明の方法を実装したシステムを適用した結果は,図9の通りである。データベース記載されていたNM_152857, NM_152858の選択的3’配列は,開始位置を含めて正確にUEB5として認識された。さらに,NM_152857の選択的5’端配列に関しては,データベースに位置の記述はなかったが,先頭から115番目の塩基までの配列が選択的5’端配列であり,NM_004906, NM_152858の先頭から213番目の塩基までの5’端配列に置き換わっていることがわかった。配列末尾のpoly−A部分がUEB6として認識されたが,UEBがエクソンでなくpoly−A配列であることは,poly−A配列が入力配列の末尾にあること,配列中のアデニン(A)の割合が極めて高いことから容易に判定できる。
【0098】
なお,ウィルムス腫瘍遺伝子の配列について,本システムが認識したスプライシングパターンは,Altschul, S.F. et al., Nucleic Acid Research, 25:3389−3402, 1997 の方法で,3つの配列の関係をペアワイズに比較した結果と,数塩基の差異を除き矛盾しないことを確認した。入力配列の総塩基数は5,529bpで,計算時間はCPUのクロック周波数が1.7GHzであるパーソナルコンピュータを用いて0.1秒程度であった。
【0099】
■本発明の方法の,cDNA配列以外への適用
本発明は,mRNA配列のスプライシングパターン解析を目的としているが,比較ゲノム解析にも応用が可能である。入力文字列をmRNA配列の代わりにゲノム配列とし,得られたUEBがゲノム内の保存領域と解釈すれば,本発明の方法により,ゲノム配列の保存領域の位置と,複数のゲノム配列中の保存領域の対応関係が明らかにでき,比較ゲノム解析の有力な手段となる。
【0100】
この他,文字列に使用される文字の種類が有限であれば,本発明の方法は塩基配列に依存せず一般の文字列を処理することができるため,アミノ酸配列のような塩基配列以外の配列や文字列に対しても,そのまま適用可能である。
【0101】
【発明の効果】
本発明によれば,ESTのような生体高分子配列から,エクソン配列が満たすべき条件を用いて構築されたエクソン配列のモデルで定義された配列を,与えられた配列長の総和の線形時間で抽出することができる。
【図面の簡単な説明】
【図1】4つのエクソンの組み合わせになっている4つの入力配列を,本発明の方法により解析した結果を表示した例を示す図。
【図2】ゲノム上の遺伝子の,発現およびスプライシングの説明図。
【図3】入力文字列,右MUM,MUM,右UEB−holder,UEBの説明図。
【図4】Suffix treeの説明図。
【図5】本発明の方法における,処理全体のフローチャート。
【図6】MUMの総数がNのオーダー,それぞれのMUMの出現回数の総和がNの3/2乗のオーダーとなる入力文字列集合の,n=5の例を示す図。
【図7】図5中,ステップS505の右UEB−holder抽出,および,ステップS506のUEB抽出方法の説明図。
【図8】本発明の方法を実現する装置の一例の説明図。
【図9】本発明の方法により,ウィルムス腫瘍遺伝子のスプライシングバリアントからエクソン配列を抽出した結果を表示した例を示す図。
【図10】条件(E1)−(E6)より条件(A6)が導かれることの説明において検討する文字列e,e’,s,s’,h,m’の関係を説明する図。
【図11】条件(A1)−(A6)より条件(E1)が導かれることの説明において,aeと左で重なるMUMが存在しないことを説明するために定義された文字列m,tと,a,e,sの関係を表した図。
【図12】条件(A1)−(A6)より条件(E1)が導かれることの説明において,aeと右で重なるMUMが存在しないことを説明するために定義された文字列mと,a,e,sの関係を表した図。
【図13】条件(A1)−(A6)より条件(E1)が導かれることの説明において,aeの真の部分文字列であるMUMが存在しないことを説明するために定義された文字列m,t,t’と,a,eの関係を表した図。
【図14】条件(E1)−(E3)を満足する文字列eが(E7)を満足することの説明において,e,s,s’,s’’,a,a’,h,h’の関係を表した図。なお,h’のうち,入力文字列1401上にあるのは,esに一致するprefixの部分だけである。
【図15】文字列s,s’が重なることの定義を説明する図。
【符号の説明】
101: 入力文字列を象徴的に示す矩形
102: 101上で,UEBである部分文字列に相当する位置
103: UEBの入力文字列上の位置
104: 複数の入力文字列上にあるUEBが同一であることを象徴的に示す線
201: ゲノムDNA
202: ゲノム上の遺伝子
203: mRNA前駆体
204: スプライシングの過程を象徴的に表す矢印
205: イントロン
206: エクソン
207: mRNA
208: 207でスプライシングの過程で除去されずに残ったエクソンの1つ209: mRNA 207 のスプライシングバリアントの1つ
210: mRNA 207で除去されたが,mRNA 209で残ったエクソン
301: 入力文字列の例
302: 301の入力文字列集合に対する右MUMを列挙したもの
303: 301の入力文字列集合に対するMUMを列挙したもの
304: 301の入力文字列集合に対する右UEB−holderを列挙したもの
305: 301の入力文字列集合に対するUEBを列挙したもの
401: 文字列ATATGとTTAGTAから構築されたsuffix tree
402: Suffix tree 401のルートノード
403: Suffix tree 401のリーフの1つ(「i, j」と書かれているリーフは,文字列iのj番目から始まるsuffixに対応)
404: Suffix tree 401のエッジの1つ
405: Suffix tree 401のエッジのラベルの1つ
406: Suffix tree 401のエッジの空文字列であるラベル
407: Suffix tree 401のノードの1つ
408: Suffix tree 401のルートノード402からノード407にいたるパス
409: Suffix tree 401のsuffix linkの1つ
601: MUMの総数がNのオーダー,それぞれのMUMの出現回数の総和がNの3/2乗のオーダーとなる入力文字列集合の,n=5の例
602: 入力配列集合601のMUMの1つ(t(3,1))
701: 2次元配列Headの,入力文字列3についての要素を取り出したもの
702: 2次元配列Tailの,入力文字列3についての要素を取り出したもの
703: UEB抽出方法において用いられる変数cのステップ(e2b)での値
801: 本発明の装置の中央演算装置
802: 本発明の装置のディスプレイ
803: 本発明の装置のキーボード
804: 本発明の装置のポインティングデバイス
805: 本発明の方法を実行するためのプログラム
806: 本発明の装置の主記憶装置
807: 本発明の装置の補助記憶装置
808: 本発明の装置の主記憶装置に記録されたsuffix tree T
1001: ある入力文字列を象徴的に表す線分
1101: ある入力文字列を象徴的に表す線分
1201: ある入力文字列を象徴的に表す線分
1301: ある入力文字列を象徴的に表す線分
1401: ある入力文字列を象徴的に表す線分
1501: ある入力文字列を象徴的に表す線分
Claims (8)
- 複数の文字列が入力として与えられたときに,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右または左に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列を,MUMと呼ぶとき,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,
長さが指定された整数u以上であり,
与えられた各文字列には高々1度しか現れず,
該部分文字列が,該部分文字列を完全に含むMUM以外のどのMUMとも,どの与えられた文字列上でも文字を共有することがなく,
上記4つの条件のみを満足するほかの部分文字列の一部となっていない部分文字列を抽出することを特徴とする文字列解析方法。 - 請求項1記載の文字列解析方法において,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列である,右MUMと呼ぶ部分文字列を抽出する工程と,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,
該部分文字列の左に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる文字列である,左MUMと呼ぶ文字列を抽出する工程または,前記MUMと呼ばれる部分文字列を抽出する工程と,
MUMであるか,またはある与えられた文字列上で,あるMUMの次の文字から始まる右MUMであって,真のprefixとして右MUMである文字列を含まない文字列を抽出する工程とを有することを特徴とする文字列解析方法。 - 複数の文字列が入力として与えられたときに,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右または左に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列を抽出する方法であって,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列を抽出する工程を有することを特徴とする文字列解析方法。 - 請求項3記載の文字列解析方法において,与えられた文字列を格納したsuffixtreeを利用し,suffix tree内のノードについて,該ノードへのポインタとなっているsuffix linkの数を数えることを特徴とする文字列解析方法。
- 複数の文字列が与えられたときに,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列である,右MUMと呼ぶ部分文字列を抽出する工程と,与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが本発明の方法の利用者が指定する整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の左に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列であるものを抽出する工程とを有し,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右または左に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となる部分文字列をMUMと呼ぶとき,
MUMか,または,ある与えられた文字列上であるMUMの次の文字から始まる右MUMであって,右MUMである文字列を真のprefixとして含まない部分文字列を抽出することを特徴とする文字列解析方法。 - 複数の文字列が与えられたときに,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となるとき該部分文字列を右MUMと呼び,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右または左に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となるとき該部分文字列をMUMと呼ぶとき,
MUMか,または,ある与えられた文字列上であるMUMの次の文字から始まる右MUMであって,右MUMである文字列を真のprefixとして含まない部分文字列を抽出する工程を有する文字列解析方法であって,
与えられた文字列におけるMUMの位置を計算するために,右MUMを真のsuffixとしない右MUMの位置を計算することを特徴とする文字列解析方法。 - 請求項1記載の文字列解析方法において,
与えられた文字列のうち少なくとも1つの文字列の部分文字列であって,長さが指定された整数u以上であり,与えられた各文字列には高々1度しか現れず,該部分文字列の右に一文字追加して得られる新しい文字列を含む与えられた文字列の集合が,文字を追加する前の該部分文字列を含む与えられた文字列の集合と異なる集合となるときに該部分文字列を右MUMと呼ぶとき,
前記MUMであるかまたは,ある与えられた文字列上であるMUMの次の文字から始まる右MUMであって,真のprefixとして右MUMである文字列を含まない部分文字列のprefixだけを抽出すべき部分文字列の候補とすることを特徴とする文字列解析方法。 - 請求項1〜7のいずれか1項記載の文字列解析方法をコンピュータに実行させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002316654A JP2004152023A (ja) | 2002-10-30 | 2002-10-30 | 文字列解析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002316654A JP2004152023A (ja) | 2002-10-30 | 2002-10-30 | 文字列解析方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004152023A true JP2004152023A (ja) | 2004-05-27 |
Family
ID=32460296
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002316654A Pending JP2004152023A (ja) | 2002-10-30 | 2002-10-30 | 文字列解析方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004152023A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008027244A (ja) * | 2006-07-21 | 2008-02-07 | Univ Of Tokyo | エクソンアレイ発現プロファイルに基づく疾患特異的選択的スプライシング同定法 |
JP2014525080A (ja) * | 2011-07-05 | 2014-09-25 | コーニンクレッカ フィリップス エヌ ヴェ | バイオインフォマティクス文字セット及びマップされたバイオインフォマティクスフォントを用いたゲノム/プロテオミクス配列の表現、視覚化、比較及びレポーティング |
-
2002
- 2002-10-30 JP JP2002316654A patent/JP2004152023A/ja active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008027244A (ja) * | 2006-07-21 | 2008-02-07 | Univ Of Tokyo | エクソンアレイ発現プロファイルに基づく疾患特異的選択的スプライシング同定法 |
JP2014525080A (ja) * | 2011-07-05 | 2014-09-25 | コーニンクレッカ フィリップス エヌ ヴェ | バイオインフォマティクス文字セット及びマップされたバイオインフォマティクスフォントを用いたゲノム/プロテオミクス配列の表現、視覚化、比較及びレポーティング |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3061022B1 (en) | Systems and methods for using paired-end data in directed acyclic structure | |
AU2014340461A1 (en) | Systems and methods for using paired-end data in directed acyclic structure | |
KR20070083641A (ko) | 전사 맵핑을 위한 유전자 식별 기호 분석방법 | |
Djukanovic et al. | An A⁎ search algorithm for the constrained longest common subsequence problem | |
Iliopoulos et al. | Finite automata based algorithms on subsequences and supersequences of degenerate strings | |
JP2004152023A (ja) | 文字列解析方法 | |
US20140229114A1 (en) | Genomic/proteomic sequence representation, visualization, comparison and reporting using bioinformatics character set and mapped bioinformatics font | |
Schulz et al. | The generalised k-Truncated Suffix Tree for time-and space-efficient searches in multiple DNA or protein sequences | |
Ouangraoua et al. | Local similarity between quotiented ordered trees | |
JP5781486B2 (ja) | シードの長さを考慮した塩基配列処理システム及び方法 | |
JP2005316605A (ja) | 生体高分子配列のスプライシングパターン解析方法 | |
Barton et al. | Linear-time computation of prefix table for weighted strings | |
NL2013120B1 (en) | A method for finding associated positions of bases of a read on a reference genome. | |
Iliopoulos et al. | Maximal motif discovery in a sliding window | |
Veeramachaneni et al. | Aligning two fragmented sequences | |
JP5586334B2 (ja) | 文字列入力支援装置、文字列入力支援方法およびプログラム | |
Becerra et al. | A multiobjective optimization algorithm for the weighted LCS | |
Antoniou et al. | Application of suffix trees for the acquisition of common motifs with gaps in a set of strings | |
Rocke | Using suffix trees for gapped motif discovery | |
Deorowicz | A cover-merging-based algorithm for the longest increasing subsequence in a sliding window problem | |
Bergroth et al. | New refinement techniques for longest common subsequence algorithms | |
Jean et al. | The contig assembly problem and its algorithmic solutions | |
CN115497567A (zh) | 核酸序列聚类方法、装置、计算机可读存储介质、终端 | |
Vaser | De novo transcriptome assembly | |
Böcker | Sequencing from compomers: The puzzle |