まず、インデックス情報を用いた検索対象ファイルの絞り込みついて、説明する。
図1Aは、検索対象のファイル群F1〜Fnに基づくインデックス情報I1を示す。図1Aに示すインデックス情報I1中、最上行がファイル番号を示す。ファイル番号は、検索対象のファイル群F1〜Fnそれぞれに対応する番号である。インデックス情報I1において、文字情報群C1〜Cmのそれぞれが、ファイル群F1〜Fnにおける存否に関するビット列と対応付けられる。
文字情報群C1〜Cmに含まれる文字情報Cjは、例えば、1文字もしくは複数の文字の組み合わせによる文字列である。もしくは、文字情報Cjは、文字情報に対応するバイナリコードの一部分でもよい。例えば、文字情報群C1〜Cmは、使用が想定される文字(たとえばJISコードが割り当てられている文字)から所定数の文字を組み合わせた全通りの組み合わせを含む。また、例えば、文字情報群C1〜Cmは、使用頻度の高い基礎的な単語を含む。
例えば、ファイル群F1〜FnのうちのあるファイルFi(ファイル番号はi)が、「七夕祭り」という文字列を含むファイルであるとする。その場合、ファイルFiは、「七」、「夕」、「祭」、「り」という文字情報を含むファイルであり、「七夕」、「夕祭」、「祭り」という文字情報を含むファイルでもある。本実施形態においては、文字情報群C1〜Cmのそれぞれが2文字の文字情報である場合を例示する。
文字情報Cjがファイル群F1〜Fnのいずれに含まれるかは、1〜nのそれぞれの数iについて、文字情報CjとファイルFiとに対応する記憶領域に、文字情報CjがファイルFiに含まれるか否かに関する情報が記憶されることで示される。例えば、インデックス情報I1において、ファイルFiに文字情報Cjが含まれるか否かに関する存否情報の格納先のアドレスは、文字情報Cjに対応するバイナリコードをハッシュ関数に代入して得られるアドレスPjと、ファイル番号iにより示される。例えば、文字情報「七夕」に対応するバイナリコード(JISに基づく文字コード)であれば、0x3C374D2C(0xは16進数表記を意味する)である。また、「七夕」のバイナリコードは、UTF−16では、0x4E035915である。
1つの文字情報Cjに対して1つのアドレスPjが割り当てられる場合には、文字情報Cjの存否情報は、ファイルFiに文字情報Cjが存在すれば「1」の値のビットで示され、ファイルFiに文字情報Cjが存在しなければ、「0」の値のビットで示される。複数の文字情報(例えば、文字情報Cjと文字情報Ck)が1つのアドレスPjに割り当てられている場合もある。その場合には、存否情報は、ファイルFiに文字情報Cj及び文字情報Ckのうちの少なくとも1つが存在すれば「1」の値のビットで示され、ファイルFiに文字情報Cj及び文字情報Ckのいずれも存在しなければ、「0」の値のビットで示される。ちなみに、存否情報がどのように示されるかは適宜変更されてよく、値が「1」で不存在が示され、値が「0」で存在が示されてもよい。さらには、複数ビットにより存否が示されてもよい。図1Aに示すインデックス情報においては、文字情報を含む旨は「1」の値のビットで示されている。
例えば、アドレスPjに対応する文字情報が「七夕」のみである場合には、インデックス情報I1のアドレスPjに示されるビット列により、「七夕」がファイル番号2,3,iのファイルそれぞれに含まれることが明らかになる。また、例えば、1つのアドレスPkに「夕祭」のみが対応する場合には、インデックス情報I1のアドレスPkに示されるビット列は、ファイル群F1〜Fnのそれぞれについて、「夕祭」を含むか否かを示す。例えば、ファイル番号i,n−1のファイルは「夕祭」を含むことが示され、ファイル番号1,2,3、j、kなどのファイルは、「夕祭」を含まないことが示される。
図1Aに示すように、ファイルFiは、「七夕」以外の文字情報も含むため、「七夕」だけでなく、「夕祭」、「祭り」、・・・など、他の文字情報に対応する位置のビットも「1」の値を示す。また、図1Aでは省略されているが、ファイル群F1〜Fnのそれぞれについても、それぞれのファイルに含まれる文字情報に対応する位置のビットが「1」の値を示す。
ファイル群F1〜Fnに対して検索を行なう場合に、図1Aに示すインデックス情報I1を用いて文字列検索の対象となるファイルの絞り込みが行なわれる。例えば「七夕祭」という検索文字列を含む検索要求を受け付けたとする。検索文字列の「七夕祭」には、「七夕」という文字情報と「夕祭」という文字情報とが含まれている。この場合、文字列検索の対象となるファイルは、例えば、「七夕」に基づき算出されるアドレス(図1AではPj)に示されるビット列と、「夕祭」に基づき算出されるアドレス(図1AではPk)に示されるビット列とにより絞り込まれる。例えば、アドレスPjに対応するビット列と、アドレスPkに対応するビット列との論理積演算結果であるビット列A1は、図1Bに示す通りとなる。
図1Bに示すビット列A1において、「1」となるビットに対応するファイル(図1Bにおいては、ファイル番号iのファイル)が、文字列検索対象のファイルとなる。インデックス情報I1に基づき算出されるビット列A1で「0」であるビットに対応するファイル、すなわち、文字情報「七夕」および「夕祭」のうちの少なくとも一方を含まないことが明らかなファイルは、検索対象から除かれる。
半角文字を用いた場合も同様である。例えば、ファイルFiが「BIOS(BASIC INPUT/OUTPUT SYSTEM)」という文字列を含むとする。すると、例えば、インデックス情報I1において、文字情報「INPU」に基づき算出されたアドレスPjと、ファイル番号iに示される位置のビットが「1」を示す。また、例えば、文字情報「OUTP」に基づき算出されたアドレスPkと、ファイル番号iに示される位置のビットが「1」を示す。検索文字列が「INPUT/OUTPUT」であると、インデックス情報I1から、例えば、「INPU」および「OUTP」のそれぞれに対応するビット列を取得し、それぞれのビット列の論理積により、ビット列A1(図1B参照)が算出される。ビット列A1に基づいて、「INPU」および「OUTP」のうち少なくとも一方を含まないことが明らかなファイル(ビット列において値が「0」を示すファイル)は、検索対象から除かれる。
上述の通り、html(hypertext markup language)などのマークアップ言語には、1つの意味を有する単語又は文字を複数の異なる表記による文字情報で併記させる修飾(例えば、ルビ付きの文字列の表示、ピン音付きの中国語の表示など)がある。このような修飾が用いられると、文書データ内で、同じ単語の異なる表記である複数の文字情報が連続してしまう。例えば、本来「七夕」に後続する文字情報は「祭り」又は「まつり」であるが、マークアップ言語を用いた記述D1では「七夕…たなばた…祭…まつ…り」となるため、「七夕」に後続する文字情報は「たなばた」となる。その結果、インデックス情報I1において、「七夕…たなばた…祭…まつ…り」の記述を含むファイルFiについての「夕祭」に対応するビットや、「夕ま」に対応するビットの値は「0」となる。そのため、例えば、「七夕祭り」や「七夕まつり」という検索文字列に基づいてファイル絞り込みを行なうと、「夕祭」も「夕ま」も含まないと判定されるため、いずれの検索文字列に基づいてもファイルFiは文字列検索の対象から除かれてしまう。ファイルFiに従って表示すれば、「七夕」と「祭り」、「たなばた」と「祭り」、「七夕」と「まつり」のいずれも、連続する文字情報であるにも関わらず、いずれの組み合わせもファイルFi内に含まれないと判定される。逆に、「夕た」、「祭ま」などの文字情報は、タグ情報による指定に応じて表示すると連続しない文字情報同士が、ファイルFi内で連続して存在すると判定されてしまう。
複数の異なる表記を併せて表示させることは、日本語の文書のみでなく、中国語の文書にも、英語の文書においても行なわれる。英語において、例えば略語に対してルビを付与することがある。
「BIOS」という略語に対して、「BASIC INPUT/ OUTPUT SYSTEM」などのルビが付与されることがある。その場合、ファイルFiは、例えば「<ruby><rb>B</rb><rp>(</rp><rt>BASIC</rt><rp>)</rp><rb>I</rb><rp>(</rp><rt>INPUT/</rt><rp>)</rp><rb>O</rb><rp>(</rp><rt>OUTPUT</rt><rp>)</rp><rb>S</rb><rp>(</rp><rt>SYSTEM</rt><rp>)</rp></ruby>」などの記述D2を含む。この場合においても、日本語と同様に、単純にタグを除くのみでは、「BBASICIINPUT/OOUTPUTSSYSTEM」となる。タグ情報による指定に応じて表示すれば連続しない文字情報同士がファイルFi内で連続して存在し、タグ情報による指定に応じて表示すれば連続する文字情報同士がファイルFi内で連続せずに存在すると判断されてしまう。
英字4文字分の文字情報ごとに各ファイルに存在するか否かを示すインデックス情報を、「BBASICIINPUT/OOUTPUTSSYSTEM」に基づいて生成すると、「INPU」、「PUT/」、「TPUT」などの文字情報が含まれる旨が示される。しかしながら、「CIOS」や「IOSY」などの文字情報は記述D2に含まれないと判断され、「SSYS」という文字情報は記述D2に含まれると判断される。例えば、検索文字列が「BASIC IO SYSTEM」である場合には、「CIOS」も「IOSY」も記述D2に含まれないと判断されているので、ファイルFiが文字列検索の対象から除かれる可能性がある。また、「BBASICIINPUT/OOUTPUTSSYSTEM」(「SSYS」を含む)のみでなく、例えば、「STOLE(「STOL」や「TOLE」を含む)」や「ODYSSEY(「DYSS」を含む)」などがともにファイルFiに含まれることもある。例えば、検索文字列が「DYSSYSTOLE」だとすると、ファイルFiは、たとえ「DYSSYSTOLE」を含まなくても、「DYSS」、「SSYS」、「STOL」、「TOLE」を含むために、文字列検索の対象に絞り込まれる可能性がある。
以下に実施形態について説明する。
ファイル群F1〜Fnに含まれるファイルFiに、単語V1の複数表記(表記W1及び表記W2)の指示と、単語V1に後続する単語V1の表記W1及び表記W2の併記の指示が含まれるとする。先述の例を用いれば、表記W1がルビを振られる親文字であり、表記W2がルビ文字である。また、単語V1は、例えば、「七夕」であり、表記W1の文字情報CR1では「七夕」と表記され、表記W2の文字情報CR2では「たなばた」と表記される。さらに、単語V2は、例えば、「祭」であり、表記W1の文字情報CR3では「祭」と表記され、表記W2の文字情報CR4では「まつ」と表記される。
本実施形態においては、[1]文字情報CR1の末尾部分に文字情報CR3の冒頭部分が連続する文字情報、[2]文字情報CR1の末尾部分に文字情報CR4の冒頭部分が連続する文字情報、の双方をファイルFiから抽出する手順が実行される。また、本実施形態においては、[3]文字情報CR1の末尾部分に文字情報CR2の冒頭部分が後続する文字情報、及び[4]文字情報CR3の末尾部分に文字情報CR4の冒頭部分が後続する文字情報のいずれも抽出されない。さらに、インデックス情報において、抽出された文字情報に対応するビット列のファイルFiに対応するビットを「1」にセットする手順が実行される。さらに、上述の手順により生成されるインデックス情報を用いて、検索対象のファイルを絞り込む処理が行なわれる。
図2は、上述の本実施形態の処理を実行するコンピュータ1の機能構成を示す。コンピュータ1は、処理部11及び記憶部12を含む。処理部11は、インデックス情報を生成し、生成したインデックス情報を用いた検索を行なう。記憶部12は、処理部11の処理に用いられる情報(例えば、検索対象となるファイル群F1〜Fnやインデックス情報など)を記憶する。
処理部11は、生成部13を含む。生成部13は、インデックス情報を生成し、記憶部12に記憶する。図3は、生成部13の機能ブロックの例を示す。生成部13は、制御部131、読出し部132および判定部133を含む。制御部131は、記憶部12に記憶領域を確保し、ファイルF1からファイルFnを順に指定し、指定したファイルについて、読出し部132と判定部133とにそれぞれの処理を実行させる。読出し部132は、ファイル群F1〜Fnのうち、制御部131により指定されたファイルFiを記憶部12から読み出す。判定部133は、設定された文字情報群C1〜Cmの各文字情報Cjについて、ファイルFiが文字情報Cjを含むか否かを判定する。この判定処理については、図6A−C及び図7A−Cを用いて後述する。ファイルFiが文字情報Cjを含むと判定された場合に、制御部131は、確保した記憶領域のうち、文字情報Cj及びファイルFiのファイル番号iに基づいて算出されるアドレスに示される記憶場所に、文字情報Cjを含む旨を示す情報を格納する。図4は、ファイル番号とファイルパスと対応関係を格納するテーブルT1の例を示す。読出し部132は、制御部131にファイル番号を指定された場合に、指定されたファイル番号とテーブルT1において対応するファイルパスで読み出し対象のファイルを特定する。
図2に示す通り、処理部11は、さらに、検索制御部14、絞込部15および文字列検索部16を含む。検索制御部14は、絞込部15と文字列検索部16とを制御して、検索要求に応じた検索処理を行なう。絞込部15は、生成部13により生成されるインデックス情報を用いて、検索対象ファイルの絞り込みを行なう。例えば、検索制御部14が、受け付けた検索要求に含まれる検索文字列から文字情報Caを抽出して、抽出された文字情報Caを絞込部15に通知する。絞込部15は、ファイル群F1〜Fnのうち、検索制御部14に通知された文字情報Caを含まないファイルを除いたファイルのファイル番号を検索制御部14に通知する。絞込部15は、例えば、インデックス情報から、文字情報Caに対応するビット列を読み出して、値が「1」であるビットに対応するファイル番号を通知する。検索制御部14は、絞込部15が絞り込んだファイル番号を文字列検索部16に通知する。文字列検索部16は、検索制御部14から通知されたファイルについて、検索制御部14が受け付けた検索要求に基づく文字列検索を行なう。
図5は、絞込部15の機能ブロックの例を示す。絞込部15は、参照部151および判定部152を含む。参照部151は、記憶部12に記憶されたインデックス情報のうち、検索制御部14から通知された文字情報Caに対応する部分を読み出す。文字情報Caに対応する部分を示すアドレスは、例えば、文字情報Caのバイナリコードをハッシュ関数に代入して得られる。判定部152は、参照部151が読み出したビット列に基づいて、文字情報Caを含まないファイルを判定し、ファイル群F1〜Fnのなかで文字情報Caを含まないファイルを除いてファイル番号を文字列検索部16に通知する。例えば、ビット列に含まれるビットのうち、値が「1」であるビットに対応するファイル番号を通知する。
検索制御部14は、検索文字列から複数の文字情報(例えば文字情報Ca、文字情報Cb)を抽出してもよい。すると、参照部151は、複数の文字情報Ca,Cbのそれぞれについて、インデックス情報から対応するビット列を読み出す。また、判定部152は、文字情報Caに対応するビット列に含まれる存否情報と、文字情報Cbに対応するビット列に含まれる存否情報との論理積(AND)を算出し、その算出結果に基づいて各ファイルにおける文字情報Ca,Cbの存否を判定する。文字情報Ca,Cbのいずれかが含まれないと判断されたファイルのファイル番号は、文字列検索部16に通知されない。
次に、文字情報群C1〜Cmに含まれる文字情報CjをファイルFiが含むか否かを判定する判定部133の処理を説明する。
図6は、文字情報Cjに基づいて生成されるオートマトンを示す。オートマトンは、各状態における状態遷移の条件を示す。ある状態にあった場合に、読みだした文字情報が合致した遷移条件に対応する状態へと、ある状態からの遷移が行なわれる。
図6Aは、文字情報「夕祭」に基づいて生成されるオートマトンである。図6Aに示すオートマトンは、初期状態(0)にある場合に、文字情報「夕」がファイルFiから読み出されると、初期状態(0)から状態(1)に遷移が行なわれることを示している。また、図6Aに示すオートマトンは、初期状態(0)において、文字情報「夕」以外を読み出した場合には、再度初期状態(0)への遷移が行なわれることを示している。同様に、図6Aに示すオートマトンは、状態(1)において、文字情報「祭」を読み出した場合には、状態(F)への遷移が行なわれ、文字情報「夕」を読み出した場合には、状態(1)への遷移が行なわれることを示している。また、図6Aに示すオートマトンは、状態(1)において、文字情報「夕」または「祭」以外を読み出した場合には、再度初期状態(0)への遷移が行なわれることを示している。状態(F)は、オートマトンによる照合完了を示す。オートマトンの状態が、状態(F)となった場合に、判定部133は、「夕祭」に合致する文字列がファイルFiに存在すると判定する。
図6Bは、文字情報「夕ま」に基づいて生成されるオートマトンである。図6Bに示すオートマトンは、初期状態(0)にある場合に、文字情報「夕」がファイルFiから読み出されると、初期状態(0)から状態(1)に遷移が行なわれることを示している。また、図6Bに示すオートマトンは、初期状態(0)において、文字情報「夕」以外を読み出した場合には、再度初期状態(0)への遷移が行なわれることを示している。同様に、図6Bに示すオートマトンは、状態(1)において、文字情報「ま」を読み出した場合には、状態(F)への遷移が行なわれ、文字情報「夕」を読み出した場合には、状態(1)への遷移が行なわれることを示している。また、図6Bに示すオートマトンは、状態(1)において、文字情報「夕」または「ま」以外を読み出した場合には、再度初期状態(0)への遷移が行なわれることを示している。オートマトンの状態が、状態(F)となった場合に、判定部133は、「夕ま」に合致する文字列がファイルFiに存在すると判定する。
図6Cは、文字情報「夕た」に基づいて生成されるオートマトンである。図6Cに示すオートマトンは、初期状態(0)にある場合に、文字情報「夕」がファイルFiから読み出されると、初期状態(0)から状態(1)に遷移が行なわれることを示している。また、図6Cに示すオートマトンは、初期状態(0)において、文字情報「夕」以外を読み出した場合には、再度初期状態(0)への遷移が行なわれることを示している。同様に、図6Cに示すオートマトンは、状態(1)において、文字情報「た」を読み出した場合には、状態(F)への遷移が行なわれ、文字情報「夕」を読み出した場合には、状態(1)への遷移が行なわれることを示している。また、図6Cに示すオートマトンは、状態(1)において、文字情報「夕」または「た」以外を読み出した場合には、再度初期状態(0)への遷移が行なわれることを示している。オートマトンの状態が、状態(F)となった場合に、判定部133は、「夕た」に合致する文字列がファイルFiに存在すると判定する。
図7Aは、判定部133の判定処理における図6Aに示すオートマトンの状態の変化を示す。状態を示す情報(状態情報)は、記憶領域(000〜011)に格納される。000〜111のそれぞれは、2進数であり、状態情報の格納先である記憶領域を示すアドレスである。図7Aでは、ファイルFi内に含まれる「<ruby><rb>七夕</rb><rp>(</rp><rt>たなばた</rt><rp>)</rp><rb>祭</rb><rp>(</rp><rt>まつ</rt><rp>)</rp></ruby>り」という記述D1との照合における状態情報変化が示される。ちなみに、図7A−Cは、<rp>タグに関する記載を省略して示している。
まず、記述D1との照合前の状態情報は、記憶領域000に状態(0)が記憶されているのみであるとする(S1)。次に、ファイルFiから<rb>タグを読み出した場合に、判定部133は、記憶領域000に記憶された状態情報を記憶領域001にコピーする(S2)。
次に、判定部133は、ファイルFiから「七」を読出し、記憶領域000に記憶された状態情報を更新する。記憶領域に記憶された状態は状態(0)であり、遷移条件「夕」に合致しないため、判定部133は、記憶領域000の状態情報を状態(0)とする。次に、判定部133は、ファイルFiから「夕」を読出し、記憶領域000に記憶された状態情報を更新する。この場合、ファイルFiから読みだした「夕」は、状態(0)における遷移条件に一致するので、判定部133は、記憶領域000の状態情報を状態(1)に更新する(S3)。
ファイルFiから<rt>タグを読み出すと、判定部133は、更新対象の記憶領域を記憶領域000から記憶領域001に切り替える。判定部133は、ファイルFiから順次「た」、「な」、「ば」、「た」の文字情報を読み出して、記憶領域001の状態情報を更新する。しかしながら、「た」、「な」、「ば」、「た」のいずれも、初期状態(0)における遷移条件「夕」に合致しないので、記憶領域001の状態情報は、状態(0)のままである(S4)。
判定部133は、ファイルFiから<rb>タグを読みだすと、さらに記憶領域のコピーを行なう。判定部133は、記憶領域000の状態情報を記憶領域010にコピーし、記憶領域001の状態情報を記憶領域011にコピーする(S5)。
次に、判定部133は、ファイルFiから「祭」を読出し、記憶領域000に記憶された状態情報を更新する。この場合、ファイルFiから読みだした「祭」は、状態(1)における遷移条件に一致するので、判定部133は、記憶領域000の状態情報を状態(F)に更新する。また、判定部133は、記憶領域001に記憶された状態情報についても更新する。記憶領域に記憶された状態は状態(0)であり、遷移条件「夕」に合致しないため、判定部133は、記憶領域001の状態情報を状態(0)とする(S6)。S6の時点で記憶領域に状態(F)の状態情報が記憶されたので、判定部133は、ファイルFiに文字情報「夕祭」が含まれると判定する。
ファイルFiから<rt>タグを読み出すと、判定部133は、更新対象の記憶領域を記憶領域000及び記憶領域001から、記憶領域010及び記憶領域011に切り替える。判定部133は、ファイルFiから順次「ま」、「つ」の文字情報を読み出して、記憶領域010及び記憶領域011の状態情報を更新する。しかしながら、「ま」、「つ」のいずれも、初期状態(0)における遷移条件「夕」に合致しないので、記憶領域010及び記憶領域011の状態情報は、状態(0)のままである(S7)。
さらに、ファイルFiから</ruby>タグを読み出すと、判定部133は、更新対象の記憶領域を、状態情報を格納する記憶領域000−011とする。判定部133はファイルFiから文字情報「り」を読出し、記憶領域000−011のそれぞれに記憶された状態情報を更新する(S8)。
S6に示すように状態(F)に遷移した時点で、判定部133は、それ以降の図6Aのオートマトンに基づく判定処理をやめてもよい。状態(F)に遷移することにより、ファイルFi内に「夕祭」が含まれることが明らかになるためである。
<rb>タグの読出しに応じた状態情報の複製と、<rt>タグの読出しに応じた更新対象の記憶領域の切り換えと、例えば以下のアドレッシングに基づいて行なう。状態情報の複製先の記憶領域は、例えば、複製元の記憶領域と複製の多重度に応じて決定される。例えば、1回目の複製においては、アドレスの一番下位の桁の値が「0」である記憶領域が複製元であり、アドレスの一番下位の桁の値が「1」である記憶領域が複製先とする。1回目の複製において記憶領域000に記憶された状態情報が、記憶領域001にコピーされる。1回目の複製後には、判定部133は、更新対象をアドレスの一番下位の桁の値に応じて切り替える。<rb>タグに挟まれた文字情報を読み出した場合には、アドレスの一番下位の桁の値が「0」である記憶領域000に記憶された状態情報を更新する。また、<rt>タグに挟まれた文字情報を読み出した場合には、アドレスの一番下位の桁の値が「1」である記憶領域001に記憶された状態情報を更新する。
さらに複製(2回目の複製)を行なう場合には、アドレスの下位から2番目の値が「0」である記憶領域(000、001などのアドレスで示される)の状態情報を、アドレスの下位から2番目の値が「1」である記憶領域(010、011などのアドレスで示される)に、コピーする。2回目の複製の後には、判定部133は、アドレスの下位から2番目の桁の値に応じて、更新対象を切り替える。<rb>タグに挟まれた文字情報を読み出した場合には、アドレスの下位から2番目の桁の値が「0」である記憶領域000及び記憶領域001に記憶された状態情報を更新する。また、<rt>タグに挟まれた文字情報を読み出した場合には、アドレスの下位から2番目の桁の値が「1」である記憶領域010及び記憶領域011に記憶された状態情報を更新する。
上述のアドレッシングにより、<rb>タグを複数回出現しても、<rb>タグに挟まれた文字情報に基づく更新と、<rt>タグで挟まれた文字情報に基づく更新とで、更新対象の記憶領域を切り替えることができる。
図7Bは、判定部133の判定処理における図6Bに示すオートマトンの状態の変化を示す。図6Bに示すオートマトンは、先述の通り、文字情報「夕ま」との合致判定に用いられる。図7Bでは、図7Aと同様、ファイルFi内に含まれる記述D1との照合における状態情報変化が示される。S1からS5までは、図7Aに示す状態情報の変化と同様に、記憶領域000〜011に記憶された状態情報が変化する。
次に、判定部133は、ファイルFiから「祭」を読出し、記憶領域000に記憶された状態情報を更新する。この場合、ファイルFiから読みだした「祭」は、状態(1)における遷移条件「ま」に一致しないので、判定部133は、記憶領域000の状態情報を初期状態(0)に更新する。また、判定部133は、記憶領域001に記憶された状態情報についても更新する。記憶領域に記憶された状態は状態(0)であり、遷移条件「夕」に合致しないため、判定部133は、記憶領域001の状態情報を状態(0)とする(S6)。
ファイルFiから<rt>タグを読み出すと、判定部133は、更新対象の記憶領域を記憶領域000及び記憶領域001から、アドレスの下記から2番目の値が「1」である記憶領域010及び記憶領域011に切り替える。判定部133は、ファイルFiから順次「ま」の文字情報を読み出して、記憶領域010及び記憶領域011の状態情報を更新する。文字情報「ま」は、状態(1)における遷移条件「ま」に一致するので、判定部133は、記憶領域010の状態情報を状態(F)に更新する。また、文字情報「ま」は、初期状態(0)における遷移条件「夕」に合致しないので、記憶領域011の状態情報は、状態(0)のままである(S7)。S7の時点で記憶領域に状態(F)の状態情報が記憶されたので、判定部133は、ファイルFiに文字情報「夕ま」が含まれると判定する。
次に、判定部133は、ファイルFiから文字情報「つ」を読み出し、記憶領域010及び記憶領域011に記憶された状態情報を更新する。「つ」は遷移条件に合致しないので、判定部133は、記憶領域010及び記憶領域011のそれぞれに格納される状態情報を、初期状態(0)に更新する(S8)。
さらに、ファイルFiから</ruby>タグを読み出すと、判定部133は、更新対象の記憶領域を、状態情報を格納する記憶領域000−011とする。判定部133はファイルFiから文字情報「り」を読出し、記憶領域000−011のそれぞれに記憶された状態情報を更新する(S9)。
先述の通り、S7に示すように状態(F)に遷移した時点で、判定部133は、それ以降の図6Bのオートマトンに基づく判定処理をやめてもよい。状態(F)に遷移することにより、ファイルFi内に「夕ま」が含まれることが明らかになるためである。
図7Cは、判定部133の判定処理における図6Cに示すオートマトンの状態の変化を示す。図6Cに示すオートマトンは、先述の通り、文字情報「夕た」との合致判定に用いられる。図7Cでは、図7Cと同様、ファイルFi内に含まれる記述D1との照合における状態情報変化が示される。S1からS6までは、図7Bに示す状態情報の変化と同様に、記憶領域000〜011に記憶された状態情報が変化する。
ファイルFiから<rt>タグを読み出すと、判定部133は、更新対象の記憶領域を記憶領域000及び記憶領域001から、アドレスの下記から2番目の値が「1」である記憶領域010及び記憶領域011に切り替える。判定部133は、ファイルFiから順次「ま」、「つ」の文字情報を読み出して、記憶領域010及び記憶領域011の状態情報を更新する。しかしながら、「ま」、「つ」のいずれも、遷移条件に合致しないので、記憶領域010及び記憶領域011の状態情報は、初期状態(0)となる(S7)。
さらに、ファイルFiから</ruby>タグを読み出すと、判定部133は、更新対象の記憶領域を、状態情報を格納する記憶領域000−011とする。判定部133はファイルFiから文字情報「り」を読出し、記憶領域000−011のそれぞれに記憶された状態情報を、初期状態(0)に更新する(S8)。
図7A−Cにおいて、例えば、判定部133は、</ruby>タグを読み出すと、記憶領域000〜011のうち、状態情報が重複する記憶領域の解放を行なう。例えば、図7AのS8においては、記憶領域001、記憶領域010及び記憶領域011のいずれも記憶領域000と重複する状態情報を記憶しているので、解放される。例えば、記憶領域001、記憶領域010及び記憶領域011が解放されると、ファイルFI内の文字情報「り」に基づく状態情報の更新は、記憶領域000に記憶された状態情報のみに対して行なわれる。
図6A−C及び図7A−Cを用いて、ファイルFi内に文字情報Cjが含まれるか否かを判定する判定手順を説明した。上述の例は、文書データ内で「七夕…たなばた…祭…まつ…り」のように、同じ意味の言語単位について複数種類の表記の併記が指定された部分が連続する場合である。この併記された部分は、表示上、「七夕祭り」とも、「たなばた祭り」とも、「七夕まつり」とも、「たなばたまつり」とも読めるが、文書データ内では「七夕…たなばた…祭…まつ…り」となっているため、いずれも当てはまらない。上述の判定処理では、連続する併記部分のうち、先の部分で親文字表記が指定された「七夕」という文字情報の末尾(例えば「夕」)と、先の部分でルビ文字表記が指定された「まつり」という文字情報の冒頭(例えば「ま」)とを連続させた文字情報(例えば「夕ま」)が含まれると判定される。そのため、「七夕…たなばた…祭…まつ…り」というように、間に「たなばた」「祭」などの文字情報があっても「七夕まつり」と連続する文字情報が、照合・抽出される。上述した末尾と冒頭とは、先の部分の親文字表記が指定された文字情報と、後の部分のルビ文字表記が指定された文字情報とが連続すればよく、文字数は限定されない。
しかしながら、判定手順は、これに限定されるものでなく、文字情報Caの表記1(例えば、「七夕」の「夕」)に文字情報Cbの表記2(例えば、「まつ」の「ま」)が後続する文字情報(例えば、「夕ま」)、または、文字情報Caの表記2(例えば、「たなばた」の「た」)に文字情報の表記1(例えば、「祭」)が後続する文字情報(例えば、「た祭」)を、ファイルFiから抽出する手順であればよい。もしくは、文字情報Caの表記1(例えば、「七夕」の「夕」)に文字情報Caの表記2(例えば、「たなばた」の「た」)が後続する文字情報(例えば、「夕た」)、または、文字情報Cbの表記1(例えば、「祭」)に文字情報Cbの表記2(例えば、「まつ」の「ま」)が後続する文字情報(例えば、「祭ま」)を、ファイルFiから抽出しない手順が用いられてもよい。図6A−C及び図7A−Cに示す判定によるインデックス生成手順と異なる他のインデックス生成手順については、図15A−Cに基づいて後述する。
図8は、コンピュータ1のハードウェア構成及びコンピュータ1を含むシステムの構成を示す。図8に示すシステムは、コンピュータ1、コンピュータ2、記憶装置3及びネットワーク4を含む。ファイル群F1〜Fnは、コンピュータ1の記憶部12に格納されているが、例えば、ネットワーク4を介して接続された記憶装置3に記憶されていてもよい。その場合には、読出し部15が記憶部12からではなく、記憶装置3からファイル群F1〜Fnのそれぞれを読み出す。
図2、図3及び図5に示す各機能ブロックは、例えば、図8に示すハードウェア構成により実現される。コンピュータ1は、例えば、プロセッサ301、RAM(Random Access Memory)302、ROM(Read Only Memory)303、ドライブ装置304、記憶媒体305、入力インターフェース(I/F)306、入力デバイス307、出力インターフェース(I/F)308、出力デバイス309、通信インターフェース(I/F)310、バス311などを含む。それぞれのハードウェアはバス311を介して接続されている。通信I/F310はネットワーク4を介した通信の制御を行なう。入力インターフェース306は、入力デバイス307と接続されており、入力デバイス307から受信した入力信号をプロセッサ301に伝達する。出力インターフェース308は、出力デバイス309と接続されており、出力デバイス309に、プロセッサ301の指示に応じた出力を実行させる。
RAM302は読み書き可能なメモリ装置であって、例えば、SRAM(Static RAM)やDRAM(Dynamic RAM)などの半導体メモリ、またはRAMでなくてもフラッシュメモリなどが用いられる。ROM303は、PROM(Programmable ROM)なども含む。ドライブ装置304は、記憶媒体305に記録された情報の読み出しか書き込みかの少なくともいずれか一方を行なう装置である。記憶媒体305は、ドライブ装置304によって書き込まれた情報を記憶する。記憶媒体305は、例えば、ハードディスク、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスクなどの記憶媒体である。また、例えば、コンピュータ1は、複数種類の記憶媒体それぞれについて、ドライブ装置304及び記憶媒体305を設ける。
入力デバイス307は、操作に応じて入力信号を送信する装置である。入力信号は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力デバイス309は、コンピュータ1の制御に応じて情報を出力する装置である。出力デバイス309は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力デバイス307及び出力デバイス309として用いられる。また、入力デバイス307及び出力デバイス309は、コンピュータ1に含まれず、例えば、コンピュータ1に外部から接続する装置であってもよい。
プロセッサ301は、ROM303や記憶媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って処理部11の処理を行なう。その際にRAM302はプロセッサ301のワークエリアとして用いられる。記憶部12の機能は、ROM303および記憶媒体305がプログラムやファイル群F1〜Fnを記憶し、RAM302がプロセッサ301のワークエリアとして用いられることによって実現される。プロセッサ301が読み出すプログラムについては、図9を用いて説明する。
図9は、コンピュータ1で動作するソフトウェアの構成例を示す。コンピュータ1において、図9に示すハードウェア群21の制御を行なうOS22(オペレーションシステム)が動作する。OS22に従った手順でプロセッサ301が動作して、ハードウェア21の制御・管理が行なわれることにより、アプリケーションプログラムやミドルウェアによる処理がハードウェア21により実行される。さらに、コンピュータ1において、インデックス生成プログラム23aまたは検索処理プログラム23bが、RAM302に読み出されてプロセッサ301により実行される。また、さらに、プロセッサ301がインデックス生成プログラム23aに基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア21を制御して)生成部13の機能が実現される。プロセッサ301が検索処理プログラム23bに基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア21を制御して)検索制御部14、絞込部15及び文字列検索部16の機能が実現される。
図10は、インデックス生成の処理手順例を示す。インデックス生成プログラム23aが起動される(S100)と、制御部131は、前処理を行なう(S101)。S101の前処理は、例えば、図4に示すテーブルT1や文字情報群C1〜Cmを記憶部12に読み出す処理などである。制御部131は、インデックス情報の生成が要求されるか否かを判断し(S102)、インデックス情報の生成が要求されるまで繰り返し判断を行なう(S102:NO)。インデックス情報の生成が要求される(S102:YES)と、制御部131は、インデックス情報を記憶する記憶領域を確保する(S103)。例えば、S103において確保された記憶領域内の各ビットは「0」にセットしておく。
制御部131は、図4に示すテーブルT1から、ファイル番号iを選択し、選択したファイル番号iのファイルFiを読出し部132に読み出させる(S104)。例えば、S104において、制御部131は、テーブルT1内のレコードを順に選択する。次に、判定部133は、文字情報C1〜Cmのうちの1つの文字情報Cjを選択する(S105)。例えば、S105において、記憶部12が保持する文字情報C1〜Cmのリストから、判定部133が文字情報を順に選択してもよいし、所定の数値範囲内で文字コードをインクリメントすることにより、文字情報を順に生成してもよい。判定部133は、ファイルFiが文字情報Cjを含むか否か判定する(S106)。S106において、図7A−Cに示した手順で判定処理が行なわれる。ファイルFiが文字情報Cjを含むと判定した場合(S106:YES)は、制御部131は、ファイル番号iと文字情報Cjに基づいてアドレスを算出する。制御部131は、算出したアドレスに対応する位置のビットを「1」に更新する。すなわち、制御部131は、算出したアドレスに対応する位置のビットと、「1」との論理和(OR)演算の結果を、算出したアドレスに対応する位置に格納する。例えば、文字情報Cjのバイナリコードを所定のハッシュ関数に代入して得られる値に対応するビット列のi番目のビットを「1」とする。制御部131によりビットの更新が行なわれると、判定部133はS108の処理を行なう。判定部133によりファイルFiが文字情報Cjを含まないと判定された場合(S106:NO)は、判定部133は、S108の処理を行なう。次の文字情報についての処理を行なう。文字情報C1〜Cmのなかで、未選択の文字情報が存在する場合には、判定部133は、再度S105の処理を行なう(S108)。文字情報C1〜Cmのなかで未選択の文字情報が存在しない場合には、S109の処理が行なわれる。S109では、ファイル群F1〜Fnのなかで未選択のファイルがあれば、読出し部132がS104の処理を再度行なう。また、ファイル群F1〜Fnのなかで未選択のファイルがなければ、S110の処理が行なわれる。
制御部131は、ファイル群F1〜Fnのインデックス情報の生成処理が完了した旨の通知を行なう(S110)。S110において、制御部131は、さらに、S103で確保した領域内の情報をインデックスファイルとして保存する。S110の処理後、終了指示を受けていたか否か判定する(S111)。終了指示を受けていた場合(S111:YES)は、処理部11は、インデックス生成プログラムを終了する。終了指示を受けていない場合(S111:NO)には、S102の処理を再度行なう。
図11は、全文検索の処理手順例を示す。検索処理プログラム23が起動される(S200)と、検索制御部14は、前処理を行なう(S201)。S201の前処理は、図4に示すテーブルT1の読出しや、インデックス情報の読出しである。検索制御部14は、検索要求を受けたか否かを判断し(S202)、検索要求を受けるまでS202の判断を繰り返す(S202:NO)。検索要求を受けた場合(S202:YES)には、インデックス参照処理が実行される(S203)。
図12は、インデックス情報の参照処理手順の例を示す。S203が実行される(S300)と、検索制御部14は、検索要求に含まれる検索文字列を取り出し、文字情報C1〜Cmのうちの検索文字列に含まれる文字情報Ca,Cb,・・・を抽出する(S301)。
ファイル絞込部15は、検索制御部14が文字情報Ca,Cb,・・・を抽出すると、ファイル群F1〜Fnのそれぞれについて、抽出された文字情報Ca,Cb,・・・のいずれか1つでも含まないファイルであるかどうかを判断する。具体的には、まず、抽出された文字情報のうちの1つを選択する(S302)。参照部151は、選択された文字情報に基づいてアドレスを算出し、算出されたアドレスに示される位置に格納された情報を読み出す(S303)。S303において、参照部151は、S107と同様の演算によりアドレスを算出する。その際に、例えば、参照部151は、選択された文字情報のバイナリコードを所定のハッシュ関数に代入して得られる値に対応するビット列を読み出す。ファイル絞込部15は、抽出された文字情報Ca,Cb,・・・のなかに未選択の文字情報がある場合には、S302の処理を再度行ない、抽出された文字情報Ca,Cb,・・・に未選択の文字情報がない場合には、インデックス参照処理を終了する(S304,S305)。
インデックス参照処理が終了すると、ファイル絞込部15は、検索対象のファイルのファイル番号を抽出する(S204)。S204において、例えば、判定部152は、文字情報Ca,Cb,・・・のそれぞれについて参照部151により読み出されたビット列同士の論理積(AND)を算出する。判定部152は、算出されたビット列において「1」であるビットが何番目であるかを示す番号を生成する。例えば、判定部152は、算出されたビット列において、x番目のビットとy番目のビットが「1」であれば、x,yを生成する。
検索制御部14は、判定部152により生成された番号x,y,・・・のいずれかである番号iを選択する(S205)。文字列検索部16は、選択された番号iがファイル番号であるファイルFiを読み出す(S206)。文字列検索部16は、図4に示すテーブルT1においてファイル番号iと対応づけられた格納場所からファイルを読み出す。文字列検索部16は、読み出したファイルFiを検索文字列で検索する(S207)。例えば、文字列検索部16は、ファイルFi内に検索文字列と一致する文字列を検出した場合には、一致した文字列のファイルFi内の位置を示す情報を生成し、ファイルFiのファイル番号iと関連付けて記憶部12に記憶する(図13参照)。例えば、検索文字列と照合を行なったデータの量をカウントするカウンタを予め設けておき、文字列の一致を検出した際のカウンタの値を、ファイル内の位置を示す情報とする。
S207の処理後、検索制御部14は、判定部152により生成された番号x,y,・・・のなかで未選択の番号があればS205の処理を行なう。検索制御部14は、判定部152により生成された番号x,y,・・・のなかに未選択の番号がない場合には、S210の処理を行なう。
検索制御部14は、検索結果の出力処理を行なう(S209)。例えば、S207の処理で図13に示すテーブルT2に格納された情報に示される位置の近傍の文字列を抽出して、抽出した文字列を、ファイル番号に対応するファイル名などと併せて表示デバイスに表示させるなどの処理を行なう。
S210処理後に、処理部11は、終了の指示があったか否かを判断する(S210)。終了の指示がない場合(S210:NO)には、検索制御部14はS202の処理を行なう。終了の指示があった場合(S210:YES)には、処理部11は、検索処理プログラム22bを終了させる(S211)。
図13には、検索文字列に一致する文字情報の位置のリストを示す。文字列検索部16は、S207の文字列検索において検索文字列と一致する文字情報が存在する場合に、一致した文字列のファイルFi内の位置を示す情報を生成し、ファイルFiのファイル番号iと関連付けてテーブルT2に記憶する。テーブルT2は、検索制御部14が検索結果を出力する際に、参照される。
図10に示すS106の判定処理の手順について、さらに説明する。図14A及び図14Bは、S106の処理手順を示す。判定処理が開始される(S400)と、判定部133は、ファイルFiから文字情報を読み出す(S401)。データの読出し単位は、例えば、タグ情報単位や1文字分の文字情報単位などである。次に、判定部133は、S401で読みだしたデータがタグ情報以外であるか否かを判定する(S402)。
S401で読みだした文字情報がタグ情報であった場合(S402:NO)に、判定部133は、読みだしたタグ情報が<rb>タグであるか否かを判定する(S412)。判定部133は、読みだしたタグ情報が<rb>タグである場合(S412:YES)には、記憶領域に格納された状態情報をコピーする(S413)。複製先のアドレスは、上述の通り、複製の多重度d及び複製元のアドレスにより定められる。さらに、判定部133は、複製の多重度dを更新する(S414)。例えば、複製の多重度dの初期値は0であり、複製が行なわれるたびにインクリメントされる。判定部133は、多重度dを確認し、記憶領域のアドレスのうち、下位からd(dは多重度)番目の桁が「0」である状態情報を更新対象とする(S415)。すなわち、直前に行われたS413のコピーにおける複製元の状態情報が更新対象となる。
判定部133は、読みだしたタグ情報が<rb>タグでない場合(S412:NO)には、読みだしたタグ情報が<rt>タグであるか否かを判定する(S416)。読み出したタグ情報が<rt>である場合(S416:YES)は、判定部133は、多重度dを確認し、記憶領域のアドレスのうち、下位からd(dは多重度)番目の桁が「1」である状態情報を更新対象とする(S417)。
読み出したタグ情報が<rt>でない場合(S416:NO)は、判定部133は、読み出したタグ情報が</ruby>タグであるか否かを判定する(S418)。読み出したタグ情報が</ruby>タグである場合(S418:YES)には、記憶領域に記憶されたすべての状態情報を更新対象とする(S419)。S419において、判定部133は、さらに、重複した状態情報の削除許可を示すフラグをセットする。このフラグは、後述するS408で参照される。読み出したタグ情報が</ruby>タグでない場合(S418:NO)には、判定部133は、読み出したタグに対応する終了タグまでS401における文字情報読出しの読出し位置を進める(S420)。S415、S417、S419及びS420のいずれかが行われると、再度S401の文字情報読み出し処理が行われる。
S401でタグ情報でなく、文字情報を読み出した場合(S402:YES)には、判定部133は、更新対象の状態情報から1つ選択する(S403)。照合処理開始時点では、更新対象の状態情報は、記憶領域000に記憶された状態情報である。S413の処理で状態情報がコピーされた後にはS415、S417またはS420などにより更新対象の状態情報を定められる。
S403で状態情報を選択すると、判定部133は、読み出した文字情報についての照合処理を行い、選択した状態情報の更新を行なう(S404)。この更新は、判定部133が、選択した状態情報の遷移条件(オートマトンにより定められる)を取得し、取得した遷移条件を満たすか否かに応じて遷移先状態を決定し、選択した状態情報を遷移先状態に更新することで行なわれる。
S404で状態情報の更新が行われると、判定部133は、S404で更新が行われた状態情報が「F」を示すか否かを判定する(S405)。「F」は、オートマトンの終点を示す状態である。S405の判定で、状態情報が「F」である場合(S405:NO)には、S106の判定処理において、文字情報CjがファイルFiに含まれる旨の判断(S106:YES)を行なう(S411)。
S405の判定で、状態情報が「F」でない場合(S405:YES)には、判定部133は、更新対象の状態情報のうち、未選択の状態情報があるか否か判定する。未選択の状態情報がある場合には、照合部17は、再度S403の処理を行ない、未選択の状態情報を選択する(S406)。未選択の状態情報がない場合には、判定部133は、S408の処理を行なう。
判定部133は、記憶領域に格納された状態情報のうち、重複して同じ状態情報を示す状態情報が存在するか否かを判定する(S407)。判定部133は、重複する状態情報が存在する場合には、S419の処理により、重複した状態情報の削除許可を示すフラグがセットされているかを確認する。削除許可を示すフラグがセットされていれば、重複する状態情報を記憶する記憶領域を解放し、さらに、更新対象の状態情報から除く(S408)。さらに、判定部133は、S408の処理により状態情報が1つのみになった場合には、削除許可を示すフラグをクリアする。S407の処理で重複する状態情報が存在しない場合(S407:NO)、もしくはS408の処理が行われた場合には、判定部133は、ファイルFiから読み出す文字情報があるか否かが判定する(S409)。ファイルFi内に読み出す文字情報が存在する場合(S409:YES)には、判定部133は、S401の処理を再度行なう。ファイルFi内に読み出す文字情報が存在しない場合(S409:NO)には、判定部133は、S106の判定処理を終了し、文字情報CjがファイルFiに含まれない旨の判断(S106:NO)を行なう(S410)。
オートマトンを用いた判定処理について、さらに説明する。図19は、図6Aに示すオートマトンのデータ構造例である。図6B、図6C、図16A及び図16Bに示すオートマトンについても同様のデータ構造が用いられる。図19に示すテーブルT3は、とり得る遷移元状態それぞれについて、遷移条件1及び遷移先状態1の組み合わせ、遷移条件2及び遷移先状態2の組み合わせ、並びに遷移先状態3を関連付ける。判定部133は、記憶領域に記憶された状態情報を一致する遷移元状態を含むレコードをテーブルT3から抽出する。次に、判定部133は、抽出したレコードに含まれる遷移条件を、ファイルFiから読み出した文字情報が満たすか否か判定する。判定部133は、遷移条件1か遷移条件2のいずれかが満たされた場合に、状態情報を、抽出したレコードに含まれ、満たされた遷移条件に対応する遷移先状態に更新する。判定部133は、いずれの遷移条件も満たされない場合に、状態情報を、抽出したレコードに含まれる遷移先状態3に更新する。
図20は、オートマトンの生成手順例を示す。オートマトンは生成部13によるインデックス生成と、文字列検索部16による文字列検索に用いられる。生成部13は、例えば、図10に示すS101において、文字情報群C1〜Cmの各文字情報について、オートマトンを生成する。もしくは、図10に示すS104で文字情報が選択された場合に、選択された文字情報についてオートマトンを生成する。
図11に示すフローは、「七夕まつり」のように、検索文字列内で文字情報が繰り返される部分を含まない場合に用いることができる。例えば、「でんでん虫」などの文字列は、文字情報の繰り返しを含む(「でん」が繰り返されている)。「でんでん虫」という検索文字列についてオートマトンを生成する場合には、図11と異なるフローを用いる。図11に例示したフローを用いると、「…でんでんでん虫…」などの文字列が照合対象にふくまれていた場合には、「でんでん」まで状態が遷移し、その次の文字「で」が「虫」と一致しないために、状態を初期状態に戻してしまうオートマトンが生成される。初期状態に戻されると、残りの文字列は「でん虫」であるので、「でんでん虫」と一致しないことになってしまう。上記のことから、「でんでん虫」などの検索文字列中に文字情報の繰り返しを含む文字列にも対応するためには、他のフローが用いられてよい。
オートマトンの生成処理が開始される(S500)と、まず、生成部13は、文字情報群C1〜Cmから文字情報Cjを取得する(S501)。次に、生成部13は、取得した文字情報Cjの長さNを計数する(S502)。生成部13は、0〜N−1までの整数iを順に選択し、S504〜S510の処理を繰り返し行なう(S503)。
生成部13は、テーブルT3に1レコード追加する(S504)。生成部13は、S504で生成したレコードの遷移元状態を、S503で選択した整数「i」にする(S505)。さらに、生成部13は、S504で生成したレコードの遷移条件1を、S501で取得した検索文字列のi+1番目の文字にする(S506)。
次に、生成部13は、整数iがN−1であるか否か判定する(S507)。整数iがN−1である場合(S507:YES)には、S504で生成したレコードの遷移先状態1を「F(照合完了を示す情報)」とする(S508)。また、生成部13は、整数iがN−1でない場合(S507:NO)には、S504で生成したレコードの遷移先状態1を「i+1」とする(S509)。
さらに、生成部13は、S504で生成したレコードの遷移条件2を検索文字列の1番目の文字とし、遷移先状態2は1とし、遷移先状態3を「0」とする(S510)。S510の処理後、生成部13は、iがN−1であるか否か判定し、N−1でなければ、S503で次の整数を選択し、S504〜S510の処理を行なう(S511)。iがN−1であれば、生成部13はオートマトン生成処理を終了する(S512)。
図6A−C及び図7A−Cに示す判定によるインデックス生成手順と異なる他のインデックス生成手順を説明する。上述のインデックス生成においては、あるファイルFiに対し、文字情報C1〜Cmを順次選択し、選択した文字情報CjがファイルFiに存在するか否かを判定し、判定結果をインデックス情報に反映させる。すなわち、文字情報CjがファイルFiに存在すると判定した場合に、文字情報Cj及びファイルFiに対応するビットを「1」に更新する。図15A―Cに説明するインデックス生成手順においては、ファイルFiから文字情報を読出し、インデックス情報のために確保された記憶領域のうち、読み出した文字情報に対応する箇所のビットを「1」に更新してインデックス情報を生成する。
他のインデックス情報生成手順においては、判定部133は、記憶領域000〜011を確保し、この記憶領域のそれぞれに読み出した文字情報を格納する。図15の例では、生成部13が、2文字の文字情報ごとに、各ファイルに含まれるか否かを示すビット列を生成するとする。判定部133が2文字分の文字情報を各記憶領域に格納するたびに、制御部131は、各記憶領域に格納された文字情報に対応するビットの値を「1」に更新する。判定部133は、文字を読み出すたびに、先に記憶領域に格納された文字情報を、読み出した文字情報でスライドさせた文字情報を格納する。読み出した文字情報の格納先は、例えば、<rb>タグ、<rt>タグ、</ruby>タグなどの読出しに応じて制御される。
図15A−Cは、ファイルFi中の「賑わう七夕祭り」(ルビは省略)という記述D3について行なわれるインデックス生成処理についての説明図である。記憶領域が空の状(S1)において、判定部133は、ファイルFiから「賑」を読み出すと、記憶領域000に「賑」を格納する(S2)。さらに、「わ」を読み出すと、判定部133は、記憶領域000に「賑わ」を格納する(S3)。制御部131は、記憶領域000に2文字分の文字情報が格納されたので、インデックス情報内で、文字情報「賑わ」に対応するビット列のi番目のビットの値を「1」に更新する。同様に、判定部133は、「う」を読み出すと、記憶領域000を「わう」に更新し(S4)、制御部131は、「わう」に対応するビット列のi番目のビットを「1」に更新する。
次に、判定部133は、<rb>タグを読み出すと、記憶領域000に記憶されている文字情報を記憶領域001にコピーする(S5)。このコピーにより複製の多重度dは1となる。コピーの契機となるタグ情報と、コピー先のアドレスは、図7A−Cに示す手順と同様で良い。判定部133は、「七」を読み出すと、記憶領域000に「う七」を格納し、「夕」を読み出すと、記憶領域000に「七夕」を格納する(S6、S7)。制御部131は、判定部133が「う七」、「七夕」を格納するたびに、インデックス情報中の対応するビットの値を「1」に更新する。
判定部133は、<rt>タグを読み出すと、更新対象の記憶領域を、記憶領域000から記憶領域001に切り替える(S8)。判定部133は、「た」、「な」、「ば」、「た」それぞれの読み出しに応じて、記憶領域001に、「うた」、「たな」、「なば」、「ばた」と順次格納する(S9、S10、S11、S12)。制御部131は、判定部133が「うた」、「たな」、「なば」、「ばた」と順次記憶領域001に格納するたびに、インデックス情報中の対応するビットの値を「1」に更新する。
判定部133は、<rb>タグを読み出すと、さらに記憶領域のコピーを行なう(S13)。このコピーにより複製の多重度dは2となる。判定部133は、次に「祭」を読み出すと、アドレスの下位からd番目の値が「0」である記憶領域を対象に更新処理を行なう。判定部133は、記憶領域000には「夕祭」を、記憶領域001には「た祭」を格納する(S14)。制御部131は、判定部133が「夕祭」と記憶領域001に格納すると、インデックス情報中の対応するビットの値を「1」に更新し、「た祭」と記憶領域001に格納すると、インデックス情報中の対応するビットの値を「1」に更新する。
判定部133は、<rt>を読出し、更新対象の記憶領域を、アドレスの下位からd番目の値が「0」である記憶領域から、アドレスの下位からd番目の値が「1」である記憶領域に切り替える(S15)。判定部133は、「ま」、「つ」のそれぞれの読み出しに応じて、記憶領域010に「夕ま」、「まつ」を格納し、記憶領域011に「たま」、「まつ」を格納する(S16、S17)。制御部131は、判定部133の記憶領域への「夕ま」、「まつ」、「たま」の書き込みに応じて、インデックス情報中の対応するビットの値を「1」に更新する。
判定部133は、</ruby>を読み出すと、更新対象の記憶領域を、記憶領域000〜011とする。さらに、判定部133は、「り」を読み出すと、記憶領域000に「祭り」、記憶領域001に「祭り」、記憶領域010に「つり」、記憶領域011に「つり」を格納する(S18)。制御部131は、判定部133の記憶領域への「祭り」、「つり」の書き込みに応じて、インデックス情報中の対応するビットの値を「1」に更新する。判定部133は、記憶領域内で重複する文字情報を削除する(S19)。記憶領域001に格納された「祭り」と、記憶領域011に記憶された「つり」が削除される。
図15A−Cに示される上記の手順により、ファイルFi中の「賑わう七夕祭り」(ルビは省略)に含まれる2文字の文字情報のそれぞれが、インデックス情報に反映される。
上述の説明においては、漢字に対する振り仮名を表示させることを例にあげたが、これに限定するものでなく、カタカナに振り仮名を平仮名で付与してもよいし、中国語の漢字表記にピン音を付与してもよい。さらに、ルビは英語にも用いられ、上述の実施例は英語についても実施可能である。例えば、「BIOS」について、先述の通り、ファイルFi内で記述D2のように表現されることがある。その一方で、検索文字列は、例えば、「BIOS」と入力されるかもしれないし、「BASIC INPUT/OUTPUT SYSTEM」と入力されるかもしれないし、「BASIC IO SYSTEM」と入力されるかもしれない。
検索文字列が「BIOS」である場合には、例えば、インデックス情報内の「BIOS」に対応するビット列に基づいて、文字列検索の対象のファイルが絞りこまれる。例えば、検索文字列が「BASIC IO SYSTEM」である場合には、例えば、インデックス情報内の「BASI」、「ASIC」、・・・、「ICIO」、「CIOS」、・・・、「STEM」それぞれに対応するビット列に基づいて、文字列検索の対象のファイルが絞りこまれる。
図16Aは、文字情報「BIOS」がファイルに含まれるか否かの判定に用いられるオートマトンを示す。初期状態(0)における遷移条件1(対応する遷移先状態1は「1」)は「B」である。状態(1)における遷移条件1(対応する遷移先状態は「2」)は「I」であり、遷移条件2(対応する遷移先状態2は「1」)は「B」である。状態(2)における遷移条件1(対応する遷移先状態は「3」)は「O」であり、遷移条件2(対応する遷移先状態2は「1」)は「B」である。状態(3)における遷移条件1(対応する遷移先状態は「F」)は「S」であり、遷移条件2(対応する遷移先状態2は「1」)は「B」である。
図16Bは、文字情報「CIOS」がファイルに含まれるか否かの判定に用いられるオートマトンを示す。初期状態(0)における遷移条件1(対応する遷移先状態は「1」)は「C」である。状態(1)における遷移条件1(対応する遷移先状態は「2」)は「I」であり、遷移条件2(対応する遷移先状態2は「1」)は「B」である。状態(2)における遷移条件1(対応する遷移先状態は「3」)は「O」であり、遷移条件2(対応する遷移先状態2は「1」)は「B」である。状態(3)における遷移条件1(対応する遷移先状態は「F」)は「S」であり、遷移条件2(対応する遷移先状態2は「1」)は「B」である。
図17A及びBは、「BIOS」がファイルFi内の記述D2に含まれるか否かの判定手順の説明図である。判定部133は、図16Aに示すオートマトンに基づいて、記憶領域に記憶される状態情報を更新する。
記述D2の読出し前は、記憶領域0000に初期状態(0)を示す状態情報が格納されているのみであるとする(S1)。判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000に格納された状態情報を記憶領域0001にコピーする(S2)。ここで、判定部133は、多重度dを「1」とする。次に、判定部133は、「B」を読み出すと、図16Aに示すオートマトンに従って記憶領域0000に記憶された状態情報を更新する。初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0000に記憶される状態情報は、状態(1)となる(S3)。判定部133は、<rt>を読み出すと、更新対象の記憶領域を0001に切り替える。判定部133は、「B」、「A」、「S」、「I」、「C」のそれぞれの読出しに応じて、記憶領域0001に記憶された状態情報を更新する。結果的に、記憶領域0001の状態情報は、初期状態(0)に更新される(S4)。
判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000及び記憶領域0001に格納された状態情報を記憶領域0010及び記憶領域0011にコピーする(S5)。ここで、判定部133は、多重度dを「2」とする。次に、判定部133は、「I」を読み出すと、図16Aに示すオートマトンに従って記憶領域0000に記憶された状態情報を更新する。状態(1)から状態(2)への遷移条件は「I」であるので、記憶領域0000に記憶される状態情報は、状態(2)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0001に記憶される状態情報は、初期状態(0)となる(S6)。判定部133は、<rt>を読み出すと、更新対象の記憶領域を0010及び記憶領域0011に切り替える。判定部133は、「I」、「N」、「P」、「U」、「T」、「/」のそれぞれの読出しに応じて、記憶領域0010及び記憶領域0011に記憶された状態情報を更新する。結果的に、記憶領域0010及び記憶領域0011の状態情報は、初期状態(0)に更新される(S7)。
判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000〜0011に格納された状態情報を記憶領域0100〜0111にコピーする(S8)。ここで、判定部133は、多重度dを「3」とする。次に、判定部133は、「O」を読み出すと、図16Aに示すオートマトンに従って記憶領域0000に記憶された状態情報を更新する。状態(2)から状態(3)への遷移条件は「O」であるので、記憶領域0000に記憶される状態情報は、状態(3)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0001〜0011に記憶される状態情報は、初期状態(0)となる(S9)。判定部133は、<rt>を読み出すと、更新対象の記憶領域を0100〜0111に切り替える(S10)。判定部133は、「O」、「U」、「T」、「P」、「U」、「T」のそれぞれの読出しに応じて、記憶領域0100〜0111に記憶された状態情報を更新する。結果的に、記憶領域0100〜0111の状態情報は、初期状態(0)に更新される(S11)。
判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000〜0111に格納された状態情報を記憶領域1000〜1111にコピーする(S12)。ここで、判定部133は、多重度dを「4」とする。次に、判定部133は、「S」を読み出すと、図16Aに示すオートマトンに従って記憶領域0000に記憶された状態情報を更新する。状態(3)から状態(F)への遷移条件は「S」であるので、記憶領域0000に記憶される状態情報は、状態(F)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0001〜0111に記憶される状態情報は、初期状態(0)となる(S13)。記憶領域0000に記憶された状態情報が、状態(F)を示すので、判定部133は、ファイルFiが「BIOS」を含むと判断する。
図18は、「CIOS」がファイルFi内の記述D2に含まれるか否かの判定手順の説明図である。判定部133は、図16Bに示すオートマトンに基づいて、記憶領域に記憶される状態情報を更新する。
判定部133は、ファイルFiからの<rb>タグの読み出しにより、記憶領域0000に格納された状態情報を記憶領域0001にコピーする(S1)。ここで、判定部133は、多重度dを「1」とする。次に、判定部133は、「B」、「A」、「S」、「I」、「C」を順に読み出すと、図16Bに示すオートマトンに従って記憶領域0001に記憶された状態情報を更新する。初期状態(0)から状態(1)への遷移条件は「c」であるので、記憶領域0001に記憶される状態情報は、状態(1)となる(S2)。
判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000及び記憶領域0001に格納された状態情報を記憶領域0010及び記憶領域0011にコピーする(S3)。ここで、判定部133は、多重度dを「2」とする。次に、判定部133は、「I」を読み出すと、図16Bに示すオートマトンに従って記憶領域0000及び記憶領域0001に記憶された状態情報を更新する。状態(1)から状態(2)への遷移条件は「I」であるので、記憶領域0001に記憶される状態情報は、状態(2)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0000に記憶される状態情報は、初期状態(0)となる(S4)。判定部133は、<rt>を読み出すと、更新対象の記憶領域を0010及び記憶領域0011に切り替える。判定部133は、「I」、「N」、「P」、「U」、「T」、「/」のそれぞれの読出しに応じて、記憶領域0010及び記憶領域0011に記憶された状態情報を更新する。結果的に、記憶領域0010及び記憶領域0011の状態情報は、初期状態(0)に更新される(S5)。
判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000〜0011に格納された状態情報を記憶領域0100〜0111にコピーする(S6)。ここで、判定部133は、多重度dを「3」とする。次に、判定部133は、「O」を読み出すと、図16Bに示すオートマトンに従って記憶領域0000〜0011に記憶された状態情報を更新する。状態(2)から状態(3)への遷移条件は「O」であるので、記憶領域0001に記憶される状態情報は、状態(3)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0000、0010及び0011に記憶される状態情報は、初期状態(0)となる(S7)。判定部133は、<rt>を読み出すと、更新対象の記憶領域を0100〜0111に切り替える。判定部133は、「O」、「U」、「T」、「P」、「U」、「T」のそれぞれの読出しに応じて、記憶領域0100〜0111に記憶された状態情報を更新する。結果的に、記憶領域0100〜0111の状態情報は、初期状態(0)に更新される(S8)。
判定部133は、ファイルFiから<rb>タグを読み出すと、記憶領域0000〜0111に格納された状態情報を記憶領域1000〜1111にコピーする(S9)。ここで、判定部133は、多重度dを「4」とする。次に、判定部133は、「S」を読み出すと、図16Bに示すオートマトンに従って記憶領域0000〜0111に記憶された状態情報を更新する。状態(3)から状態(F)への遷移条件は「S」であるので、記憶領域0001に記憶される状態情報は、状態(F)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域0000及び0010〜0111に記憶される状態情報は、初期状態(0)となる(S10)。記憶領域0001に記憶された状態情報が、状態(F)を示すので、判定部133は、ファイルFiが「CIOS」を含むと判断する。
判定部133が判定処理を続けたとすると、判定部133は、<rt>を読み出すと、更新対象の記憶領域を1000〜1111に切り替える。判定部133は、「S」の読出しに応じて、記憶領域1000〜1111に記憶された状態情報を更新する。状態(3)から状態(F)への遷移条件は「S」であるので、記憶領域1001に記憶される状態情報は、状態(F)となる。また、初期状態(0)から状態(1)への遷移条件は「B」であるので、記憶領域1000及び1010〜1111に記憶される状態情報は、初期状態(0)となる(S11)。
上述の実施形態を適用することにより、検索文字列が「BIOS」、「BASIC INPUT/OUTPUT SYSTEM」及び「BASIC IO SYSTEM」のいずれであっても、ファイルFiを検索文字列と合致する文字情報として抽出可能となる。
以上の実施形態に関し、さらに以下の付記を開示する。
(付記1)
コンピュータに、
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報を生成し、
前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報を生成する、
処理を実行させることを特徴とする生成プログラム。
(付記2)
前記コンピュータに、さらに、
前記第1の文字情報の末尾部分に前記第2の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報の生成を抑止する、
処理を実行させることを特徴とする付記1に記載の生成プログラム。
(付記3)
前記併記が指定されている場合に、前記第2の文字情報に前記第3の文字情報が後続し、さらに、前記第4の文字情報に後続する他の文字情報が後続する文字情報が前記ファイルに含まれる旨を示す情報を生成する、
処理を実行させることを特徴とする付記1または付記2に記載の生成プログラム。
(付記4)
前記ファイル内に、前記第1の文字情報、前記第2の文字情報、前記第3の文字情報、前記第4の文字情報、前記他の文字情報の順で文字情報が含まれている、
ことを特徴とする付記1〜付記3のいずれか1つに記載の生成プログラム。
(付記5)
前記第1の表記はルビの親文字での表記であり、前記第2の表記はルビ文字での表記である、
ことを特徴とする付記1〜4のいずれか1つに記載の生成プログラム。
(付記6)
コンピュータに、
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報を生成し、
前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報を生成する、
処理を実行させることを特徴とする生成方法。
(付記7)
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報を生成する生成部と、
前記生成部が生成した情報を、前記文字情報と前記ファイルとに関連付けて記憶する記憶部とを含み、
前記生成部は、
前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報を生成する、
ことを特徴とする生成装置。
(付記8)
コンピュータに、
検索文字列に含まれる文字情報を抽出し、
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報と、前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報と、を含むインデックス情報が記憶された記憶部を参照して、抽出した前記文字情報に対応する情報を取得し、
取得した情報に、抽出した前記文字情報が前記ファイルに含まれている旨が示される場合に、前記ファイルに対して前記検索文字列に基づく文字列検索を行なう、
処理を実行させることを特徴とする検索プログラム。
(付記9)
コンピュータに、
検索文字列に含まれる文字情報を抽出し、
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報と、前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報と、を含むインデックス情報が記憶された記憶部を参照して、抽出した前記文字情報に対応する情報を取得し、
取得した情報に、抽出した前記文字情報が前記ファイルに含まれている旨が示される場合に、前記ファイルに対して前記検索文字列に基づく文字列検索を行なう、
処理を実行させることを特徴とする検索方法。
(付記10)
検索文字列に含まれる文字情報を抽出する抽出部と、
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報と、前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報と、を含むインデックス情報を記憶する記憶部と、
前記記憶部に記憶されたインデックス情報のうち、抽出した前記文字情報に対応する情報を取得し、取得した情報に、抽出した前記文字情報が前記ファイルに含まれている旨が示される場合に、前記ファイルに対して前記検索文字列に基づく文字列検索の対象とする絞込部と、
を含むことを特徴とする検索装置。
(付記11)
プロセッサとメモリとを含む生成装置であって、
前記プロセッサは、
ファイル内に存在する複数の連続する文字を含む文字情報が前記ファイルに含まれる旨を示す情報を前記メモリに格納し、
前記ファイルに、ある言語単位の第1の表記である第1の文字情報及び前記ある言語単位の第2の表記である第2の文字情報の併記に続いて、他の言語単位の前記第1の表記である第3の文字情報及び前記他の言語単位の前記第2の表記である第4の文字情報の併記が指定されている場合に、前記第1の文字情報の末尾部分に前記第4の文字情報の冒頭部分が後続する文字情報が前記ファイルに含まれる旨を示す情報を前記メモリに格納する。