(57)【要約】【課題】  電子化されたテキストに、正規表現を用いて記述された所定の文字列が含まれるか否かを判定し、その位置を求める検索装置において、テキストを構成する部分文字列を圧縮ブロックに置換することにより圧縮した圧縮ブロック列からの検索を、効率よく高速に行う。【解決手段】  検索に、ＤＦＡ（有限オートマトン）を利用する。圧縮ブロック列（符号列）から圧縮ブロック（符号）を取得し（Ｓ２１）、その圧縮ブロックに対応する部分文字列が初出なら、部分文字列に展開して、ＤＦＡに入力し、そのときのＤＦＡの状態遷移の履歴（状態履歴）を記憶しておく（Ｓ２６１〜Ｓ２６４）。同じ部分文字列に対応する圧縮ブロックは展開せず、状態履歴を参照して、ＤＦＡの状態を更新する（Ｓ２５１〜Ｓ２５４）。【選択図】        図１５
2006302082.tif 000002
【特許請求の範囲】
【請求項１】
状態を保持し、文字を入力し、上記保持した状態と上記入力した文字とに基づいて遷移先状態を算出し、上記保持した状態を上記算出した遷移先状態に更新するオートマトンであって、所定の文字列を構成する文字を入力した場合に、上記記憶した状態が所定の状態となるか否かを判別することにより、所定の検索パターンに対応する検索文字列が上記文字列に含まれるか否かを判別できるよう構成したオートマトンを実行することによって、
上記文字列に含まれる部分文字列を上記部分文字列に対応する所定の符号に置換した符号列を取得して、上記文字列から上記検索文字列を検索する文字列検索装置において、
上記オートマトンを実行するオートマトン実行部と、
上記オートマトンが保持した状態を状態履歴として記憶する履歴記憶部と、
上記符号列を構成する符号を取得する符号取得部と、
上記オートマトンが保持する状態と上記履歴記憶部が記憶した状態履歴と上記符号取得部が取得した符号とに基づいて、第一の条件及び第二の条件を満たすか否かを判断する条件判断部と、
上記条件判断部が第一の条件を満たすと判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて遷移先状態を算出し、上記オートマトンが保持した状態を、算出した遷移先状態に更新する遷移先算出部と、
上記条件判断部が第二の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を復元し、上記部分文字列を構成する文字を上記オートマトンに入力する文字列復元部と、
を有することを特徴とする文字列検索装置。
【請求項２】
上記オートマトン実行部は、
上記遷移先状態を一意に算出することができるオートマトンを実行する
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項３】
上記オートマトン実行部は、
文字の連結及び選択及び繰り返しのうち少なくともいずれかを表現した検索パターンに対応する検索文字列を検索できるよう構成したオートマトンを実行する
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項４】
上記文字列検索装置は、上記文字列に含まれる部分文字列と上記文字列に含まれる他の部分文字列とが一致する場合に上記部分文字列を上記他の部分文字列へのポインタの情報を含む符号に置換した符号列を取得する文字列検索装置であって、
上記文字列復元部は、
上記符号取得部が取得した符号が上記他の部分文字列へのポインタの情報を含むと判断した場合に、上記他の部分文字列を上記符号に対応する部分文字列として復元し、
上記符号取得部が取得した符号が上記他の部分文字列へのポインタの情報を含まないと判断した場合に、上記符号に対応する文字を上記符号に対応する文字列として復元する
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項５】
上記文字列検索装置は、更に、
部分文字列と上記部分文字列に対応する符号との対応関係を置換辞書として記憶する辞書記憶部
を有し、
上記文字列復元部は、
上記辞書記憶部が記憶した置換辞書に基づいて、上記符号に対応する部分文字列を求める
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項６】
上記符号取得部は、
上記置換辞書の情報を含む符号列から、上記符号列を構成する符号を取得し、
上記辞書記憶部は、
上記符号取得部が取得した符号から上記置換辞書の情報を取得して記憶する
ことを特徴とする請求項５に記載の文字列検索装置。
【請求項７】
上記条件判断部は、
上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記第一の条件を満たさないと判断した場合に、上記第二の条件を満たすと判断し、
上記遷移先算出部は、
上記条件判断部が第一の条件を満たすと判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態を取得して遷移先状態とし、上記オートマトンが保持した状態を上記遷移先状態に更新し、
上記履歴記憶部は、
上記条件判断部が上記第二の条件を満たすと判断した場合に、上記オートマトンが保持した状態を状態履歴として記憶し、
上記条件判断部が上記第一の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力したときに上記オートマトンが保持していた状態を、上記状態履歴から取得して、状態履歴として記憶する
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項８】
上記条件判断部は、
上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を上記オートマトンに入力する前に上記オートマトンが記憶していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記第一の条件を満たさないと判断した場合に、上記第二の条件を満たすと判断し、
上記遷移先算出部は、
上記条件判断部が第一の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態を、上記履歴記憶部が記憶した状態履歴から取得して遷移先状態とし、上記オートマトンが記憶した状態を上記遷移先状態に更新し、
上記履歴記憶部は、
上記条件判断部が上記第二の条件を満たすと判断した場合に、上記符号取得部が取得した符号と上記オートマトンが保持した状態とを対応づけて状態履歴として記憶する
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項９】
上記文字列検索装置は、更に、
部分文字列と上記部分文字列に対応する符号との対応関係を置換辞書として記憶し、前方文字列と後方文字列とから構成される部分文字列について、上記前方文字列に対応する符号及び上記後方文字列と上記部分文字列に対応する符号との対応関係を置換辞書として更に記憶する辞書記憶部
を有し、
上記文字列復元部は、上記条件判断部が第二の条件を満たすと判断した場合において、
上記辞書記憶部が上記部分文字列を上記符号に対応して記憶している場合に、上記部分文字列を求め、上記部分文字列を構成する文字を上記オートマトンに入力し、
上記辞書記憶部が上記前方文字列に対応する符号及び後方文字列を上記符号に対応して記憶している場合に、上記前方文字列に対応する符号及び後方文字列を求め、上記後方文字列を構成する文字を上記オートマトンに入力し、
上記符号取得部は、更に、
上記文字列復元部が求めた前方文字列に対応する符号を、上記符号として取得する
ことを特徴とする請求項８に記載の文字列検索装置。
【請求項１０】
上記文字列検索装置は、上記オートマトンに入力する文字のビット長とは異なるビット長を有する文字から構成される部分文字列を上記部分文字列に対応する符号で置換した符号列を取得する文字列検索装置であって、更に、
未完文字を記憶する未完文字記憶部
を有し、
上記文字列復元部は、
上記復元した部分文字列に、上記ビット長の不一致により上記オートマトンに入力できない文字があるか否かを判断し、あると判断した場合に、上記未完文字として上記未完文字記憶部に記憶させる
ことを特徴とする請求項１に記載の文字列検索装置。
【請求項１１】
上記条件判断部は、
上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を上記オートマトンに入力する前に上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較し、上記取得した未完文字と上記未完文字記憶部が記憶した未完文字とを比較し、両者ともに一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記第一の条件を満たさないと判断した場合に、上記第二の条件を満たすと判断し、
上記遷移先算出部は、
上記条件判断部が第一の条件を満たすと判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態を取得して遷移先状態とし、上記オートマトンが保持した状態を上記遷移先状態に更新し、
上記履歴記憶部は、
上記条件判断部が上記第二の条件を満たすと判断した場合に、上記オートマトンが保持した状態及び上記未完文字記憶部が記憶した未完文字を状態履歴として記憶し、
上記条件判断部が上記第一の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力したときに上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記状態履歴から取得して、状態履歴として記憶する
ことを特徴とする請求項１０に記載の文字列検索装置。
【請求項１２】
上記条件判断部は、
上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を上記オートマトンに入力する前に上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較し、上記取得した未完文字と上記未完文字記憶部が記憶した未完文字とを比較し、両者ともに一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記第一の条件を満たさないと判断した場合に、上記第二の条件を満たすと判断し、
上記遷移先算出部は、
上記条件判断部が第一の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態を、上記履歴記憶部が記憶した状態履歴から取得して遷移先状態とし、上記オートマトンが記憶した状態を上記遷移先状態に更新し、
上記履歴記憶部は、
上記条件判断部が上記第二の条件を満たすと判断した場合に、上記符号取得部が取得した符号と上記オートマトンが保持した状態及び上記未完文字記憶部が記憶した未完文字とを対応づけて状態履歴として記憶する
ことを特徴とする請求項１０に記載の文字列検索装置。
【請求項１３】
上記文字列検索装置は、更に、
上記未完文字記憶部が未完文字を記憶している場合に、上記符号取得部が取得した符号に対応する部分文字列のうち、上記未完文字と結合して上記オートマトンに入力できる文字となる部分を他の未完文字として復元し、上記未完文字と、上記他の未完文字とを結合した文字を上記オートマトンに入力する未完文字復元部
を有する
ことを特徴とする請求項１０に記載の文字列検索装置。
【請求項１４】
上記条件判断部は、
上記未完文字復元部が上記オートマトンに文字を入力しない場合に、上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記未完文字復元部が上記オートマトンに文字を入力した場合に、上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字のうち上記未完文字復元部が復元した他の未完文字を除いた部分を上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記第一の条件を満たさないと判断した場合に、上記第二の条件を満たすと判断し、
上記遷移先算出部は、
上記条件判断部が第一の条件を満たすと判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態を取得して遷移先状態とし、上記オートマトンが保持した状態を上記遷移先状態に更新し、
上記履歴記憶部は、
上記条件判断部が上記第二の条件を満たすと判断した場合に、上記オートマトンが保持した状態及び上記未完文字記憶部が記憶した未完文字を状態履歴として記憶し、
上記条件判断部が上記第一の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力したときに上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記状態履歴から取得して、状態履歴として記憶する
ことを特徴とする請求項１３に記載の文字列検索装置。
【請求項１５】
上記条件判断部は、
上記未完文字復元部が上記オートマトンに文字を入力しない場合に、上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記未完文字復元部が上記オートマトンに文字を入力した場合に、上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字のうち上記未完文字復元部が復元した他の未完文字を除く部分を上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致すると判断した場合に、上記第一の条件を満たすと判断し、
上記第一の条件を満たさないと判断した場合に、上記第二の条件を満たすと判断し、
上記遷移先算出部は、
上記条件判断部が第一の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態を、上記履歴記憶部が記憶した状態履歴から取得して遷移先状態とし、上記オートマトンが記憶した状態を上記遷移先状態に更新し、
上記履歴記憶部は、
上記条件判断部が上記第二の条件を満たすと判断した場合に、上記符号取得部が取得した符号と上記オートマトンが保持した状態及び上記未完文字記憶部が記憶した未完文字とを対応づけて状態履歴として記憶する
ことを特徴とする請求項１３に記載の文字列検索装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、文書の中から所定の文字列を検索する技術に関する。
【背景技術】
【０００２】
近年様々な分野で文書の電子化が進んでいる。大量の電子化された文書が利用されるに伴って、次のような課題も出てきている。
【０００３】
第一の課題は、大量に存在する文書の中から、所望の文書を見つけ出すことが困難になるということである。そのため、電子化された文書を効率的に検索する方式が求められている。
この課題を解決する技術としては、ＤＦＡ（Ｄｅｔｅｒｍｉｎｉｓｔｉｃ  Ｆｉｎｉｔｅ  Ａｕｔｏｍａｔｏｎ：決定性有限オートマトン）を用いた検索方法が知られている（例えば、非特許文献１等）。
また、固定した文字列を検索するだけでは、検索の効率が悪い。そこで、検索文字列の一部または全部を選択的に指定したり、同一の文字列の繰り返しの指定を許すことによって、検索条件を一般化し、類似する文字列を同時に検索することが行われる。このように、検索文字列を一般化して表現した検索パターンの表記方法としては、正規表現等が知られている。
正規表現に基づいて、それを検索可能なＮＦＡ（Ｎｏｎｄｅｔｅｒｍｉｎｉｓｔｉｃ  Ｆｉｎｉｔｅ  Ａｕｔｏｍａｔｏｎ：非決定性有限オートマトン）を構成できることが知られている（例えば、非特許文献１、非特許文献２等）。
さらに、ＮＦＡは、それと等価なＤＦＡに変換できることが知られている（例えば、非特許文献１、非特許文献２等）。
【０００４】
第二の課題は、大量の文書を保存するための記憶装置の容量や、ネットワークを介して文書をやり取りする場合にネットワークの帯域を消費すると言うことである。記憶装置の容量節約や、ネットワークを流れるデータ転送量の縮小のため、電子化された文書を効率よく圧縮する方式が求められている。
この課題を解決する技術としては、ＬＺ（Ｌｅｍｐｅｌ−Ｚｉｖ）７７方式、ＬＺ７８方式、ＬＺＳＳ（Ｌｅｍｐｅｌ−Ｚｉｖ−Ｓｔｏｒｅｒ−Ｓｙｚｍａｎｓｋｉ）方式、ＬＺＷ（Ｌｅｍｐｅｌ−Ｚｉｖ−Ｗｅｌｃｈ）方式、ハフマン符号化方式等、様々な可逆圧縮法が知られている。
【０００５】
第三の課題は、上記した検索技術と圧縮技術は、それぞれ独立して発達してきたため、圧縮された文書を効率よく検索することが困難であるということである。
この課題を解決する技術としては、単純に、一度圧縮テキスト（圧縮された文書）を伸張（復元）した後で、検索する方式が一般的である。検索の方法としては、例えば、状態遷移機械（有限オートマトン）を用いて文字列照合を行う。
その一方で、圧縮された文書を伸長せずに検索する方式も知られている（例えば、特許文献１、非特許文献１等）。
【０００６】
特許文献１に記載の検索方式は、圧縮テキストを固定の検索文字列によって高速に検索する方式に関するものである。この方式では、圧縮辞書と固定の検索文字列を入力として有限オートマトンを作成し、その有限オートマトンによって圧縮テキストを伸張することなく検索することで、圧縮率の逆数倍高速に検索することができる。
【０００７】
非特許文献１に記載の検索方式は、ＬＺ７８形式またはＬＺＷ形式で圧縮された圧縮テキストを、正規表現を含んだ検索条件によって高速に検索する方式に関するものである。この方式では、圧縮テキストを伸張することなく、決定性有限オートマトンによって検索することで、高速に検索することができる。
【特許文献１】特開平１０−２６０９８０号公報
【非特許文献１】Ｇｏｎｚａｌｏ  Ｎａｖａｒｒｏ、“Ｒｅｇｕｌａｒ  Ｅｘｐｒｅｓｓｉｏｎ  Ｓｅａｒｃｈｉｎｇ  ｏｎ  Ｃｏｍｐｒｅｓｓｅｄ  Ｔｅｘｔ”、Ｊｏｕｒｎａｌ  ｏｆ  Ｄｉｓｃｒｅｔｅ  Ａｌｇｏｒｉｔｈｍｓ  Ｖｏｌｕｍｅ  １、Ｉｓｓｕｅ  ５−６（Ｏｃｔｏｂｅｒ  ２００３）、４２３〜４４３ページ、２００３
【非特許文献２】Ｅ．Ｊ．Ｈｏｐｃｒｏｆｔ，Ｄ．Ｊ．Ｕｌｌｍａｎ，“Ｆｏｒｍａｌ  Ｌａｎｇｕａｇｅｓ  Ａｎｄ  Ｔｈｅｉｒ  Ｒｅｌａｔｉｏｎ  ｔｏ  Ａｕｔｏｍａｔａ”、  Ａｄｄｉｓｏｎ  Ｗｅｓｌｅｙ（１９６９）（邦題「言語理論とオートマトン」、サイエンス社、昭和４６年）
【発明の開示】
【発明が解決しようとする課題】
【０００８】
圧縮された文書を伸長してから検索を行う方式は、圧縮テキストを伸張する時間と、文字列照合の時間が必要となり、検索時間が長くなるという課題がある。
特許文献１に記載の検索方式は、固定の検索文字列と圧縮の辞書を入力としており、正規表現を検索条件として扱うことはできないという課題がある。また、現在広く利用されている辞書式圧縮方式ＬＺ７７、ＬＺＳＳ、ＬＺ７８、ＬＺＷなどの方式では、圧縮テキストを伸張しながら同時に圧縮の辞書を生成するため、検索の開始時点で圧縮辞書が存在することを前提とした特許文献１の方式を適用することができないという課題がある。
非特許文献１に記載の検索方式は、テキストがシングルバイトコードからなることを前提としており、マルチバイトコード文字を含むテキストを検索することを考慮されていないという課題がある。また、ＬＺ７８やＬＺＷ形式の圧縮辞書の特徴を利用した方式であるため、圧縮辞書にそのような特徴を持たない他の圧縮方式で圧縮されたテキストを検索することができないという課題がある。
【０００９】
本発明は、例えば、上記のような課題を解決するためになされたもので、圧縮された文書を効率よく検索することを目的とする。
【課題を解決するための手段】
【００１０】
本発明に係る文字列検索装置は、
状態を保持し、文字を入力し、上記保持した状態と上記入力した文字とに基づいて遷移先状態を算出し、上記保持した状態を上記算出した遷移先状態に更新するオートマトンであって、所定の文字列を構成する文字を入力した場合に、上記記憶した状態が所定の状態となるか否かを判別することにより、所定の検索パターンに対応する検索文字列が上記文字列に含まれるか否かを判別できるよう構成したオートマトンを実行することによって、
上記文字列に含まれる部分文字列を上記部分文字列に対応する所定の符号に置換した符号列を取得して、上記文字列から上記検索文字列を検索する文字列検索装置において、
上記オートマトンを実行するオートマトン実行部と、
上記オートマトンが保持した状態を状態履歴として記憶する履歴記憶部と、
上記符号列を構成する符号を取得する符号取得部と、
上記オートマトンが保持する状態と上記履歴記憶部が記憶した状態履歴と上記符号取得部が取得した符号とに基づいて、第一の条件及び第二の条件を満たすか否かを判断する条件判断部と、
上記条件判断部が第一の条件を満たすと判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて遷移先状態を算出し、上記オートマトンが保持した状態を、算出した遷移先状態に更新する遷移先算出部と、
上記条件判断部が第二の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を復元し、上記部分文字列を構成する文字を上記オートマトンに入力する文字列復元部と、
を有することを特徴とする。
【発明の効果】
【００１１】
本発明によれば、例えば、圧縮されたテキストに含まれる文字列を検索する場合において、正規表現等による検索条件の指定を行い、これを有限オートマトンに変換して検索を行う検索装置において、圧縮ブロックに置換された部分文字列に対して行った検索の履歴を記憶し、記憶した履歴を用いて、オートマトンの状態遷移を省略することにより、検索が高速に行えるとの効果を奏する。
【発明を実施するための最良の形態】
【００１２】
まず、ＤＦＡ（オートマトンの一例）を用いた検索方法について説明する。
【００１３】
ＤＦＡによる文字列照合方式は状態遷移機械（オートマトン）のモデルに基づいている。状態遷移機械は内部に状態と状態遷移関数を持つ。状態遷移関数は現在の状態と入力文字に対して次の状態を決定する関数である。ＤＦＡを用いた文字列照合方式では、入力テキストを１文字ずつ読み出し、現在の状態と入力文字の組に対して状態遷移関数を適用して得られた次の状態に遷移する。この方法によるとテキストを後戻りすることなく１度走査することによって照合を行うことができ、高速な文字列照合が可能になる。複数の条件による照合を行う場合、照合に成功した条件を区別するため、ＤＦＡを拡張し各状態に出力を定義した出力つき有限オートマトン（Ｍｏｏｒｅ（ムーア）機械）も用いられている。
【００１４】
図３９は、ＤＦＡの動作における状態の遷移の一例を示す概念図である。
図３９において、状態９９０〜９９３は、ＤＦＡの状態を示す。ＤＦＡは、状態９９０〜９９３のうち、どれか一つの状態を保持しており、入力によって保持している状態が遷移（更新）する。検索開始時は、初期状態９９０を保持している。
図中の矢印は、状態の遷移を示す。矢印に添えられた文字を入力すると、矢印の先の状態へ遷移する。
例えば、現在の状態が状態９９０で、文字「ａ」を入力すると、状態９９１に遷移する。また、現在の状態が状態９９０で、文字「ｂ」または「ｃ」を入力すると、状態９９０のまま変わらない。
【００１５】
ここでは、説明を簡単にするため、ＤＦＡに入力する文字は「ａ」「ｂ」「ｃ」の３種類しかないものとしているが、実際のＤＦＡに入力する文字の種類はもっと多くてもよいことはもちろんである。
ここでいう「文字」とは、アルファベットや漢字といった狭義の文字に限らず、およそコンピュータが文字として扱えるものであれば何でも構わない。コンピュータ上において、文字はビット列で表現されている。例えば、ＡＳＣＩＩ（Ａｍｅｒｉｃａｎ  Ｓｔａｎｄａｒｄ  Ｃｏｄｅ  ｆｏｒ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｉｎｔｅｒｃｈａｎｇｅ）コードを用いる場合、文字「ａ」は「０１０００００１」（４１ｈ）という８ビットのビット列で表現される。あるいは、シフトＪＩＳ（Ｊａｐａｎ  Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ：日本工業規格）コードを用いる場合、文字「あ」は「１０００００１０１０１０００００」（８２Ａ０ｈ）という１６ビットのビット列で表現される。このように、使用する文字コードによっては、それを表現するビット列のビット長が異なる場合もある。したがって、およそコンピュータ上でビット列として表現できるものは、すべて「文字」として扱うことができ、ＤＦＡに入力することができる。
ただし、ＤＦＡは、あらかじめ入力に対応した遷移先が決まっていなければ動作させることができないので、ＤＦＡに入力する可能性のある文字の種類は有限個でなければならない。
【００１６】
図３９において、状態９９３は特別な状態であり、これを受理状態という。検索を目的として構成したＤＦＡにおいては、検索に成功したときに、受理状態となる。
図３９に示すＤＦＡは、検索文字列「ａｂｃ」を検索するためのものである。
【００１７】
文字列「ｂａｂａｂｃｃ」の中から検索文字列「ａｂｃ」を検索する場合を例にとって、図３９に示すＤＦＡの動作を説明する。
【００１８】
ＤＦＡには、文字列「ｂａｂａｂｃｃ」を構成する文字を、最初から１文字ずつ入力していく。
図４０は、図３９に示すＤＦＡに文字を入力していった場合に、ＤＦＡの状態がどのように遷移するかを示す図である。
検索開始時には、ＤＦＡの状態は初期状態９９０である。
まず、文字「ｂ」を入力すると、ＤＦＡの状態は状態９９０のまま変わらない。
次に、文字「ａ」を入力すると、ＤＦＡの状態は状態９９１に遷移する。
次に、文字「ｂ」を入力すると、ＤＦＡの状態は状態９９２に遷移する。
次に、文字「ａ」を入力すると、ＤＦＡの状態は状態９９１に遷移する。
次に、文字「ｂ」を入力すると、ＤＦＡの状態は状態９９２に遷移する。
次に、文字「ｃ」を入力すると、ＤＦＡの状態は状態９９３に遷移する。
状態９９３は受理状態であるから、この時点で、文字列「ｂａｂａｂｃｃ」に検索文字列「ａｂｃ」が含まれていることが分かる。また、６文字目の「ｃ」を入力した時点で、ＤＦＡの状態が受理状態９９３になったので、検索文字列「ａｂｃ」は、文字列「ｂａｂａｂｃｃ」の６文字目で終わる位置に現れることもわかる。
次に、文字「ｃ」を入力すると、ＤＦＡの状態は状態９９０に遷移する。
ＤＦＡに入力する文字がなくなったので、これでＤＦＡは動作を終了する。
【００１９】
以上の動作により、文字列「ｂａｂａｂｃｃ」のなかには検索文字列「ａｂｃ」が１回出現し、その出現位置は６文字目で終わる位置であることがわかる。
【００２０】
次に、オートマトン実行部がこのＤＦＡを実行する処理の流れについて説明する。
【００２１】
オートマトン実行部は、図３９のＤＦＡに対応して図４１の遷移先一覧表を記憶している。
この表は、ＤＦＡが最左欄の状態にあるときに、最上欄の文字を入力すると、次に遷移する遷移先の状態を示すものである。
図４２は、オートマトン実行部の処理の流れの一例を示すフローチャート図である。
検索開始時に、オートマトン実行部は、ＤＦＡの状態を初期化して、初期状態にする（Ｓ９９１）。例えば、ＤＦＡの状態を記憶するメモリに、初期状態の状態番号０を記憶する。
次に、例えば、文字列復元部が、オートマトンに文字列を１文字ずつ入力する（Ｓ９９２）。すなわち、オートマトン実行部に入力する文字を通知し、オートマトン実行部がこれを取得する。
オートマトン実行部は、記憶した遷移先一覧表を参照して、現在のＤＦＡの状態と入力した文字とに基づいて、遷移先状態を算出する（Ｓ９９３）。
次に、オートマトン実行部は、ＤＦＡの状態を更新する（Ｓ９９４）。例えば、ＤＦＡの状態を記憶するメモリに、遷移先状態の状態番号を記憶する。
オートマトン実行部は、ＤＦＡの状態が受理状態が否かを判別する（Ｓ９９５）。ＤＦＡの状態が受理状態である場合には、検索に成功したので、検索成功処理をする（Ｓ９９６）。例えば、検索に成功したことを示すメッセージや検索文字列の出現した位置をＣＲＴ表示装置９０１に表示する。
以上の処理を、ＤＦＡに入力する文字がなくなるまで繰り返す（Ｓ９９７）。
【００２２】
図４３は、もう少し複雑なＤＦＡの一例である。
図４３に示すＤＦＡは、文字列「ａｂａｂｂ」及び「ａｂｃａ」及び「ａｂａ」及び「ｂｂ」を検索できるように構成されている。
【００２３】
次に、正規表現について説明する。
【００２４】
正規表現とは、正規言語と呼ばれる言語のクラスを表現する表記方法である。
【００２５】
正規言語とは、それを構成する文字を任意に連結した文字列のうち、一定の規則に従う文字列の集合である。
正規表現は、正規言語を構成する文字とメタ文字とからなる文字列であり、ある文字列が正規言語に属するかどうかを識別するための規則を表現している。
正規表現の表記法には様々なものが知られている。ここではその一例について説明する。
【００２６】
説明を簡単にするため、正規言語を構成する文字は「ａ」「ｂ」「ｃ」の３種類しかないものとする。
また、メタ文字は「（」「）」「｜」「＊」「？」の５種類があるものとする。ここで、「（」「）」はグループ化を意味する。「｜」は選択を意味する。「＊」は０回以上の繰り返しを意味する。「？」は０回または１回の出現を意味する。
例えば、正規表現「（ａｂ｜ｃ）」は、文字列「ａｂ」及び「ｃ」を要素とする正規言語を表現するものである。
また、例えば、正規表現「ａｂ＊」は、文字列「ａ」、「ａｂ」、「ａｂｂ」、「ａｂｂｂ」、・・・を要素とする正規言語を表現するものである。
また、例えば、正規表現「ｃ？ｂ」は、文字列「ｂ」及び「ｃｂ」を要素とする正規言語を表現するものである。
【００２７】
実際に知られている正規表現はもっと複雑であるが、ここでは説明しない（非特許文献２等を参照のこと）。
【００２８】
このように、正規表現を用いると、文字列の集合を簡単に表現できるので、正規表現は検索条件を記述する検索パターンに用いられる。
例えば、文字列「ａｂａｂｂ」及び「ａｂｃａ」及び「ａｂａ」及び「ｂｂ」を検索したい場合、これを正規表現で記述すると、「ａｂａｂｂ｜ａｂｃａ｜ａｂａ｜ｂｂ」となる。あるいは「（ａｂａ）？（ｂｂ）？｜ａｂｃａ」と記述してもよいし、「ａｂｃ？ａ｜（ａｂａ）？ｂｂ」と記述してもよい。
【００２９】
正規表現を用いて記述した検索パターンに対応する検索文字列を検索する場合、正規表現に対応するＮＦＡを求めて、ＮＦＡを実行することによって検索する方法がある。
【００３０】
ＮＦＡは、ＤＦＡと同じくオートマトンの一種であるが、ある状態に対して、一つの文字を入力した場合に遷移する遷移先状態が２つ以上あったり、文字を入力しない場合でも状態が遷移（これを「空遷移」または「ε遷移」という）したりするので、遷移先状態を一意に決定することができない。
そこで、ＮＦＡを実行するには、遷移先が２つ以上ある場合、そのうちの１つを選択してとりあえず実行してみる。実行して失敗した場合には、分岐点に戻り、別の選択肢を選択してまた実行する。このように、バックトラックをすることにより、ＮＦＡを実行することが可能である。
【００３１】
しかし、このようにバックトラックによりＮＦＡを実行すると、途中で失敗した場合に後戻りが生じるので、検索に時間がかかる。
【００３２】
そこで、ＮＦＡをＤＦＡに変換し、変換されたＤＦＡを実行することで、後戻りせずに短時間で検索することができる。
【００３３】
正規表現からＮＦＡを求める方法、ＮＦＡをＤＦＡに変換する方法については、既に知られたものがあるので、ここでは説明しない（例えば、非特許文献１等を参照のこと）。
【００３４】
次に、文書圧縮技術について説明する。
現在一般的な文書圧縮技術には、自己参照型のものと辞書参照型のものがある。また、辞書参照型には、別に辞書を用意するものと、圧縮文書の中に辞書が埋め込まれているものとがある。
【００３５】
自己参照型の圧縮技術について説明する。この圧縮方式には、例えば、ＬＺ７７方式やＬＺＳＳ方式がある。
自己参照型圧縮技術において基本となる考え方は、元の文字列の異なる位置に、同じ部分文字列がある場合、一方を他方への参照で置換することによって、文字列全体の符号長を短くしようというものである。
【００３６】
図４４は、ＬＺＳＳ方式における符号化の一例を示す図である。
【００３７】
ここで、文字列「ｃｂａｂａｂｃｂｃ」を圧縮する場合を例にとって説明する。なお、ここでは、ＡＳＣＩＩコードを用いているものとする。したがって、１文字は８ビットのビット列によって表現されている。
【００３８】
文字列に含まれる部分文字列は、次の規則にしたがって符号に変換される。
【００３９】
規則１：１文字からなる部分文字列は、フラグ９８１（１ビット）とその文字を表現するビット列９８２（８ビット）からなる９ビットの符号に変換する。
規則２：部分文字列が、それより前に出現した他の部分文字列と一致する場合には、フラグ９８１（１ビット）、他の部分文字列の出現位置９８３（例えば８ビット）、部分文字列の長さ９８４（例えば５ビット）の合計１４ビットの符号に変換する。
【００４０】
フラグ９８１は、規則１で変換したか規則２で変換したかを区別するためのもので、あとで元の文字列を復元するときに使用する。
ビット列９８２は、その文字を表すＡＳＣＩＩコードである。ここでは、元の文字と同じコードを使用しているが、元の文字を復元することができれば、異なるコードに置き換えてもよい。
他の部分文字列の出現位置９８３は、それより前に出現した他の部分文字列の先頭の位置を、現在の部分文字列の先頭の位置からの距離（何文字前か）で表したものである。この例では、出現位置９８３は８ビットのビット列で表現しているので、２５６文字より前に他の部分文字列がある場合には、規則２を適用することができない。
部分文字列の長さ９８４は、規則２を適用して符号化する部分文字列の文字数である。この例では、部分文字列の長さ９８４は５ビットのビット列で表現しているので、３２文字以上の部分文字列には、規則２を適用することができない。
【００４１】
文字列「ｃｂａｂａｂｃｂｃ」を圧縮する場合、最初の「ｃ」「ｂ」「ａ」はそれ以前に出現したことがないので、１文字ずつ規則１を適用して符号６０１〜６０３に変換する。
４文字目から始まる３文字の部分文字列「ｂａｂ」は、２文字目（現在位置から見て２文字前）から始まる３文字の他の部分文字列「ｂａｂ」と一致するので、規則２を適用して符号６０４に変換する（このように、他の部分文字列は、自分自身と一部重なっていても構わない）。
７文字目から始まる２文字の部分文字列「ｃｂ」は、１文字目（現在位置から見て６文字前）から始まる２文字の他の部分文字列「ｃｂ」と一致するので、規則２を適用して符号６０５に変換する。
９文字目から始まる１文字の部分文字列「ｃ」は、７文字目から始まる１文字の部分文字列「ｃ」と一致するので、規則２を適用して変換してもよい。しかし、規則２を適用すると、変換した符号は１４ビットになるのに対して、規則１で変換すれば９ビットにしかならないので、圧縮効率が高くなるよう（圧縮後のビット長が短くなるよう）規則１を適用して符号６０６に変換する。
以上の変換により、全体のビット長が７２ビットあった文字列「ｃｂａｂａｃｂｃ」は、全体のビット長が６４ビットの符号列に置換される。
【００４２】
このようにして置換した符号列から元の文字列を復元する手順について説明する。
【００４３】
図４５は、従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図である。
まず、符号列から１ビット（フラグ９８１）取得し（Ｓ９８１）、続く符号が規則１で変換されたものか規則２で変換されたものかを判別する（Ｓ９８２）。
フラグ９８１が「１」なら、規則１なので、続く８ビット（符号９８２）を取得し（Ｓ９８３）、それを文字として出力する（Ｓ９８４）。
出力した文字は、出力履歴に記憶する（Ｓ９８５）。
例えば、図４４の符号６０１は、文字「ｃ」に変換し、出力する。
フラグ９８１が「０」なら、規則２なので、続く１３ビット（出現位置９８３及び長さ９８４）を取得する（Ｓ９８６）。
例えば、図４４の符号６０４であれば、２文字前から３文字であるとわかる。
次に、出力履歴を参照して、部分文字列を復元し、出力する（Ｓ９８７）。
出力した文字は、出力履歴として記憶する（Ｓ９８８）。
例えば、図４４の符号６０４であれば、出力履歴の２文字前を読み出す。この時点で出力履歴として「ｃｂａ」の３文字が記憶してあるので、２文字前は「ｂ」である。そこで、「ｂ」を出力し、すぐに出力履歴として記憶する。出力履歴は「ｃｂａｂ」となる。
これを長さが示す文字数繰り返す（Ｓ９８９）。
２文字目において、２文字前は「ａ」なので、続いて２文字目「ａ」を出力する。出力履歴は「ｃｂａｂａ」となる。３文字目において、２文字前は「ｂ」なので、３文字目「ｂ」を出力する。３文字分出力したので、符号６０４についての処理は終わり、次の処理に移る。したがって、符号６０４に対応して、「ｂａｂ」の３文字が出力される。
これを符号列が終わるまで繰り返す（Ｓ９９０）。
【００４４】
図４６は、同じく自己参照型圧縮技術の一種であるＬＺ７７方式における符号化の一例を示す図である。
ＬＺ７７方式は、ＬＺＳＳ方式と符号化の規則が異なるが、他の部分はほとんど同じである。
ＬＺ７７方式では、次の２つの規則により、元の文字列を符号列に置換する。
【００４５】
規則１：部分文字列のうち、最後の１文字を除いた部分文字列が、それより前に出現した他の部分文字列と一致する場合には、他の部分文字列の出現位置９８３（例えば８ビット）及び部分文字列の長さ９８４（例えば５ビット）の合計１３ビットの符号と、最後の１文字を示すビット列（例えば８ビット）の２つの符号に変換する。
規則２：１文字からなる部分文字列は、出現位置０及び長さ０を示す符号（例えば１３ビット）と、その文字を示すビット列（例えば８ビット）の２つの符号に変換する。ここで、出現位置０は、他の文字列への参照がないことを示す一例である。
【００４６】
この規則によれば、他の部分文字列へのポインタを示す符号と、文字を表現するビット列を示す符号とは、必ず交互に出現することになるので、その符号がどちらの意味であるかを示すフラグは必要ない。
【００４７】
符号化、復元の動作についての説明は、省略する。
【００４８】
辞書参照型の圧縮技術について説明する。
辞書参照型圧縮技術において基本となる考え方は、元の文字列の部分文字列が、辞書（置換辞書）に登録してある単語と一致する場合、その部分文字列を、辞書に登録してある符号で置換することによって、文字列全体のビット長を短くしようというものである。
例えば、図４７に示すような辞書があるとする。文字列「ｃｂａｂａｂｃｂｃ」を圧縮すると、符号列「１２２３３」を得る。符号１つ当りのビット長が１２ビットだとすれば、全体のビット長は６０ビットになる。
例えば、自然言語を記述した文書を圧縮する場合、その言語の単語や、よく出現するフレーズを辞書に登録しておけば、高い圧縮率を得ることができる。
辞書は、符号列とは別に用意しておいてもよいし、符号列に埋め込んでもよい。
【００４９】
埋込辞書参照型の圧縮技術について説明する。この圧縮方式にはＬＺ７８方式、ＬＺＷ方式などがある。
埋込辞書参照型は、辞書参照型の一形態である。埋込辞書参照型では、辞書を別に用意するのではなく、符号列の中に辞書の情報を埋め込んである。
図４８は、ＬＺ７８方式における符号化の一例を示す図である。
【００５０】
ここで、文字列「ｃｂａｂａｂｃｂｃ」を圧縮する場合を例にとって説明する。なお、ここでは、ＡＳＣＩＩコードを用いているものとする。したがって、１文字は８ビットのビット列によって表現されている。
【００５１】
文字列に含まれる部分文字列は、次の規則にしたがって、符号列に変換される。
【００５２】
規則１：部分文字列が辞書に登録されている場合、辞書の参照番号（例えば、１０ビット）を示す符号９７１に変換し、次の１文字を、その文字を示すビット列（８ビット）の符号９７２に変換する。
規則２：１文字からなる部分文字列が辞書に登録されていない場合、参照番号０を示す符号９７１及びその文字を示すビット列の符号９７２の２つに変換する。ここで、参照番号０は、辞書に登録されていないことを示す番号の一例であり、他の番号でもよい。
【００５３】
この規則によれば、参照番号を示す符号９７１と、文字を表現するビット列を示す符号９７２とは、必ず交互に出現することになるので、その符号がどちらの意味であるかを示すフラグは必要ない。しかし、規則１と規則２とを区別するためのフラグビットを設けて、規則２の場合は、その文字を示す符号だけに変換してもよい。
【００５４】
この規則により変換した部分文字列＋１文字は、置換辞書に登録されていない。もし登録されていれば、もう１文字長い部分文字列を同じビット長の符号に変換できるからである。そこで、この部分文字列＋１文字を新しく置換辞書６５０に登録する。
【００５５】
圧縮開始前において、置換辞書６５０には何も登録されていない。しかし、あらかじめ取り決めた部分文字列を登録しておくこととしてもよい。例えば、１文字からなる部分文字列をすべて置換辞書６５０に登録しておけば、規則２は必要なくなる。
【００５６】
文字列「ａｂａｂａｂｃｂｃ」についていえば、最初の「ａ」は置換辞書６５０に登録されていない。そこで、規則２を適用して、参照番号「０」及び文字「ａ」を符号６２１及び符号６２２として出力する。そして部分文字列「ｃ」を置換辞書６５０に登録する。参照番号は「１」となる。
次の「ｂ」も置換辞書６５０に登録されていないので、参照番号「０」と文字「ｂ」を出力し、「ｂ」を置換辞書６５０に登録する（参照番号２）。
次の「ａ」は置換辞書６５０に登録されている（参照番号１）が、「ａｂ」が登録されていないので、参照番号「１」と文字「ｂ」を出力し、「ａｂ」を置換辞書６５０に登録する（参照番号３）。
次の「ａｂ」は置換辞書６５０に登録されている（参照番号３）が、「ａｂｃ」は登録されていないので、参照番号「３」と文字「ｃ」を出力し、「ａｂｃ」を置換辞書６５０に登録する（参照番号４）。
次の「ｂ」は置換辞書６５０に登録されている（参照番号２）が、「ｂｃ」は登録されていないので、参照番号「２」と文字「ｃ」を出力し。「ｂｃ」を置換辞書６５０に登録する（参照番号５）。
【００５７】
このようにして置換した符号列から元の文字列を復元する手順について説明する。
【００５８】
図４９は、従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図である。
まず、置換辞書６５０を初期化する（Ｓ９７１）。例えば、空にする。
次に、符号列から１０ビット（辞書参照番号を示す符号９７１）取得し（Ｓ９７２）、参照番号が０以外なら（Ｓ９７３）、置換辞書６５０を参照して、参照番号に対応する前方文字列を求め、出力する（Ｓ９７４）。
符号列から８ビット（文字を表すビット列の符号９７２）取得し（Ｓ９７５）、それが示す文字を出力する（Ｓ９７６）。
Ｓ９７４及びＳ９７６で出力した文字を結合し、置換辞書６５０に新しく登録する（Ｓ９７７）。
これを符号列が尽きるまで繰り返す（Ｓ９７８）。
【００５９】
例えば、図４８の符号列６００を復元する場合について説明する。
最初に、置換辞書６５０を空にする。
符号６２１は参照番号「０」を示し、符号６２２は文字「ａ」を示すので、この２つの符号から部分文字列「ａ」を復元し、出力する。そして「ａ」を置換辞書６５０に登録する（参照番号１）。
符号６２３は参照番号「０」を示し、符号６２４は文字「ｂ」を示すので、この２つの符号から部分文字列「ｂ」を復元し、出力する。そして「ｂ」を置換辞書６５０に登録する（参照番号２）。
符号６２５は参照番号「１」を示し、符号６２６は文字「ｂ」を示すので、この２つの符号から部分文字列「ａｂ」を復元し、出力する。そして「ａｂ」を置換辞書６５０に登録する（参照番号３）。
符号６２７は参照番号「３」を示し、符号６２８は文字「ｂ」を示すので、この２つの符号から部分文字列「ａｂｃ」を復元し、出力する。そして「ａｂｃ」を置換辞書６５０に登録する（参照番号４）。
符号６２９は参照番号「２」を示し、符号６３０は文字「ｃ」を示すので、この２つの符号から部分文字列「ｂｃ」を復元し、出力する。そして「ｂｃ」を置換辞書６５０に登録する（参照番号５）。
【００６０】
なお、置換辞書６５０には、参照番号に対応する部分文字列を記憶する代わりに、復元した文字列内の対応する部分へのポインタを記憶してもよい。あるいは、前方文字列に対応する参照番号と残りの１文字を記憶してもよい。
【００６１】
図５０は、同じく埋込辞書参照型圧縮技術の一種であるＬＺＷ方式における符号化の一例を示す図である。
【００６２】
ここで、文字列「ｃｂａｂａｂｃｂｃ」を圧縮する場合を例にとって説明する。なお、ここでは、ＡＳＣＩＩコードを用いているものとする。したがって、１文字は８ビットのビット列によって表現されている。
【００６３】
文字列に含まれる部分文字列は、次の規則にしたがって、符号列に変換される。
【００６４】
規則１：部分文字列を、辞書の参照番号を示す符号９７１に変換する。
【００６５】
辞書には、出現する可能性のある１文字からなる部分文字列をすべて最初に登録しておく。したがって、部分文字列が辞書に登録されていない場合はない。そのため、ＬＺ７８形式と異なり、辞書に登録されていない場合の変換規則（規則２）が存在しない。
【００６６】
この例では、出現する可能性がある文字が「ａ」「ｂ」「ｃ」の３種類しかないものとしているので、辞書には「ａ」「ｂ」「ｃ」の３つの部分文字列が最初に登録される。
【００６７】
変換した部分文字列＋次の１文字（未変換）を、新しく辞書に登録する。
【００６８】
この規則によれば、規則が１つしか存在しないので、符号化の規則を区別する必要がない。また、最初から辞書に登録されている部分文字列があるので、ＬＺ７８方式に比べて圧縮率がよい。
【００６９】
符号化、復元の詳細についての説明は、省略する。
【００７０】
実施の形態１．
実施の形態１を図１〜図８を用いて説明する。
【００７１】
図１は、この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観の一例を示す図である。
図１において、圧縮テキスト検索装置１００は、システムユニット９１０、ＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）表示装置９０１、キーボード（Ｋ／Ｂ）９０２、マウス９０３、コンパクトディスク装置（ＣＤＤ）９０５、プリンタ装置９０６、スキャナ装置９０７を備え、これらはケーブルで接続されている。
さらに、圧縮テキスト検索装置１００は、ＦＡＸ機９３２、電話器９３１とケーブルで接続され、また、ローカルエリアネットワーク（ＬＡＮ）９４２、ゲートウェイ９４１を介してインターネット９４０に接続されている。
【００７２】
図２は、この実施の形態における圧縮テキスト検索装置のハードウェア構成の一例を示す図である。
図２において、圧縮テキスト検索装置１００は、プログラムを実行するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）９１１を備えている。ＣＰＵ９１１は、バス９１２を介してＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）９１３、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）９１４、通信ボード９１５、ＣＲＴ表示装置９０１、Ｋ／Ｂ９０２、マウス９０３、ＦＤＤ（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ  Ｄｒｉｖｅ）９０４、磁気ディスク装置９２０、ＣＤＤ９０５、プリンタ装置９０６、スキャナ装置９０７と接続されている。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部の一例である。
通信ボード９１５は、ＦＡＸ機９３２、電話器９３１、ＬＡＮ９４２等に接続されている。
例えば、通信ボード９１５、Ｋ／Ｂ９０２、スキャナ装置９０７、ＦＤＤ９０４などは、入力部の一例である。
また、例えば、通信ボード９１５、ＣＲＴ表示装置９０１などは、出力部の一例である。
【００７３】
ここで、通信ボード９１５は、ＬＡＮ９４２に限らず、直接、インターネット９４０、或いはＩＳＤＮ等のＷＡＮ（ワイドエリアネットワーク）に接続されていても構わない。直接、インターネット９４０、或いはＩＳＤＮ等のＷＡＮに接続されている場合、圧縮テキスト検索装置１００は、インターネット９４０、或いはＩＳＤＮ等のＷＡＮに接続され、ゲートウェイ９４１は不用となる。
磁気ディスク装置９２０には、オペレーティングシステム（ＯＳ）９２１、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３は、ＣＰＵ９１１、ＯＳ９２１、ウィンドウシステム９２２により実行される。
【００７４】
上記プログラム群９２３には、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
ファイル群９２４には、以下に述べる実施の形態の説明において、「〜の判定結果」、「〜の計算結果」、「〜の処理結果」として説明するものが、「〜ファイル」として記憶されている。
また、以下に述べる実施の形態の説明において説明するフローチャートの矢印の部分は主としてデータの入出力を示し、そのデータの入出力のためにデータは、ＲＡＭ９１４もしくは磁気ディスク装置９２０、ＦＤ（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ）、光ディスク、ＣＤ（コンパクトディスク）、ＭＤ（ミニディスク）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のその他の記録媒体に記録される。あるいは、信号線やその他の伝送媒体により伝送される。
【００７５】
また、以下に述べる実施の形態の説明において「〜部」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、ハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。
【００７６】
また、以下に述べる実施の形態を実施するプログラムは、また、ＲＡＭ９１４もしくは磁気ディスク装置９２０、ＦＤ（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ）、光ディスク、ＣＤ（コンパクトディスク）、ＭＤ（ミニディスク）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のその他の記録媒体による記録装置を用いて記憶されても構わない。
【００７７】
図３は、この実施の形態における圧縮テキスト検索装置１００のブロック構成の一例を示すブロック図である。
この圧縮テキスト検索装置は、入力された圧縮テキスト中に検索条件に適合する文字列が存在するか否かを判定し、存在する場合はその文字列の末尾の位置をヒット位置として出力する検索装置である。また、存在しない場合は何も出力しない。
図３において、圧縮テキスト検索装置１００は、検索条件入力部１０２、圧縮テキスト記憶部１０３、照合結果出力部１０４、状態遷移表生成部１０５、状態遷移表記憶部１０６、照合部１０７から構成される。照合部１０７は、圧縮ブロック取得部１０８、文字取得部１０９、状態遷移機械１１０、状態記憶部１１１、状態遷移記憶部１１２、圧縮辞書記憶部１１３、条件判断部１１４、現在位置カウンタ１１５、遷移先算出部１１６、検索成功判別部１１７を有する。
【００７８】
検索条件入力部１０２は、検索条件（検索パターンの一例）を入力する。検索条件は、正規表現を用いて表現されている。しかし、固定の検索文字列でもよい。
【００７９】
状態遷移表生成部１０５は、検索条件の入力を受け付けると、検索条件と適合する文字列を受理するＤＦＡ（オートマトンの一例）に対応する状態遷移表を生成する機能を備えている。
すなわち、検索条件入力部１０２に入力した検索条件に基づいて、それに対応するＮＦＡを求め、更に、ＮＦＡをＤＦＡに変換し、それに対応する状態遷移表（遷移先一覧表の一例）を生成する。
状態遷移表生成部１０５が生成した状態遷移表は、状態遷移表記憶部１０６が記憶する。
【００８０】
圧縮テキスト記憶部１０３は、圧縮テキスト（符号列の一例）を記憶する。圧縮テキストとは、電子化された文書（文字列の一例）を圧縮技術によって符号化し、全体のビット長を短くしたものである。なお、圧縮テキストは、必ずしも文書を符号化したものである必要はなく、コンピュータが記憶するデータを符号化したものであってもよい。
【００８１】
照合部１０７は、圧縮テキストの入力を受け付けると、状態遷移表を参照しながら、圧縮テキスト中に検索条件に適合する文字列が存在するか否かを判定し、存在する場合はそのヒット位置を出力する機能を備える。
すなわち、圧縮テキスト記憶部１０３が記憶した圧縮テキストを入力すると、その圧縮テキストに対応する圧縮前の文書の中に、検索条件に合致する部分文字列が含まれるか否かを判別し、含まれる場合にはその出現位置（ヒット位置）を出力する。
【００８２】
照合部１０７が出力したヒット位置は、照合結果出力部１０４が、例えばＣＲＴ表示装置９０１に表示する。
【００８３】
圧縮ブロック取得部１０８（符号取得部の一例）は、入力された圧縮テキストから、圧縮ブロック（符号の一例）を１つずつ取得する機能を備える。
すなわち、圧縮テキスト記憶部１０３が記憶した圧縮テキストから、それを構成する圧縮ブロックを先頭から順に取得する。
【００８４】
圧縮辞書記憶部１１３（辞書記憶部の一例）は、圧縮テキストから圧縮辞書（置換辞書の一例）を取得し記憶する機能を備える。
すなわち、圧縮テキストの中に圧縮辞書の情報が埋め込まれている埋込辞書参照型圧縮方式において、圧縮テキストに埋め込まれた圧縮辞書の情報を抽出し、記憶する。あるいは、圧縮テキストとは別に圧縮辞書を用意する辞書参照型圧縮方式の場合には、別に用意した圧縮辞書を取得して記憶しておく。
【００８５】
文字取得部１０９（文字列復元部の一例）は、圧縮辞書記憶部１１３に記憶されている圧縮辞書を参照しながら、圧縮ブロック取得部１０８によって取得された圧縮ブロックから文字を１文字ずつ取得する機能を有する。
すなわち、圧縮辞書記憶部１１３が記憶した圧縮辞書に基づいて、圧縮ブロックに対応する部分文字列を求める。更に、その部分文字列を構成する文字を先頭から順に取得し、状態遷移機械１１０に入力する。
【００８６】
状態記憶部１１１は、状態遷移機械１１０の現在の状態を記憶する機能を備える。状態遷移機械１１０は、文字取得部１０９と状態記憶部１１１の状態を元に、状態遷移表を参照することで、次の状態を取得し、状態記憶部１１１の状態を更新する機能を備える。状態遷移記憶部１１２は、圧縮辞書記憶部１１３の文字列に対応した状態遷移の履歴を記憶する機能を備える。
すなわち、状態記憶部１１１及び状態遷移機械１１０はオートマトン実行部の一例であり、状態遷移表記憶部１０６が記憶した状態遷移表に対応するＤＦＡを実行する。ＤＦＡの保持する状態は、状態記憶部１１１が記憶する。状態遷移機械１１０は、状態記憶部１１１が記憶したＤＦＡの状態と、文字取得部１０９が入力した文字とに基づいて、状態遷移表記憶部１０６が記憶した状態遷移表を参照し、遷移先状態を取得する。状態記憶部１１１は、状態遷移機械１１０が取得した遷移先状態を、ＤＦＡの状態として、古いＤＦＡの状態に上書きして記憶する（更新する）。
【００８７】
状態遷移記憶部１１２（履歴記憶部の一例）は、状態記憶部１１１が記憶したＤＦＡの状態の履歴（状態履歴）を記憶する。
【００８８】
条件判断部１１４は、圧縮ブロックを元の部分文字列に復元するか否か等の条件を判断する。
【００８９】
現在位置カウンタ１１５は、元の文字列が検索条件に合致する検索文字列を含む場合に、そのヒット位置を求めるため、検索の現在位置を示すカウンタである。
【００９０】
遷移先算出部１１６は、状態遷移記憶部１１２が記憶した状態履歴に基づいて、ＤＦＡの遷移先状態を算出する。
【００９１】
検索成功判別部１１７は、元の文字列の中に検索パターンに合致する検索文字列が含まれるか否かを判別し、含まれる場合にはその出現位置を出力する。
【００９２】
図３の圧縮テキスト検索装置１００の各機能部は、複数のＣＰＵなどの演算装置と、メモリなどの記憶装置によって構成しても良いし、単一の演算装置と１以上の記憶装置上で動作するソフトウェアとして実現しても良い。
【００９３】
図４は、この実施の形態において、圧縮テキスト記憶部１０３が記憶した圧縮テキストの一例を示す図である。
辞書式圧縮（辞書参照型圧縮方式）によって圧縮された圧縮テキストは、圧縮ブロック列３００（符号列の一例）と、圧縮辞書３０３（置換辞書の一例）とから構成される。
１つの圧縮ブロック３０２（符号の一例）は、圧縮辞書の１つのエントリの参照番号を含んでいる。
圧縮辞書記憶部１１３は、圧縮テキストから圧縮辞書の情報を抽出し、記憶している。圧縮辞書は、文字列３０５（部分文字列の一例）と、文字列の参照番号３０４（符号の一例）との対応を示す表である。
図４に示す圧縮ブロック列３００「１２１３４１４」を伸張（復元）する場合、圧縮ブロック列３００から１つずつ圧縮ブロック３０２を取得し、その参照情報を元に圧縮ブロック３０２を圧縮辞書の文字列３０５（以後、圧縮ブロックの参照文字列と呼ぶ）と置き換える。
例えば、最初の圧縮ブロック３０２は、圧縮辞書の１番目のエントリを参照しているため、最初の圧縮ブロックは、１番目のエントリの文字列「ａｂｃｄｅ」と置き換えることができる。同様に全ての圧縮ブロックについて繰り返すことで、圧縮ブロック列３００から伸張されたテキスト「ａｂｃｄｅｃｂａｂｃｄｅｂｅｃｄａｂｃｄｅｄ」を得ることができる。辞書式圧縮では、このようにテキスト中に出現する文字列を、その文字列よりもビット長が短い圧縮ブロックに置き換えることで、同じ文字列が繰り返し出現するほど高い圧縮率を得ることができる。
【００９４】
ここでは、圧縮辞書を表の形式で記載したが、圧縮ブロックと、圧縮辞書のエントリを１対１に対応付けることができれば、圧縮辞書の実現方式は問わない。すなわち木構造やハッシュを使っても良い。
以後、圧縮ブロックの参照番号を＜＞で囲んだ数値として表記する。
【００９５】
図５は、この実施の形態において、状態遷移記憶部１１２が記憶する状態履歴の構造を示す図である。
状態遷移記憶部１１２は、参照番号４０１（符号の一例）、状態遷移履歴４０２、受理位置４０３の情報を持つ。
参照番号４０１は、圧縮辞書の参照番号３０４と１対１に対応付けられている。
状態遷移履歴４０２は、対応する圧縮辞書の文字列による状態遷移機械の状態遷移の履歴を記憶したものであり、先頭が圧縮辞書の文字列を読む直前の状態、末尾が圧縮辞書の文字列を全て読んだ直後の状態をさす。例えば、１番目のエントリの場合、状態［１］から開始して、文字列「ａｂｃｄｅ」を１文字読む毎に状態が［２］−［３］−［４］−［５］と遷移し、最後の「ｅ」を読んだ直後に状態［６］になったことを意味する。
受理位置４０３は、圧縮辞書の文字列の何文字目で、状態遷移機械が受理状態に到達したかを表わしている。例えば、図４で状態［４］が受理状態であったとする。このとき、エントリ１の受理位置４０３は、圧縮辞書の文字列の３文字目の「ｃ」を読んだ直後に受理状態［４］に到達したことを意味している。
ここでは、受理位置は１番目と３番目のエントリに各１つずつしかないが、１つの状態遷移履歴に２つ以上の受理位置があっても良い。
【００９６】
この実施の形態では、正規表現とテキストの照合には、状態遷移が一意に決定できる状態遷移機械を使用する。このような状態遷移機械の代表的なものにＤＦＡがある。
【００９７】
図６は、この実施の形態において、状態遷移表記憶部１０６が記憶する状態遷移表２００の一例を示す図である。状態遷移表２００の左端の列は、現在の状態を表わしている。また、１行目は次に入力された文字を表わしている。それ以外の要素は次の状態（遷移先状態）を表わしている。例えば、現在の状態が［１］で、次の入力文字が「ａ」であった場合、状態［１］の行、文字「ａ」の列（２行２列目）の状態［２］が次の状態である。
【００９８】
検索条件に含まれる正規表現を受理する状態遷移機械の状態遷移表２００は、圧縮テキストが入力され照合が開始されるまでに、状態遷移表生成部１０５によって生成される。
例えば、検索条件入力部１０２が、正規表現「（ａｂ｜ｄｅｃ）［ｃｅ］ｅ＊」を検索条件として入力する（ここで「［ｃｅ］」は「（ｃ｜ｅ）」の簡略表記である）。この正規表現は、「ａｂｃ」「ａｂｅ」「ａｂｃｅ」「ａｂｅｅ」「ｄｅｃｃ」「ｄｅｃｅ」「ｄｅｃｃｅ」「ｄｅｃｅｅ」・・・などを意味する。図６の状態遷移表２００は、この正規表現に基づいて、状態遷移表生成部１０５が生成するものである。
【００９９】
図７は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
【０１００】
初期化処理（Ｓ１０）において、検索条件入力部１０２が入力した検索条件に基づいて、状態遷移表生成部１０５が検索条件を受理するＤＦＡに対応する状態遷移表を生成し、状態遷移表記憶部１０６が記憶する。
圧縮テキスト記憶部１０３が記憶した圧縮テキストから圧縮辞書の情報を抽出し、圧縮辞書記憶部１１３が記憶する。
状態記憶部１１１は初期状態（状態番号＝１）を記憶する。
状態遷移記憶部１１２は、記憶する状態遷移履歴を空にする。
現在位置カウンタ１１５は、圧縮前のテキスト（または元テキストという）長をカウントするため、記憶する現在位置を０に初期化する。
【０１０１】
圧縮ブロック取得部１０８が、圧縮ブロック列の先頭から順に圧縮ブロックを１個取得する（Ｓ１１）。
【０１０２】
条件判断部１１４は、状態記憶部１１１が記憶した現在のＤＦＡの状態と、状態遷移記憶部１１２が記憶した圧縮ブロックに対応する状態遷移履歴（以後、圧縮ブロックの状態遷移履歴という）の先頭の状態とが一致するか判定する（Ｓ１２）。
すなわち、状態遷移記憶部１１２が記憶する状態履歴のうち、圧縮ブロック取得部１０８が取得した圧縮ブロックに対応する状態遷移履歴４０２を参照し、最初の状態（その圧縮ブロックに対応する部分文字列をＤＦＡに入力する前のＤＦＡの状態）を取得する。取得した最初の状態と、現在のＤＦＡの状態とを比較して、一致するか否かを判断する。
【０１０３】
条件判断部１１４が一致する（第一の条件を満たす）と判断した（Ｓ１２）場合には、遷移先算出部１１６が、上記一致した状態遷移履歴を参照し、最後の状態（その圧縮ブロックに対応する部分文字列をＤＦＡに入力した後のＤＦＡの状態）を取得する（遷移先状態）。遷移先算出部１１６は、取得した遷移先状態に、状態記憶部１１１が記憶したＤＦＡの状態を更新する（Ｓ１３）。
【０１０４】
遷移先算出部１１６がＤＦＡの状態を更新した場合、途中で通るはずの状態を飛ばすことになる。その中に受理状態がある場合には、ＤＦＡが受理状態になることなく、次へ進んでしまう。
そこで、状態遷移記憶部１１２は、途中通るはずの状態の中に受理状態があるかどうか、また、ある場合にはその位置がどこか（受理位置４０３）を記憶している。
そこで、検索成功判別部１１７は、状態遷移記憶部１１２が記憶した状態履歴のうち、一致した状態遷移履歴を参照し、受理状態があるかどうかを判別する（Ｓ１４）。
受理状態がある場合には、検索成功判別部１１７は、現在位置カウンタ１１５が記憶した現在の元テキスト長（現在位置）に、状態遷移記憶部１１２が記憶した状態履歴のうち、一致した状態遷移履歴４０２に対応する受理位置４０３を加えて、ヒット位置を求めて出力する（Ｓ１５）。その場合、照合結果出力部１０４がＣＲＴ表示装置９０１に表示する。
場合によっては、受理位置が複数ある場合もある。その場合には、その全ての受理位置に対して、出現位置（ヒット位置）を出力する。
逆に、受理状態がない場合には、何も出力しない。
【０１０５】
条件判断部１１４が一致しない（第二の条件を満たす）と判断した（Ｓ１２）場合には、圧縮ブロックから部分文字列を復元して、ＤＦＡに入力し、状態遷移履歴を求める処理を行う（Ｓ１６）。
【０１０６】
最後に、現在位置カウンタ１１５は、記憶した現在位置に、圧縮ブロックに対応する部分文字列の長さ（文字数）を加え、更新して記憶する（Ｓ１７）。
【０１０７】
以上の処理を圧縮ブロックが尽きるまで繰り返す（Ｓ１８）。
【０１０８】
図８は、図７のＳ１６における処理の詳細の一例を示すフローチャート図である。
【０１０９】
状態遷移記憶部１１２は、状態遷移履歴の一時的な記憶領域Ｈを用意し、初期状態として、状態記憶部１１１が記憶したＤＦＡの状態（最初の状態）を記憶する（Ｓ１６１）。あるいは、記憶領域Ｈを空にし、ＤＦＡの状態を記憶領域Ｈの先頭に追加してもよい。
【０１１０】
次に、文字取得部１０９が、圧縮ブロックの参照文字列（圧縮辞書記憶部１１３が記憶した圧縮辞書から取得した、参照番号に対応する部分文字列）を参照し、先頭から順に１文字ずつ取得し、ＤＦＡに入力する（Ｓ１６２）。
【０１１１】
状態遷移機械１１０は、入力の文字と状態を元に、状態遷移表記憶部１０６が記憶した状態遷移表を参照して、次の状態を取得する。すなわち、状態記憶部１１１が記憶したＤＦＡの現在の状態と、文字取得部１０９が入力した文字とに基づいて、状態遷移表記憶部１０６が記憶した状態遷移表を参照し、遷移先状態を取得し、状態記憶部１１１にセットする（更新する）。状態記憶部１１１は、状態遷移機械１１０が取得した遷移先状態を、新たに、ＤＦＡの状態として記憶する（Ｓ１６３）。
【０１１２】
状態遷移記憶部１１２は、状態記憶部１１１が記憶したＤＦＡの新たな状態を記憶領域Ｈの最後に追加する（Ｓ１６４）。
【０１１３】
検索成功判別部１１７は、状態記憶部１１１が記憶したＤＦＡの新たな状態が受理状態であるかを判別する（Ｓ１６５）。
【０１１４】
検索成功判別部１１７が受理状態であると判別した場合、状態遷移記憶部１１２は、文字取得部１０９がＤＦＡに入力した文字数を受理位置として、記憶領域Ｈに記憶させる（Ｓ１６６）。
更に、現在位置カウンタ１１５が記憶した現在位置に受理位置を加え、ヒット位置として出力する（Ｓ１６７）。出力されたヒット位置は、照合結果出力部１０４がＣＲＴ表示装置９０１に表示する。
【０１１５】
これを参照文字列を構成する文字が尽きるまで繰り返す（Ｓ１６８）。
【０１１６】
最後に、状態遷移記憶部１１２は、記憶領域Ｈに記憶した状態遷移履歴及び受理位置を、圧縮ブロックの状態遷移履歴に反映する。すなわち、圧縮ブロックの参照番号に対応する位置に複写して記憶する（Ｓ１６９）。
【０１１７】
なお、一時的な記憶領域Ｈを用意せず、状態遷移記憶部１１２が、圧縮ブロックの参照番号に対応する位置に、直接、状態遷移履歴及び受理位置を記憶してもよい。そうすれば、記憶領域Ｈの記憶内容を複写するステップが省けるので好ましい。
【０１１８】
また、状態遷移履歴の途中は記憶せず、最初の状態と最後の状態だけを記憶することとしてもよい。そうすれば、記憶領域の節約になるので好ましい。
【０１１９】
また、状態遷移記憶部１１２は、圧縮ブロックの参照番号に対応する状態履歴として、最初の状態に対応して複数の状態履歴を記憶してもよい。そうすれば、状態履歴として記憶した最初の状態と現在の状態とが一致する可能性が高くなり、状態遷移を飛ばすことができるので好ましい。
【０１２０】
あるいは、圧縮ブロックの参照番号に対応する状態履歴として、１つの状態履歴しか記憶しないこととしてもよい。そうすれば、状態履歴を記憶する記憶領域の節約になるので好ましい。
その場合、既にその圧縮ブロックの参照番号に対応する状態履歴（最初の状態が異なる）を記憶している場合には、状態履歴を記憶しないこととしてもよい。あるいは、最初の状態が特定の状態（例えば、初期状態）のときだけ、状態履歴を上書きすることとしてもよい。そうすれば、出現頻度の高い状態のときに、最初の状態と現在の状態とが一致する可能性が高くなり、状態遷移を飛ばすことができるので好ましい。
【０１２１】
この手順にしたがって、圧縮テキスト検索装置１００が実際にどのように動作するか、図４〜図６に示した具体例を使って説明する。
【０１２２】
初期化処理（Ｓ１０）により、各記憶部が記憶内容を初期化する。
状態遷移表記憶部１０６は、図６に示す状態遷移表２００を記憶する。状態遷移表２００は、検索条件入力部１０２が入力した検索条件（正規表現を含む）に基づいて、状態遷移表生成部１０５が生成したものである。状態遷移表２００に対応するＤＦＡにおいて、初期状態は状態番号１に対応する状態であり、受理状態は状態番号４に対応する状態である。これも、状態遷移表記憶部１０６が記憶している。なお、ＤＦＡの初期状態は必ず１つであるが、受理状態は複数あってもよい。
状態記憶部１１１は初期状態（状態番号＝１）を記憶する。
状態遷移記憶部１１２は、記憶する状態履歴を空にする。
圧縮辞書記憶部１１３は、圧縮辞書を記憶する。
現在位置カウンタ１１５は、現在位置として０を記憶する。
【０１２３】
圧縮テキスト記憶部１０３が記憶した圧縮ブロック列３００から、圧縮ブロック取得部１０８が圧縮ブロックを取得する（Ｓ１１）。最初の圧縮ブロック３０２は「１」である。
【０１２４】
条件判断部１１４が、状態記憶部１１１が記憶した現在のＤＦＡの状態と、状態遷移記憶部１１２が記憶した状態履歴のうち、圧縮ブロックに対応する状態遷移履歴の最初の状態とを比較する（Ｓ１２）。
しかし、状態履歴は空なので、対応する最初の状態は記憶されていない。
そこで、条件判断部１１４は、一致しないと判断する（Ｓ１６へ）。
【０１２５】
状態遷移記憶部１１２は、記憶領域Ｈに、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝１）を記憶する（Ｓ１６１）。
【０１２６】
文字取得部１０９は、圧縮辞書記憶部１１３が記憶した圧縮辞書の参照番号１を参照し、部分文字列「ａｂｃｄｅ」から、最初の文字「ａ」を取得し、ＤＦＡに入力する（Ｓ１６２）。
【０１２７】
状態遷移機械１１０は、ＤＦＡの現在の状態が状態番号１、入力した文字が「ａ」なので、状態遷移表記憶部１０６が記憶した状態遷移表２００を参照し、状態番号２を遷移先状態として取得する。状態記憶部１１１は、新たなＤＦＡの状態として状態番号２を記憶する（Ｓ１６３）。
【０１２８】
状態遷移記憶部１１２は、状態番号２を記憶領域Ｈの最後に追加し（Ｓ１６４）、「１２」となる。
【０１２９】
検索成功判別部１１７は、状態記憶部１１１が記憶した状態（状態番号２）が受理状態（状態番号４）ではないと判別する（Ｓ１６５）。したがって、Ｓ１６６及びＳ１６７の処理は行わない。
【０１３０】
まだ参照文字列を構成する文字が残っているので（Ｓ１６８）、文字取得部１０９が次の文字「ｂ」を取得し、ＤＦＡに入力する（Ｓ１６２）。
状態遷移機械１１０は、状態番号２、入力文字「ｂ」なので、状態遷移表２００より、遷移先状態の番号３を取得し、状態記憶部１１１が記憶する（Ｓ１６３）。
状態遷移記憶部１１２が状態番号３を記憶領域Ｈの最後に追加し（Ｓ１６４）、「１２３」となる。
検索成功判別部１１７は、現在の状態（状態番号３）が受理状態（状態番号４）でないと判別する（Ｓ１６５）。
【０１３１】
まだ文字が尽きていないので（Ｓ１６８）、文字取得部１０９は次の文字「ｃ」を取得し、ＤＦＡに入力する（Ｓ１６２）。
状態番号３、入力文字「ｃ」なので、新たなＤＦＡの状態は状態番号４になり、記憶領域Ｈに追加する（Ｓ１６３、Ｓ１６４）。
検索成功判別部１１７は、現在の状態（４）が受理状態（４）であることを判別する（Ｓ１６５）。
状態遷移記憶部１１２は、記憶領域Ｈに、受理位置を記憶する（Ｓ１６６）。ここまでで文字取得部１０９がＤＦＡに入力した文字数は３なので、受理位置は３となる。
更に、検索成功判別部１１７は、現在位置カウンタ１１５が記憶した現在位置（＝０）に、受理位置（＝３）を加え、ヒット位置（＝３）を算出して出力する（Ｓ１６７）。
【０１３２】
まだ文字が尽きていないので（Ｓ１６８），次の文字「ｄ」をＤＦＡに入力する（Ｓ１６２）。
状態番号４、入力文字「ｄ」なので、新たなＤＦＡの状態は５になり、記憶される（Ｓ１６３、Ｓ１６４）。
現在の状態（５）は受理状態（４）ではないので、次へ進む（Ｓ１６５）。
【０１３３】
同様にして（Ｓ１６８）、次の文字「ｅ」を入力し（Ｓ１６２）、新たな状態６になる（Ｓ１６３、Ｓ１６４）。受理状態ではないので次へ進む（Ｓ１６５）。
【０１３４】
参照文字列を構成する文字が尽きたので（Ｓ１６８）、状態遷移記憶部１１２は、記憶領域Ｈに記憶した状態遷移履歴及び受理位置を、状態履歴のうち、圧縮ブロックの参照番号１に対応する位置に複写する（Ｓ１６９）。
ここまでで、記憶領域Ｈには、状態遷移履歴として「１２３４５６」が、受理位置として「３」が記憶されていたので、これを参照番号１に対応する位置に記憶する。
【０１３５】
現在位置カウンタ１１５が記憶した現在位置（＝０）に、圧縮ブロックに対応する部分文字列の長さ（文字数、＝５）を加えて、現在位置を５に更新する（Ｓ１７）。
【０１３６】
圧縮ブロックがまだ尽きていないので（Ｓ１８）、圧縮ブロック取得部１０８が次の圧縮ブロック「２」を取得する。
【０１３７】
状態遷移記憶部１１２は、参照番号２に対応する状態遷移履歴を記憶していないので、条件判断部１１４は、一致しないと判断する（Ｓ１２）。
【０１３８】
さきほどと同様にして状態遷移履歴を求める（Ｓ１６）。
圧縮辞書の参照番号２に対応する部分文字列は「ｃｂ」なので、ＤＦＡの状態は、最初の状態が状態番号６、文字「ｃ」を入力して状態番号３、文字「ｂ」を入力して状態番号１へと遷移する。
このなかに受理状態（４）はないので、検索成功判別部１１７は何も出力しない。
したがって、状態遷移記憶部１１２は、状態遷移履歴として「６３１」を、状態履歴の参照番号２に対応する位置に記憶する。受理位置はないので、記憶しない。
【０１３９】
現在位置カウンタ１１５が記憶した現在位置（＝５）は、文字数２を加えて、７となる（Ｓ１７）。
【０１４０】
圧縮ブロックがまだ尽きていないので（Ｓ１８）、圧縮ブロック取得部１０８が次の圧縮ブロック「１」を取得する。
【０１４１】
状態遷移記憶部１１２は、参照番号１に対応する状態遷移履歴を記憶している。状態記憶部１１１が記憶したＤＦＡの現在の状態は１である。状態遷移記憶部１１２が記憶した状態履歴のうち、参照番号１に対応する状態遷移履歴の最初の状態も１で一致する。したがって、条件判断部１１４は、一致すると判断する（Ｓ１２）。
【０１４２】
そこで、遷移先算出部１１６は、一致した状態遷移履歴の最後の状態から、遷移先状態の状態番号６を取得し、状態記憶部１１１に記憶させる（Ｓ１３）。
【０１４３】
検索成功判別部１１７は、一致した状態遷移履歴に対応して、状態遷移記憶部１１２が受理位置を記憶しているか否かを判別する（Ｓ１４）。この場合、受理位置「３」を記憶しているので、現在位置（＝７）に受理位置（＝３）を加えて、ヒット位置（＝１０）を算出し、出力する（Ｓ１５）。
【０１４４】
現在位置カウンタ１１５が記憶した現在位置（＝７）は、文字数５を加えて、１２となる（Ｓ１７）。
【０１４５】
以下、同様にして、圧縮ブロック取得部１０８が取得すべき圧縮ブロックがなくなるまで処理を続け（Ｓ１８）、圧縮ブロックの終端まで処理を終えた時点で検索処理を終了する。
【０１４６】
なお、この例においては、条件判断部１１４が、状態記憶部１１１が記憶したＤＦＡの現在の状態と、状態遷移記憶部１１２が記憶した状態遷移履歴のうち圧縮ブロックの参照番号に対応する状態遷移履歴の最初の状態とが一致するかを判定している。
しかし、ＤＦＡの状態を更新（遷移）するたびに、状態遷移記憶部１１２が記憶した状態遷移履歴において対応する状態と比較し、一致する場合には、残りの状態遷移を飛ばす構成としてもよい。
【０１４７】
また、一つ状態を更新するたびに比較するのではなく、あらかじめ定めた回数更新した後に比較することとしてもよい。
例えば、参照文字列のｉ番目（ｉは自然数）の文字について次の状態を取得したあと、状態遷移履歴のｉ番目の状態と比較し、一致した場合はＳ１６の処理を終了し、Ｓ１３に処理が移るように構成しても良い。このとき、一時的な記憶領域Ｈに記憶した状態遷移履歴の先頭からｉ番目までを、圧縮ブロックの状態遷移履歴に反映させる。
【０１４８】
なお、ステップＳ１６の処理で圧縮ブロックの状態遷移履歴を、常に更新するように構成してもよいし、常に更新しなくても良い。すなわち、最初に取得した状態遷移履歴から更新しないようにしても良いし、状態遷移履歴の先頭の状態がある特定の状態のときのみ、履歴を更新するようにしても良い。
【０１４９】
以上のように、この実施の形態によれば、状態記憶部１１１が記憶したＤＦＡの現在の状態と、取得した圧縮ブロックの状態遷移履歴の先頭の状態が一致しなかった場合には、状態遷移を処理するのに、圧縮ブロックの参照文字列の長さ分のステップ数を要する。一方で、現在の状態と状態遷移履歴の先頭の状態が一致した場合には、状態遷移を１ステップで処理することができる。現在の状態と文字によって状態遷移先が一意に決定される状態遷移機械では、現在の状態が初期状態である場合が多い。そのため、圧縮率が高いほど、すなわち長さが長い文字列が繰り返し出現しているようなテキストほど、状態遷移に要するステップ数を削減することができる。
正規表現に適合する文字列がテキスト中に存在するかの照合自体は、従来から利用されている、正規表現を受理する状態遷移が一意に決定される状態遷移機械を使用している。
このように、この実施の形態の圧縮テキスト検索装置では、正規表現を含んだ検索条件によって、圧縮テキストを高速に検索することができる。
【０１５０】
ここで説明した検索装置は、以下の特徴を有する。
辞書式圧縮方式によって圧縮されたテキストを、伸張することなく、正規表現によって検索する検索装置である。
検索には、状態遷移が一意に決定できる状態遷移機械を使用する。
状態遷移機械、状態遷移表生成部、圧縮ブロック取得部、文字取得部、状態記憶部、状態遷移記憶部、圧縮辞書記憶部から構成される。
検索時には、圧縮ブロックが参照する辞書中の文字列毎に、状態遷移機械の状態遷移の履歴を状態遷移記憶部に記憶しておき、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、履歴の末尾の状態まで、１回の状態遷移で遷移させる。
【０１５１】
このように、オートマトンの状態遷移を利用して検索を行う文字列検索装置において、圧縮テキストを伸長して元の文字列を復元することなく、圧縮テキストから直接、圧縮ブロックを取得して検索を行うことにより、圧縮テキストを伸長するのにかかる時間を削減し、検索が高速になるという効果を奏する。
【０１５２】
取得した圧縮ブロックについて、過去に検索したことがなければ、これを元の部分文字列に復元して、オートマトンの状態遷移を行い、検索する。しかし、過去に検索したことがあり、そのときのオートマトンの状態が同じであれば、同じ状態遷移をもう一度行う必要はない。したがって、過去に検索したときの状態遷移を記憶しておき、オートマトンの状態遷移を１回で済ませることにより、検索が高速になるという効果を奏する。
【０１５３】
しかも、オートマトンの状態遷移を１回で済ませるためにわざわざ遷移後の状態を計算するのではなく、実際に検索を行ったときの状態遷移を記憶するのであるから、無駄な計算をすることがない。これにより、検索が高速になるという効果を奏する。
【０１５４】
検索に利用するオートマトンとして、決定性有限オートマトンを用いることにより、遷移先状態を一意に算出できるので、バックトラックをする必要がなく、検索が高速になるという効果を奏する。
【０１５５】
検索文字列の指定に、正規表現により表現された検索パターンを用いることができるので、検索の自由度が増し、効率的な検索ができるという効果を奏する。
【０１５６】
また、一般的に、正規表現を検索できるよう構成されたＤＦＡは、固定文字列を検索できるよう構成されたＤＦＡよりも、複雑で状態の数も多い。このようなＤＦＡに対して、圧縮ブロックの状態遷移を１回で済ませるよう、遷移後の状態を前もって計算しておくことは無駄が多い。しかし、この実施の形態のように、実際に検索したときの状態遷移を履歴として記憶する方式であれば、無駄な計算をすることはないので、検索が高速になるという効果を奏する。
【０１５７】
実施の形態２．
実施の形態２を図３、図６、図９〜図１０、図４６を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０１５８】
この実施の形態では、ＬＺ７７方式で圧縮されたテキストを検索する場合について説明する。
【０１５９】
図９は、この実施の形態において、圧縮テキスト記憶部１０３及び状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図である。
【０１６０】
圧縮テキスト記憶部１０３は、圧縮ブロック列３００（符号列の一例）を記憶している。図９に示す圧縮ブロック列３００は、元の文字列５００「ａｂｃｄｅｃｂａｂｃｄｅｂｅｃｄａｂｃｄｅｄ」に、図４６の規則を適用して置換したものである。
【０１６１】
状態遷移記憶部１１２（履歴記憶部の一例）は、ＤＦＡ（オートマトンの一例）の状態とＤＦＡに入力した文字とを状態履歴として記憶する。
状態遷移記憶部１１２は状態履歴として、文字と状態を１対１に対応づけて記憶する。
例えば、文字４１１と状態４６１とを対応づけて記憶している。以下、文字４１２と状態４６２、文字４１３と状態４６３も同様に対応づけて記憶している。以下の説明では、状態履歴を、状態と文字を「（）」で括って表現するものとする。例えば、図９に示す状態履歴は「（１、ａ）（２、ｂ）（３、ｃ）（４、ｄ）…」と表現する。
【０１６２】
状態遷移記憶部１１２が記憶する状態履歴は、最初は空である。検索が進むにつれて少ずつ増えていく。
例えば、文字４１１は、元の文字列５００の最初の文字「ａ」に対応し、この文字をＤＦＡに入力したときに記憶したものである。状態４６１は、文字４１１をＤＦＡに入力する前において、状態記憶部１１１が記憶していたＤＦＡの状態である。
【０１６３】
図１０は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
【０１６４】
初期化処理（Ｓ１０）において、検索条件入力部１０２が入力した検索条件（検索パターンの一例）に基づいて、状態遷移表生成部１０５が検索条件を受理する状態遷移機械（ＤＦＡ）に対応する状態遷移表を生成し、状態遷移表記憶部１０６が記憶する。
状態記憶部１１１は初期状態（状態番号＝１）を記憶する。
状態遷移記憶部１１２は、記憶する状態履歴を空にする。
現在位置カウンタ１１５は、現在位置として０を記憶する。
【０１６５】
圧縮ブロック取得部１０８（符号取得部の一例）が、圧縮ブロック列（符号列の一例）の先頭から順に圧縮ブロック（符号の一例）を１個取得する（Ｓ２１）。
【０１６６】
圧縮ブロック列３００は、図４６の規則を適用して置換したものなので、奇数番目の圧縮ブロックは符号９８５あるいは符号９８６であり、偶数番目の圧縮ブロックは符号９８２である。Ｓ２１では、奇数番目の圧縮ブロックを取得するので、それがダミーポインタ（符号９８６）でなければ、他の文字列へのポインタの情報を含んでいる。
【０１６７】
条件判断部１１４は、圧縮ブロック取得部１０８が取得した圧縮ブロックが０かどうかを見て、０でない場合には、他の文字列へのポインタの情報を含んでいると判断する（Ｓ２２）。
【０１６８】
条件判断部１１４は、含んでいると判断した場合、圧縮ブロックを解読して、他の部分文字列の（最初の文字の）出現位置９８３（現在位置からの距離）及び部分文字列の長さ９８４を取得する。更に、状態遷移記憶部１１２が記憶した状態履歴から、出現位置に対応する（出現位置の文字数分だけ前に記憶した状態履歴の）状態及び文字を取得し（Ｓ２３）、取得した状態と状態記憶部１１１が記憶しているＤＦＡの現在の状態とを比較する（Ｓ２４）。
【０１６９】
Ｓ２４において、条件判断部１１４が一致する（第一の条件を満たす）と判断した場合、状態遷移記憶部１１２は、条件判断部１１４が取得した状態及び文字を状態履歴の最後に追加する（Ｓ２５１）。
遷移先算出部１１６は、状態履歴から、次の状態及び文字を取得する（Ｓ２５２）。
検索成功判別部１１７は、遷移先算出部１１６が取得した状態が受理状態であるか否かを判別し、受理状態である場合には、照合結果出力部１０４が、ヒット位置として現在位置カウンタ１１５が記憶する現在位置を出力する（Ｓ２５３）。
現在位置カウンタ１１５が記憶する現在位置を１つ増やし、部分文字列の残りの長さを１つ減らす（Ｓ２５４）。
部分文字列の残りがまだあれば、Ｓ２５１から繰り返す（Ｓ２５５）。
Ｓ２５１〜Ｓ２５５の処理が終わったら、遷移先算出部１１６は、Ｓ２５２で取得した状態に、状態記憶部１１１が記憶したＤＦＡの状態を更新する（Ｓ２５６）。
【０１７０】
Ｓ２４において、条件判断部１１４が一致しない（第二の条件を満たす）と判断した場合、状態遷移記憶部１１２は、状態記憶部１１１が記憶した状態及び条件判断部１１４が取得した文字を、状態履歴の最後に追加する（Ｓ２６１）。
文字取得部１０９（文字列復元部の一例）は、条件判断部１１４が取得した文字を取得し、ＤＦＡに入力する。状態遷移機械１１０は、文字取得部１０９が入力した文字と、状態記憶部１１１が記憶したＤＦＡの現在の状態とに基づいて、状態遷移表記憶部１０６が記憶した状態遷移表を参照し、遷移先状態を取得する。状態遷移機械１１０は、取得した遷移先状態を、状態記憶部１１１に記憶させ、現在の状態を更新する（Ｓ２６２）。
検索成功判別部１１７は、更新されたＤＦＡの現在の状態が受理状態であるか否かを判別し、受理状態である場合には、照合結果出力部１０４が、ヒット位置として現在位置カウンタ１１５が記憶する現在位置を出力する（Ｓ２６３）。
現在位置カウンタ１１５が記憶する現在位置を１つ増やし、部分文字列の残りの長さを１つ減らす（Ｓ２６４）。
部分文字列の残りがまだあれば、Ｓ２３から繰り返す（Ｓ２６５）。
【０１７１】
繰り返し処理において、条件判断部１１４は、再び、状態が一致するかを判定している（Ｓ２４）。部分文字列を入力する前の状態が、状態履歴と異なっていても、何文字かＤＦＡに入力した後で、一致する場合があるからである。
【０１７２】
これにより、最初の状態が一致しなかった場合でも、途中で状態が一致した場合には、それ以降の状態遷移を１回で済ませることができ、検索が高速に行えるという効果を奏する。
【０１７３】
しかし、条件判断が増えることによる処理速度の低下を防ぐため、状態の比較は最初だけ行うように構成してもよい。
あるいは、毎回比較するのではなく、何回かに一回比較する構成としてもよい。
【０１７４】
Ｓ２２で、条件判断部１１４が他の文字列へのポインタの情報を含んでいないと判断した場合、あるいは、Ｓ２３以下の処理が終わった場合、圧縮ブロック取得部１０８は、圧縮ブロック列３００から次の圧縮ブロックを取得する（Ｓ２７）。
これは、偶数番目の圧縮ブロックなので、文字を表現するビット列の符号９８２である。
したがって、条件判断部１１４は、無条件にこれが他の文字列へのポインタの情報を含むものではないと判断する。
【０１７５】
文字取得部１０９は、圧縮ブロック取得部１０８が取得した圧縮ブロックに対応する文字を取得し、状態遷移記憶部１１２は、状態記憶部１１１が記憶したＤＦＡの現在の状態及び文字取得部１０９が取得した文字を、状態履歴の最後に追加する（Ｓ２８１）。
【０１７６】
文字取得部１０９が、取得した文字をＤＦＡに入力し、状態遷移機械１１０が遷移先状態を算出して、状態記憶部１１１が記憶したＤＦＡの現在の状態を更新する（Ｓ２８２）。
【０１７７】
検索成功判別部１１７は、更新されたＤＦＡの現在の状態が受理状態であるか否かを判別し、受理状態である場合には、照合結果出力部１０４が、ヒット位置として現在位置カウンタ１１５が記憶する現在位置を出力する（Ｓ２８３）。
【０１７８】
現在位置カウンタ１１５が記憶する現在位置を１つ増やす（Ｓ２８４）。
【０１７９】
まだ圧縮ブロック列３００に圧縮ブロックが残っていれば、Ｓ２１から処理を繰り返す（Ｓ２９）。
【０１８０】
以上説明した動作を、図６及び図９に示した具体例を使って、詳しく説明する。
【０１８１】
初期化処理（Ｓ１０）により、各記憶部が記憶内容を初期化する。
状態遷移表記憶部１０６は、図６に示す状態遷移表２００を記憶する。状態遷移表２００は、検索条件入力部１０２が入力した検索条件（正規表現を含む）に基づいて、状態遷移表生成部１０５が生成したものである。状態遷移表２００に対応するＤＦＡにおいて、初期状態は状態番号１に対応する状態であり、受理状態は状態番号４に対応する状態である。これも、状態遷移表記憶部１０６が記憶している。なお、ＤＦＡの初期状態は必ず１つであるが、受理状態は複数あってもよい。
状態記憶部１１１は初期状態（状態番号＝１）を記憶する。
状態遷移記憶部１１２は、記憶する状態履歴を空にする。
現在位置カウンタ１１５は、現在位置として「１」を記憶する。
【０１８２】
圧縮テキスト記憶部１０３が記憶した圧縮ブロック列３００から、圧縮ブロック取得部１０８が圧縮ブロックを取得する（Ｓ２１）。最初の圧縮ブロック３１１は「０、０」である。
条件判断部１１４が、取得した圧縮ブロックに他の部分文字列へのポインタの情報が含まれていないと判断し（Ｓ２１）、Ｓ２７へ進む。
【０１８３】
圧縮ブロック取得部１０８が次の圧縮ブロック３１２「ａ」を取得する（Ｓ２７）。
状態遷移記憶部１１２は、状態記憶部１１１が記憶したＤＦＡの現在の状態「１」及び文字「ａ」を、状態履歴の最後に追加する（状態４６１及び文字４１１）（Ｓ２７）。
文字取得部１０９がＤＦＡに文字「ａ」を入力し、ＤＦＡの状態は「２」になる（Ｓ２８２）。受理状態ではないので、出力はせず（Ｓ２８３）、現在位置が「２」になる（Ｓ２８４）。次の圧縮ブロックへ進む（Ｓ２９）。
【０１８４】
次に取得した圧縮ブロック（Ｓ２１）は「０、０」なので（Ｓ２２）、Ｓ２７へ進む。
次に取得した圧縮ブロック（Ｓ２７）は「ｂ」なので、状態「２」と文字「ｂ」を状態履歴に追加（状態４６２及び文字４１２）し（Ｓ２８１）、ＤＦＡに文字「ｂ」を入力すると、ＤＦＡの状態は「３」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置が「３」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０１８５】
次に取得した圧縮ブロック（Ｓ２１）は「０、０」なので（Ｓ２２）、Ｓ２７へ進む。
次に取得した圧縮ブロック（Ｓ２７）は「ｃ」なので、状態「３」と文字「ｃ」を状態履歴に追加（状態４６３及び文字４１３）し（Ｓ２８１）、ＤＦＡに文字「ｃ」を入力すると、ＤＦＡの状態は「４」になる（Ｓ２８２）。受理状態なので、ヒット位置（＝３）を出力し（Ｓ２８３）、現在位置が「４」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０１８６】
次に取得した圧縮ブロック（Ｓ２１）は「０、０」なので（Ｓ２２）、Ｓ２７へ進む。
次に取得した圧縮ブロック（Ｓ２７）は「ｄ」なので、状態「４」と文字「ｄ」を状態履歴に追加し（Ｓ２８１）、ＤＦＡに文字「ｄ」を入力すると、ＤＦＡの状態が「５」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置が「５」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０１８７】
次に取得した圧縮ブロック（Ｓ２１）は「０、０」なので（Ｓ２２）、Ｓ２７へ進む。
次に取得した圧縮ブロック（Ｓ２７）は「ｅ」なので、状態「５」と文字「ｅ」を状態履歴に追加し（Ｓ２８１）、ＤＦＡに文字「ｅ」を入力すると、ＤＦＡの状態が「６」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置が「６」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０１８８】
この時点で、状態履歴は「（１、ａ）（２、ｂ）（３、ｃ）（４、ｄ）（５、ｅ）」となる。
【０１８９】
次に取得した圧縮ブロック「３、１」（Ｓ２１）はポインタなので（Ｓ２２）、出現位置「３」、長さ「１」を取得し、３文字前（出現位置＝３）の状態４６３「３」及び文字４１３「ｃ」を取得する（Ｓ２３）。
取得した状態「３」と、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝６）とを比較する（Ｓ２４）。
一致しないので、現在の状態「６」と取得した文字「ｃ」を状態履歴に追加する（Ｓ２６１）。ＤＦＡに文字「ｃ」を入力して、ＤＦＡの状態が「３」になる（Ｓ２６２）。受理状態か判別し（Ｓ２６３）、現在位置が「７」になる（Ｓ２６４）。長さ文字数分の入力が終わったので（Ｓ２６５）、Ｓ２７へ進む。
【０１９０】
次に取得した圧縮ブロック（Ｓ２７）は「ｂ」なので、状態「３」と文字「ｂ」を状態履歴に追加し（Ｓ２８１）、ＤＦＡに文字「ｂ」を入力すると、ＤＦＡの状態が「１」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置が「８」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０１９１】
この時点で、状態履歴は「（１、ａ）（２、ｂ）（３、ｃ）（４、ｄ）（５、ｅ）（６、ｃ）（３、ｂ）」となる。
【０１９２】
次に取得した圧縮ブロック「７、５」（Ｓ２１）はポインタなので（Ｓ２２）、出現位置「７」、長さ「５」を取得し、７文字前（出現位置＝７）の状態４６１「１」及び文字４１１「ａ」を取得する（Ｓ２３）。
取得した状態「１」と、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝１）とを比較する（Ｓ２４）。
【０１９３】
一致するので、取得した状態「１」と文字「ａ」を状態履歴に追加する（状態４６８及び文字４１８）（Ｓ２５１）。状態履歴から７文字前の状態４６２「２」及び文字４１２「ｂ」を取得し（Ｓ２５２）、取得した状態「２」が受理状態か判別する（Ｓ２５３）。現在位置は「９」になり（Ｓ２５４）、繰り返しは残り４文字となる（Ｓ２５５）。
【０１９４】
取得した状態「２」と文字「ｂ」を状態履歴に追加する（状態４６９及び文字４１９）（Ｓ２５１）。状態履歴から７文字前の状態４６３「３」及び文字４１３「ｃ」を取得し（Ｓ２５２）、取得した状態「３」が受理状態か判別する（Ｓ２５３）。現在位置は「１０」になり（Ｓ２５４）、繰り返しは残り３文字となる（Ｓ２５５）。
【０１９５】
取得した状態「３」と文字「ｃ」を状態履歴に追加する（状態４７０及び文字４２０）（Ｓ２５１）。状態履歴から７文字前の状態「４」及び文字「ｄ」を取得し（Ｓ２５２）、取得した状態「４」が受理状態なので、ヒット位置「１０」を出力する（Ｓ２５３）。現在位置は「１１」になり（Ｓ２５４）、繰り返しは残り２文字となる（Ｓ２５５）。
【０１９６】
取得した状態「４」と文字「ｄ」を状態履歴に追加する（Ｓ２５１）。状態履歴から７文字前の状態「５」及び文字「ｅ」を取得し（Ｓ２５２）、取得した状態「５」が受理状態か判別する（Ｓ２５３）。現在位置は「１２」になり（Ｓ２５４）、繰り返しは残り１文字となる（Ｓ２５５）。
【０１９７】
取得した状態「５」と文字「ｅ」を状態履歴に追加する（Ｓ２５１）。状態履歴から７文字前の状態「６」及び文字「ｃ」を取得し（Ｓ２５２）、取得した状態「６」が受理状態か判別する（Ｓ２５３）。現在位置は「１３」になり（Ｓ２５４）、繰り返しを終了する（Ｓ２５５）。ＤＦＡの現在の状態は「６」になる（Ｓ２５６）。
【０１９８】
次に取得した圧縮ブロック（Ｓ２７）は「ｂ」なので、状態「６」と文字「ｂ」を状態履歴に追加し（Ｓ２８１）、ＤＦＡに文字「ｂ」を入力すると、ＤＦＡの状態が「１」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置が「１４」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０１９９】
次に取得した圧縮ブロック「８、２」（Ｓ２１）はポインタなので（Ｓ２２）、出現位置「８」、長さ「２」を取得し、８文字前（出現位置＝８）の状態「６」及び文字「ｃ」を取得する（Ｓ２３）。
取得した状態「３」と、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝１）とを比較する（Ｓ２４）。
一致しないので、現在の状態「１」と取得した文字「ｃ」を状態履歴に追加する（Ｓ２６１）。ＤＦＡに文字「ｃ」を入力して、ＤＦＡの状態が「１」になる（Ｓ２６２）。受理状態か判別し（Ｓ２６３）、現在位置が「１５」になる（Ｓ２６４）。繰り返しは残り１文字となる（Ｓ２６５）。
【０２００】
８文字前の状態「３」及び文字「ｂ」を取得する（Ｓ２３）。
取得した状態「３」と、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝１）とを比較する（Ｓ２４）。
一致しないので、現在の状態「１」と取得した文字「ｂ」を状態履歴に追加する（Ｓ２６１）。ＤＦＡに文字「ｂ」を入力して、ＤＦＡの状態が「１」になる（Ｓ２６２）。受理状態か判別し（Ｓ２６３）、現在位置が「１６」になる（Ｓ２６４）。繰り返しを終了する（Ｓ２６５）。
【０２０１】
次に取得した圧縮ブロック（Ｓ２７）は「ｄ」なので、状態「１」と文字「ｄ」を状態履歴に追加し（Ｓ２８１）、ＤＦＡに文字「ｄ」を入力すると、ＤＦＡの状態が「５」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置が「１７」になる（Ｓ２８４）。次へ進む（Ｓ２９）。
【０２０２】
次に取得した圧縮ブロック「９、５」（Ｓ２１）はポインタなので（Ｓ２２）、出現位置「９」、長さ「５」を取得し、９文字前（出現位置＝９）の状態「１」及び文字「ａ」を取得する（Ｓ２３）。
取得した状態「１」と、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝５）とを比較する（Ｓ２４）。
一致しないので、現在の状態「５」と取得した文字「ａ」を状態履歴に追加する（Ｓ２６１）。ＤＦＡに文字「ａ」を入力して、ＤＦＡの状態が「２」になる（Ｓ２６２）。受理状態か判別し（Ｓ２６３）、現在位置が「１５」になる（Ｓ２６４）。繰り返しは残り４文字となる（Ｓ２６５）。
【０２０３】
９文字前の状態「２」及び文字「ｂ」を取得する（Ｓ２３）。
取得した状態「２」と、状態記憶部１１１が記憶したＤＦＡの現在の状態（＝２）とを比較する（Ｓ２４）。
一致するので、取得した状態「２」と文字「ｂ」を状態履歴に追加する（Ｓ２５１）。状態履歴から９文字前の状態「３」及び文字「ｃ」を取得し（Ｓ２５２）、取得した状態「３」が受理状態か判別する（Ｓ２５３）。現在位置は「１６」になり（Ｓ２５４）、繰り返しは残り３文字となる（Ｓ２５５）。
【０２０４】
以下、同様の処理の繰り返しなので、説明は省略する。
【０２０５】
なお、状態遷移記憶部１１２は状態履歴をすべて記憶しておく必要はない。例えば、出現位置９８３を表すビット列が８ビットのビット長である場合、最大２５５文字前までしか参照できない。したがって、２５６文字分以上前の状態履歴を記憶していても使われることはないので、古いものから順に消去してしまってよい。
【０２０６】
このように、ＬＺ７７方式で圧縮されたテキストを検索する場合において、一般にＬＺ７７方式の圧縮テキストを復元するのに使用されるスライド窓の機能を拡張し、そのときのＤＦＡの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
【０２０７】
実施の形態３．
実施の形態３０を図３、図１１〜図１３を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０２０８】
この実施の形態では、ＬＺ７７方式で圧縮されたテキストを検索する別の場合について説明する。
【０２０９】
図１１は、ＬＺ７７形式による圧縮テキストの構造を示す図である。ＬＺ７７形式では、図４のような固定の圧縮辞書を持つ代わりに、固定長のスライド窓と呼ばれる自らのテキストの一部を辞書として利用する。スライド窓の長さは実装方式に依存する。ＬＺ７７形式の圧縮テキストは圧縮ブロック列３００のみから構成される。各圧縮ブロック８０２は、スライド窓８０３中の一致する文字列の位置、一致文字列長、最初の不一致文字の情報を持っている。例えば、図１１の例では、圧縮ブロック８０４は、一致する文字列の位置＝１、一致文字列長＝５、最初の不一致文字＝「ｂ」である。これは、圧縮ブロック８０４がスライド窓８０３（この例では、スライド窓の長さを８としている）の１番目の文字から５文字目までの文字列に、文字「ｂ」を加えた文字列「ａｂｃｄｅｂ」と等しいことを意味する。ここで、スライド窓８０３の下に付加した数値は、スライド窓中の文字位置を明確にするために便宜上付加したものである。以降、スライド窓の一致する文字列の位置から始まり、一致文字列長の長さを持つ文字列を、圧縮ブロックの参照文字列と呼ぶこととする。また、圧縮ブロックの一致する文字列の位置を参照位置、一致文字列の長さを参照文字列長とも呼ぶこととする。
【０２１０】
これまでに、ＬＺ７７形式のスライド窓の参照を高速化するために、様々な方法が提案されているが、この実施の形態では、上記のスライド窓の機能を備えていれば、その実現方式は問わない。
【０２１１】
図１２は、この実施の形態における、圧縮辞書記憶部１１３（辞書記憶部の一例）と状態遷移記憶部１１２（履歴記憶部の一例）の記憶する情報を図示したものである。圧縮辞書記憶部１１３は、スライド窓２１０を記憶している。状態遷移記憶部１１２は、スライド窓長＋１の状態遷移を記憶する状態遷移履歴２２０と、受理位置２３０を記憶している。受理位置２３０は、状態遷移履歴２２０の中で、受理状態の位置を記憶している。圧縮ブロックの参照位置がｎのとき、状態遷移履歴の先頭の状態からｎ番目の状態を、状態遷移履歴の参照位置と呼ぶ。
【０２１２】
図１３は、この実施の形態の圧縮テキスト検索装置１００における検索処理の流れ図である。初期状態として、検索条件入力部１０２が入力した検索条件から状態遷移表生成部１０５によって状態遷移表が生成され、状態遷移表記憶部１０６が記憶されているものとする。また、状態記憶部１１１には初期状態（＝１）がセットされているものとする。圧縮辞書記憶部１１３と、状態遷移記憶部１１２の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを０に初期化する。
【０２１３】
最初に、ステップＳ７０１で、圧縮ブロック取得部１０８により、圧縮ブロック列の先頭から順に圧縮ブロックを１個ずつ取得する。ステップＳ７０２で、状態記憶部１１１が記憶したＤＦＡの現在の状態と、状態遷移履歴の参照位置の状態が一致するか判定する。状態が一致した場合は（ＹＥＳ）、ステップＳ７０３で状態遷移履歴の先頭から（参照位置＋参照文字列長）番目の状態と、最初の不一致文字から次の状態遷移を取得し、現在の状態にセットする。ステップＳ７０４で、状態遷移履歴の参照位置から（参照位置＋参照文字列長）番目の位置の間に受理状態があるか判定する。受理状態がある場合は（ＹＥＳ）、ステップＳ７０５でヒット位置を計算して出力する。ヒット位置は現在の元テキスト長＋受理位置となる。現在の状態が受理状態である場合もヒット位置として、元テキスト長＋参照文字列長を出力する。受理状態が無い場合は（ＮＯ）、何もせずにステップＳ７０６へ進む。ステップＳ７０６では、スライド窓と状態遷移履歴を更新する。
【０２１４】
スライド窓の更新では、まず、スライド窓中の文字列を、（参照文字列長＋１）文字分前へシフトする。次にスライド窓の最後の文字の後ろに参照文字列と最初の不一致文字を追加する。同様に、状態遷移履歴も、（参照文字列長＋１）文字分前へシフトし、末尾に参照位置から参照文字列長分の状態遷移履歴を追加する。状態遷移履歴にはさらに現在の状態を追加する。
【０２１５】
ステップＳ７０７では、圧縮ブロック列の終端に達しているか判定し、達していない場合は（ＮＯ）、ステップＳ７０１で次の圧縮ブロック列を取得する。達していた場合は（ＹＥＳ）、検索処理を終了する。このステップＳ７０７で、元テキスト長に参照文字列長＋１を加える。
【０２１６】
ステップＳ７０２で、現在の状態と、状態遷移履歴の参照位置の状態が一致しない場合は（ＮＯ）、ステップＳ７０８で参照文字列に最初の不一致文字を加えた文字列に対して、状態遷移の履歴を求める。すなわち、図７の処理の流れと同様に、参照文字列に不一致文字を加えた文字列の先頭から順に１文字ずつ取得しながら、状態遷移機械によって次の状態を取得する。ステップＳ７０８の処理が終了したら、ステップＳ７０６でスライド窓と状態遷移履歴を更新する。すなわち、スライド窓中の文字列を、（参照文字列長＋１）文字分前へシフトし、スライド窓の最後の文字の後ろに参照文字列と最初の不一致文字を追加する。同様に、状態遷移履歴も、同様に（参照文字列長＋１）文字分前へシフトし、末尾にステップＳ７０８で取得した状態遷移の履歴をセットする。
【０２１７】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、２回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺ７７形式で圧縮された圧縮テキストを高速に検索することができる。
【０２１８】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺ７７形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長＋１の長さの状態遷移履歴を記憶する。
ＬＺ７７形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで状態を１回の状態遷移で遷移させ、さらに不一致文字により状態を遷移させる。
【０２１９】
実施の形態４．
実施の形態４を図３、図１４、図１５、図４４を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０２２０】
この実施の形態では、ＬＺＳＳ方式で圧縮されたテキストを検索する場合について説明する。
【０２２１】
図１４は、この実施の形態において、圧縮テキスト記憶部１０３及び状態遷移記憶部１１２の記憶内容の一例を示す図である。
【０２２２】
圧縮テキスト記憶部１０３は、圧縮ブロック列３００（符号列の一例）を記憶する。図１４に示す圧縮ブロック列３００は、元の文字列５００「ａｂｃｄｅｃｂａｂｃｄｅｂｅｃｄａｂｃｄｅｄ」に、図４４の規則を適用して置換したものである。
【０２２３】
状態遷移記憶部１１２（履歴記憶部の一例）は、ＤＦＡ（オートマトンの一例）の状態とＤＦＡに入力した文字とを状態履歴として記憶する。
この実施の形態では、実施の形態２と異なり、文字に対応する状態を複数記憶できる。
例えば、文字４３１は状態４８１と対応づけられている。また、文字４３８は状態４８８及び状態４４８と対応づけられている。具体的な実現方法としては、表形式、リスト形式、ポインタ形式等の構造が考えられるが、他の実現方法でもよい。
また、実施の形態２と同様に、文字と状態を１対１対応として記憶することとしてもよい。
【０２２４】
図１５は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
図１５は、実施の形態２で説明した図１０とほぼ同じなので、異なる部分のみ説明する。
【０２２５】
ＬＺＳＳ方式は、ＬＺ７７方式と符号化の方式が異なっている。したがって、制御の流れも、それに対応する部分が異なっている。
【０２２６】
すなわち、圧縮ブロック取得部１０８は、まず圧縮ブロック列３００から１ビット（フラグ９８１）を取得し、圧縮ブロックの長さを判別する。フラグ９８１が「１」の場合、図４４の規則１であるから、続く８ビット（ビット列９８２）を取得する。フラグ９８１が「０」の場合、図４４の規則２であるから、続く１３ビット（出現位置９８３及び長さ９８４）を取得する（Ｓ２１）。
条件判断部１１４は、フラグ９８１が「１」の場合、他の部分文字列へのポインタの情報を含まないと判断し（Ｓ２２）、文字取得部１０９が圧縮ブロックから文字を取得し、状態遷移記憶部１１２が、現在の状態と取得した文字とを状態履歴の最後に追加する（Ｓ２８１）。
条件判断部１１４は、フラグ９８１が「０」の場合、他の部分文字列へのポインタの情報を含むと判断し（Ｓ２２）、圧縮ブロックから、他の部分文字列の（最初の文字の）出現位置９８３（現在位置からの距離）及び部分文字列の長さ９８４を取得する。更に、状態遷移記憶部１１２が記憶した状態履歴から、出現位置に対応する状態及び文字を取得し、状態記憶部１１１が記憶しているＤＦＡの現在の状態と比較する（Ｓ２４）。
【０２２７】
この実施の形態では、もう一つ実施の形態２と異なる部分がある。この実施の形態では、文字に対応して複数の状態を記憶できるよう、状態遷移記憶部１１２を構成している点である。
【０２２８】
Ｓ２４において、条件判断部１１４は、取得した状態が複数ある場合に、そのなかにＤＦＡの現在の状態と一致するものがあるかどうかを判別する（Ｓ２４）。
一致するものがあった場合、状態遷移記憶部１１２は、一致しなかった状態も含めて、取得した状態すべてと文字とを、状態履歴の最後に追加する（Ｓ２５１）。
遷移先算出部１１６は、次の状態及び文字を取得する（Ｓ２５２）。
検索成功判別部１１７は、取得した状態のうち、一致した状態に対応する状態が受理状態かを判別する（Ｓ２５３）。
【０２２９】
例えば、図１４において、状態遷移記憶部１１２は、文字４３８「ｂ」に対応して、状態４８８「４」及び状態４４８「２」の２つの状態を記憶している。これに対して、現在の状態が「２」だったとする。
Ｓ２３において、条件判断部１１４が状態「４」及び「２」、文字「ｂ」を取得する。
Ｓ２４において、条件判断部１１４は、取得した状態（４、２）に現在の状態（＝２）が含まれているので、一致すると判断する。
Ｓ２５１において、状態遷移記憶部１１２は、取得した状態「４」及び「２」すべてと、文字「ｂ」とを、状態履歴の最後に追加する。
Ｓ２５２において、遷移先算出部１１６は、次の状態４９５「１」及び状態４７５「３」と、文字４４５「ｃ」とを取得する。
【０２３０】
ここで、次の状態４８９「１」は、状態４８８「４」に対応しており、ＤＦＡの状態が状態４８８「４」だったときに文字「ｂ」を入力して遷移した状態を示している。また、次の状態４４９「３」は、状態４４８「２」に対応しており、ＤＦＡの状態が状態４４８「２」だったときに文字「ｂ」を入力して遷移した状態を示している。図１５では、この対応関係を矢印を使って表現しているが、状態遷移記憶部１１２はこの関係を、例えば、ポインタを用いて記憶する。
【０２３１】
Ｓ２５３において、検索成功判別部１１７は、取得した２つの状態のうち、一致した状態４４８に対応する状態４４９「３」が受理状態か否かを判別する。
【０２３２】
同様に、Ｓ２５６において、遷移先算出部１１６が算出する遷移先状態も、取得した状態が複数あるときは、一致した状態に対応する状態となり、状態記憶部１１１は、その状態を記憶する（Ｓ２５６）。
【０２３３】
Ｓ２４において、取得した状態の中にＤＦＡの現在の状態と一致するものがなかった場合、条件判断部１１４は一致しないと判断する（Ｓ２４）。
状態遷移記憶部１１２は、現在の状態及び取得した状態と、取得した文字とを状態履歴の最後に追加する（Ｓ２６１）。
【０２３４】
したがって、状態が一致しなかった場合、１つの文字に対応して記憶する状態が１つ増えることになる。
【０２３５】
自己参照型の圧縮技術において、元の文字列に同じ部分文字列が何回も出てくる場合、現在位置から近い方の部分文字列を参照することがある。出現位置を符号化する際のビット数の制限により、遠い方を参照することができないからである。また、あまり遠い部分文字列を参照することとすると、圧縮の際に時間がかかり過ぎ、また復元の際に記憶領域を消費し過ぎて、実用に耐えない場合があるからである。
【０２３６】
同じ部分文字列が何回も出現する場合において、状態を１つしか記憶しなければ、状態が一致する可能性は低い。しかし、状態を複数記憶できることとすれば、その分状態が一致する可能性が高くなる。これにより、検索が更に高速に行えるという効果を奏する。
【０２３７】
以上説明した動作を、図６及び図１４に示す具体例を使って、詳しく説明する。
【０２３８】
圧縮ブロック３３４まで処理が終わり、状態遷移記憶部１１２は、状態履歴として状態４８１〜４８４及び文字４３１〜４３４を記憶している。
状態記憶部１１１は、ＤＦＡの現在の状態として「５」を記憶している。
【０２３９】
次の圧縮ブロック３３５を取得する（Ｓ２１）。フラグ９８１が「０」なので、ポインタである（Ｓ２２）。出現位置「４」、長さ「２」なので、４文字前の状態４８１「１」及び文字４３１「ａ」を取得し（Ｓ２３）、取得した状態「１」と現在の状態「５」とを比較する（Ｓ２４）。
一致しないので、現在の状態「５」及び取得した状態「１」と文字「ａ」とを状態履歴の最後に追加する（状態４８５、４４５、文字４３５）（Ｓ２６１）。
ＤＦＡに文字「ａ」を入力し、現在の状態が「２」に遷移する（Ｓ２６２）。
受理状態か判別し（Ｓ２６３）、現在位置を進める（Ｓ２６４）。繰り返しは残り１文字になる（Ｓ２６５）。
【０２４０】
４文字前の状態４８２「２」及び文字４３２「ｂ」を取得し、取得した状態「２」と現在の状態「２」とを比較する（Ｓ２４）。
一致するので、取得した状態「２」と文字「ａ」とを状態履歴の最後に追加する（状態４８６及び文字４３６）（Ｓ２５１）。
このとき、前の状態が「１」でも「５」でも同じ状態「２」になるので、状態４８６は、状態４８５と状態４４５の両方に対応づけられる（図１４の矢印）。
【０２４１】
状態履歴から、４文字前の状態４８３「３」及び文字４３３「ｃ」を取得し（Ｓ２５２）、受理状態か判別し（Ｓ２５３）、現在位置を進める（Ｓ２５４）。繰り返しは終了する（Ｓ２５５）。
【０２４２】
ＤＦＡの状態を、取得した状態「３」に更新し（Ｓ２５６）、次の圧縮ブロックへ進む（Ｓ２９）。
【０２４３】
次の圧縮ブロック３３６を取得する（Ｓ２１）。フラグ９８１が「１」なので、文字である（Ｓ２２）。文字「ｅ」を取得し、現在の状態「３」及び文字「ｅ」を状態履歴に追加する（状態４８７及び文字４３７）（Ｓ２８１）。文字「ｅ」をＤＦＡに入力すると、ＤＦＡの状態は「４」になる（Ｓ２８２）。受理状態か判別し（Ｓ２８３）、現在位置を進める（Ｓ２８４）。次の圧縮ブロックへ進む（Ｓ２９）。
【０２４４】
次の圧縮ブロック３３７を取得する（Ｓ２１）。フラグ９８１が「０」なので、ポインタである（Ｓ２２）。出現位置「６」、長さ「７」なので、６文字前の状態４８２「２」及び文字４３２「ｂ」を取得し（Ｓ２３）、取得した状態「２」と現在の状態「４」とを比較する（Ｓ２４）。
【０２４５】
一致しないので、現在の状態「４」及び取得した状態「２」と文字「ｂ」とを状態履歴に追加する（状態４８８、４４８、文字４３８）（Ｓ２６１）。
ＤＦＡに文字「ｂ」を入力し、現在の状態が「１」に遷移する（Ｓ２６２）。
受理状態か判別し（Ｓ２６３）、現在位置を進める（Ｓ２６４）。繰り返しは残り６文字になる（Ｓ２６５）。
【０２４６】
６文字前の状態４８３「３」及び文字４３３「ｃ」を取得し（Ｓ２３）、取得した状態「３」と現在の状態「１」とを比較する（Ｓ２４）。
一致しないので、現在の状態「１」及び取得した状態「３」と文字「ｃ」とを状態履歴に追加する（状態４８９、４４９、文字４３９）（Ｓ２６１）。
このとき、状態４８９は状態４８８と対応づける。また、状態４４９は状態４４８と対応づける。
ＤＦＡに文字「ｃ」を入力し、現在の状態が「１」に遷移する（Ｓ２６２）。
受理状態か判別し（Ｓ２６３）、現在位置を進める（Ｓ２６４）。繰り返しは残り５文字になる（Ｓ２６５）。
【０２４７】
６文字前の状態４８４「４」及び文字４３４「ｄ」を取得し（Ｓ２３）、取得した状態「４」と現在の状態「１」とを比較する（Ｓ２４）。
一致しないので、現在の状態「１」及び取得した状態「４」と文字「ｄ」とを状態履歴に追加する（状態４９０、４５０、文字４４０）（Ｓ２６１）。
このとき、状態４９０は状態４８９と対応づける。また、状態４５０は状態４４９と対応づける。
ＤＦＡに文字「ｄ」を入力し、現在の状態が「５」に遷移する（Ｓ２６２）。
受理状態か判別し（Ｓ２６３）、現在位置を進める（Ｓ２６４）。繰り返しは残り４文字になる（Ｓ２６５）。
【０２４８】
６文字前の状態４８５「５」、状態４４５「１」及び文字４３５「ａ」を取得し（Ｓ２３）、取得した状態と現在の状態「１」とを比較する（Ｓ２４）。
状態４４５と一致するので、取得した状態「１」及び「５」と文字「ａ」とを状態履歴に追加する（状態４９１、４５１、文字４４１）（Ｓ２５１）。
このとき、状態４９１は状態４９０及び状態４５０と対応づける。どちらの状態からも同じ状態「１」に遷移するからである。また、状態４５１は、前の状態と対応づけない。
【０２４９】
６文字前の状態４８６「２」及び文字４３５「ｂ」を取得する（Ｓ２５２）。
取得した状態が受理状態か判別し（Ｓ２５３）、現在位置を進める（Ｓ２５４）。繰り返しは残り３文字になる（Ｓ２６５）。
【０２５０】
以下、同様の処理の繰り返しなので、説明は省略する。
【０２５１】
このように、ＬＺＳＳ方式で圧縮されたテキストを検索する場合において、一般にＬＺＳＳ方式の圧縮テキストを復元するのに使用されるスライド窓の機能を拡張し、そのときのＤＦＡの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
【０２５２】
また、そのときのＤＦＡの状態だけでなく、それが参照している過去に検索したときの状態遷移を合わせて記憶することにより、直接参照していない場合でも、過去の状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が更に高速に行えるという効果を奏する。
【０２５３】
なお、このように、１つの文字に対して複数の状態を記憶できるようにした構成は、ＬＺＳＳ方式の圧縮テキストに限るものではなく、ＬＺ７７方式の圧縮テキストを検索する場合にも用いることができる。
【０２５４】
更に、自己参照型の圧縮方式には、この他にも様々なものがある。例えば、上述したＬＺ７７方式あるいはＬＺＳＳ方式の符号列を、さらにハフマン符号化（静的あるいは動的）によって置換し、更に全体のビット長を短くしたもの等がある。
ここで説明した実施の形態は、それらの圧縮方式によって圧縮されたテキストにも適用できる。
【０２５５】
実施の形態５．
実施の形態５を図３、図１３、図１６を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０２５６】
この実施の形態では、ＬＺＳＳ方式で圧縮されたテキストを検索する別の場合について説明する。
【０２５７】
図１６は、ＬＺＳＳ形式による圧縮テキストの構造を示す図である。ＬＺＳＳ形式は、ＬＺ７７形式の圧縮ブロックの冗長なデータを削除することにより、より圧縮効率を高めることを目的とした圧縮形式である。ＬＺＳＳ形式では、ＬＺ７７形式と同様に、図４のような固定の圧縮辞書３０３を持つ代わりに、固定長のスライド窓と呼ばれる自らのテキストの一部を辞書として利用する。ＬＺＳＳ形式の圧縮テキストは圧縮ブロック列３００のみから構成される。ＬＺ７７形式では、スライド窓に参照文字列が無い場合でも、圧縮ブロックには参照位置＝０、参照文字列長＝０という冗長な情報が含まれている。ＬＺＳＳ形式では、圧縮ブロックの先頭に１ビットのフラグを設けることで冗長なデータを削除する。スライド窓に参照文字列が無い場合は、圧縮ブロック１００２のように先頭のビットを０とし、次に不一致文字がセットされる。参照文字列が存在する場合は、圧縮ブロック１００４のように先頭のビットを１とし、次に参照位置と参照文字列長がセットされる。
【０２５８】
これまでに、ＬＺＳＳ形式のスライド窓の参照を高速化するために、様々な方法が提案されているが、この実施の形態の圧縮テキスト検索装置では、上記のスライド窓の機能を備えていれば、その実現方式は問わない。
【０２５９】
この実施の形態の圧縮テキスト検索装置１００における検索処理の流れは、図１３に示したものと同様である。初期状態として、検索条件入力部１０２が入力した検索条件から状態遷移表生成部１０５が状態遷移表を生成し、状態遷移表記憶部１０６が記憶しているものとする。また、状態記憶部１１１には初期状態がセットされているものとする。圧縮辞書記憶部１１３と、状態遷移記憶部１１２の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを０に初期化する。
【０２６０】
実施の形態３との主要な差異は、ステップＳ７０２とステップＳ７０６である。最初に、ステップＳ７０１で、圧縮ブロック列の先頭から順に圧縮ブロックを１個ずつ取得する。ステップＳ７０２で、圧縮ブロックの先頭のビットを判定する。さらに、圧縮ブロックの先頭のビットが１であった場合は、現在の状態と、状態遷移履歴の参照位置の状態が一致するか判定する。状態が一致した場合は（ＹＥＳ）、ステップＳ７０３で状態遷移履歴の先頭から（参照位置＋参照文字列長）番目の状態を現在の状態にセットする。ステップＳ７０４で、状態遷移履歴の参照位置から（参照位置＋参照文字列長）番目の状態が受理状態であるか判定する。受理状態である場合は（ＹＥＳ）、ステップＳ７０５でヒット位置を計算して出力し、ステップＳ７０６へ進む。受理状態が無い場合は（ＮＯ）、何もせずにステップＳ７０６へ進む。ステップＳ７０６では、スライド窓と状態遷移履歴を更新する。
【０２６１】
スライド窓の更新では、まず、スライド窓中の文字列を、参照文字列長分前へシフトする。次にスライド窓の最後の文字の後ろに参照文字列を追加する。同様に、状態遷移履歴も、参照文字列長分前へシフトし、末尾に参照位置から参照文字列長分の状態遷移履歴を追加する。
【０２６２】
ステップＳ７０７では、圧縮ブロック列の終端に達しているか判定し、達していない場合は（ＮＯ）、ステップＳ７０１で次の圧縮ブロック列を取得する。達していた場合は（ＹＥＳ）、検索処理を終了する。ステップＳ７０７で、元テキスト長に、圧縮ブロックの先頭のビットが０の場合は１を、先頭のビットが１の場合は参照文字列長を加える。
【０２６３】
ステップＳ７０２で、圧縮ブロックの先頭の１ビットが０であるか、現在の状態と状態遷移履歴の参照位置の状態が一致しない場合は（ＮＯ）、ステップＳ７０８で不一致文字または参照文字列に対して状態遷移の履歴を求める。すなわち、図５の処理の流れと同様に、文字列の先頭から順に１文字ずつ取得しながら、状態遷移機械によって次の状態を取得する。ステップＳ７０８の処理が終了したら、ステップ７０６でスライド窓と状態遷移履歴を更新する。すなわち、スライド窓中の文字列を、１文字または参照文字列長分前へシフトする。次にスライド窓の最後の文字の後ろに不一致文字または参照文字列を追加する。同様に、状態遷移履歴も、１文字または参照文字列長分前へシフトし、末尾にステップＳ７０８で取得した状態遷移の履歴を追加する。
【０２６４】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長に比例したステップ数要する状態遷移の処理を、１回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺＳＳ形式で圧縮された圧縮テキストを高速に検索することができる。
【０２６５】
ここで示したＬＺＳＳ形式以外にも、ＬＺＢ（Ｌｅｍｐｅｌ−Ｚｉｖ−Ｂｅｌｌ）形式やＬＺＢＷ（Ｌｅｍｐｅｌ−Ｚｉｖ−Ｂｅｎｄｅｒ−Ｗｏｌｆ）形式など、ＬＺ７７形式から派生した圧縮形式で圧縮されたテキストを、この実施の形態の圧縮テキスト検索装置によって同様に検索することができる。
【０２６６】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺＳＳ形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長＋１の長さの状態遷移履歴を記憶する。
ＬＺＳＳ形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで１回の状態遷移で状態を遷移させる。
【０２６７】
実施の形態６．
実施の形態６を図３、図６、図１７、図１８、図４８を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０２６８】
この実施の形態では、ＬＺ７８方式で圧縮されたテキストを検索する場合について説明する。
【０２６９】
図１７は、この実施の形態において、圧縮テキスト記憶部１０３及び圧縮辞書記憶部１１３（辞書記憶部の一例）及び状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図である。
【０２７０】
圧縮テキスト記憶部１０３は、圧縮ブロック列３００を記憶している。圧縮ブロック列３００は、元の文字列５００「ａａｂａｂｃｄｅｃａｂｃｄｅｂａｂｃｄｅｃｃ」に、図４８の規則を適用して置換したものである。
【０２７１】
状態遷移記憶部１１２は、辞書の「参照番号」を行とし、「最初の状態」を列とする表の形で状態履歴を記憶する。しかし、このような表の形ではなく、例えばリスト形式で記憶してもよい。
状態履歴としては「遷移先状態」及び「受理位置」を記憶する。状態履歴は最初は空であり、検索が進むにつれて、埋まっていく。
【０２７２】
圧縮辞書記憶部１１３は、圧縮ブロック列３００から抽出した圧縮辞書（置換辞書の一例）を記憶する。圧縮辞書は、辞書の「参照番号」と、前方参照番号及び接尾文字（後方文字列の一例）とを対応づけている。ここで「参照番号」に対応する部分文字列は、前方参照番号に対応する部分文字列（前方文字列の一例）の後に接尾文字を付けたものである。また、前方参照番号が「０」の場合は、対応する部分文字列は、接尾文字１文字からなる文字列である。
例えば、参照番号１は、部分文字列「ａ」に対応する。参照番号２は、参照番号１に対応する部分文字列「ａ」に接尾文字「ｂ」を付けたもの（「ａｂ」）に対応する。参照番号３は、「ａｂ」＋「ｃ」で、「ａｂｃ」に対応する。
圧縮辞書は最初は空であり、検索が進むにつれて、エントリが増えていく。
【０２７３】
図１８は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
【０２７４】
初期化処理（Ｓ１０）において、検索条件入力部１０２が入力した検索条件（検索パターンの一例）に基づいて、状態遷移表生成部１０５が検索条件を受理する状態遷移機械（ＤＦＡ）に対応する状態遷移表を生成し、状態遷移表記憶部１０６が記憶する。
状態記憶部１１１は初期状態（状態番号＝１）を記憶する。
状態遷移記憶部１１２は、記憶する状態履歴を空にする。
圧縮辞書記憶部１１３は、記憶部する圧縮辞書を空にする。
現在位置カウンタ１１５は、現在位置として０を記憶する。
【０２７５】
圧縮ブロック取得部１０８（符号取得部の一例）が、圧縮ブロック列（符号列の一例）の先頭から順に、圧縮ブロック（符号の一例）を１個取得する（Ｓ３１）。状態遷移記憶部１１２は、状態記憶部１１１が記憶したＤＦＡの現在の状態を、最初の状態として記憶しておく。
【０２７６】
図４８の規則によれば、参照番号を示す符号９７１と文字を表すビット列の符号９７２とは交互に出現するので、奇数番目の圧縮ブロックは、参照番号を示す符号９７１である。
【０２７７】
圧縮ブロック取得部１０８は、参照番号を条件判断部１１４に渡して、展開ルーチンを実行する（Ｓ３２）。
【０２７８】
展開ルーチンでは、条件判断部１１４が、受け取った参照番号が０か否かを判断する（Ｓ３２１）。
参照番号が０の場合は、対応する部分文字列は空なので、展開ルーチンを終了する。
参照番号が０以外の場合は、対応する部分文字列が圧縮辞書に登録されている。そこで、条件判断部１１４は、状態遷移記憶部１１２が記憶している状態履歴を参照する。状態履歴の表において、「参照番号」行、「現在の状態」列を見て、過去にその参照番号の部分文字列を検索したときの状態履歴が記憶されているかを見る（Ｓ３２２）。
【０２７９】
記憶されている場合には、遷移先算出部１１６が、状態履歴から遷移先状態を取得し（Ｓ３２３）、状態記憶部１１１が記憶したＤＦＡの現在の状態を、遷移先状態に更新する（Ｓ３２４）。
次に、検索成功判別部１１７が、状態履歴から受理位置を取得し、受理位置がある場合には、ヒット位置を算出して出力する（Ｓ３２５）。
【０２８０】
条件判断部１１４が、状態履歴が記憶されていないと判断した場合（Ｓ３２２）、文字取得部１０９（文字列復元部の一例）が圧縮辞書から前方参照番号を取得する（Ｓ４１）。
圧縮ブロック取得部１０８は、前方参照番号を条件判断部１１４に渡して、展開ルーチンを再帰的に実行する（Ｓ４２）。
【０２８１】
次に、文字取得部１０９が圧縮辞書から接尾文字を取得する（Ｓ４３）。
【０２８２】
文字取得部１０９は接尾文字をＤＦＡに入力し、状態遷移機械１１０が遷移先状態を算出して、状態記憶部１１１が記憶したＤＦＡの現在の状態を、遷移先状態に更新する（Ｓ４４）。
【０２８３】
検索成功判別部１１７は、現在の状態が受理状態か判別し、受理状態ならヒット位置を算出して出力する（Ｓ４５）。
【０２８４】
最後に、状態遷移記憶部１１２は、「参照番号」行、「最初の状態」列に、状態履歴として、現在の状態及び受理位置を記憶し（Ｓ４８）、展開ルーチンは終了する。
【０２８５】
展開ルーチンが終了したら、圧縮ブロック取得部１０８は、次の圧縮ブロックを圧縮テキスト記憶部１０３から取得する（Ｓ３３）。
これは偶数番目の圧縮ブロックなので、文字を表すビット列の符号９７２である。
【０２８６】
文字取得部１０９は、この圧縮ブロックに対応する文字（接尾文字）を、ＤＦＡに入力し、状態遷移機械１１０が遷移先状態を算出して、状態記憶部１１１が記憶したＤＦＡの現在の状態を、遷移先状態に更新する（Ｓ３４）。
【０２８７】
検索成功判別部１１７は、現在の状態が受理状態か判別し、受理状態ならヒット位置を算出して出力する（Ｓ３５）。
【０２８８】
現在位置カウンタ１１５が記憶した現在位置に、２つの圧縮ブロックに対応する部分文字列の長さを加えて、現在位置を更新する（Ｓ３６）。
【０２８９】
圧縮辞書記憶部１１３は、参照番号と接尾文字を圧縮辞書に登録する（Ｓ３７）。
【０２９０】
状態遷移記憶部１１２は、新たに圧縮辞書に登録した部分文字列に対応する参照番号を取得し、状態履歴の「参照番号」行、「最初の状態」列に、状態履歴として、現在の状態及び受理位置を記憶する（Ｓ３８）。
【０２９１】
以上の処理を圧縮ブロックがなくなるまで繰り返す（Ｓ１８）。
【０２９２】
以上説明した動作を、図６及び図１７に示した具体例を使って説明する。
【０２９３】
初期化処理（Ｓ１０）により、各記憶部が記憶内容を初期化する。
状態遷移表記憶部１０６は、図６に示す状態遷移表２００を記憶する。状態遷移表２００は、検索条件入力部１０２が入力した検索条件（正規表現を含む）に基づいて、状態遷移表生成部１０５が生成したものである。状態遷移表２００に対応するＤＦＡにおいて、初期状態は状態番号１に対応する状態であり、受理状態は状態番号４に対応する状態である。これも、状態遷移表記憶部１０６が記憶している。なお、ＤＦＡの初期状態は必ず１つであるが、受理状態は複数あってもよい。
状態記憶部１１１は初期状態（状態番号＝１）を記憶する。
状態遷移記憶部１１２は、記憶する状態履歴を空にする。
圧縮辞書記憶部１１３は、記憶する圧縮辞書を空にする。
現在位置カウンタ１１５は、現在位置として０を記憶する。
【０２９４】
メインループにおいて、圧縮ブロック取得部１０８が、圧縮テキスト記憶部１０３が記憶した圧縮ブロック列３００から、最初の圧縮ブロックを取得する（Ｓ３１）。最初の圧縮ブロックは参照番号を意味し、参照番号は「０」である。
状態遷移記憶部は、状態記憶部１１１が記憶しているＤＦＡの現在の状態（＝１）を、最初の状態として記憶しておく。
【０２９５】
次に、圧縮ブロック取得部１０８は、条件判断部１１４に参照番号「０」を渡し、展開ルーチンを呼び出す（Ｓ３２）。再帰的な呼出しと区別するため、メインループからの呼出しはネストレベル１と呼ぶことにする。
【０２９６】
展開ルーチンにおいて、条件判断部１１４は参照番号が０か否かを判断する（Ｓ３２１）。この場合、参照番号は０なので、展開ルーチン（ネストレベル１）は終了する。
【０２９７】
メインループに戻り、圧縮ブロック取得部１０８は、次の圧縮ブロックを取得する（Ｓ３３）。偶数番目の圧縮ブロックなので、文字を意味する圧縮ブロックであり、その文字（接尾文字）は「ａ」である。
【０２９８】
文字取得部１０９は、文字「ａ」をＤＦＡに入力し、状態遷移機械１１０は、状態遷移表記憶部１０６が記憶した状態遷移表２００を参照して遷移先状態（＝２）を算出し、状態記憶部１１１が記憶したＤＦＡの現在の状態を、「２」に更新する（Ｓ３４）。
【０２９９】
検索成功判別部１１７は、現在の状態（＝２）が受理状態（＝４）でないと判断し、何もしない（Ｓ３５）。
【０３００】
現在位置カウンタ１１５は、現在位置に１加え、現在位置は「１」となる。
【０３０１】
圧縮辞書記憶部１１３は、参照番号「０」と接尾文字「ａ」を圧縮辞書に登録する。圧縮辞書記憶部１１３の圧縮辞書は空だったので、登録した部分文字列に対応する参照番号（登録番号）は「１」である。
【０３０２】
状態遷移記憶部１１２は、参照番号「１」と最初の状態「１」に対応する欄に、現在の状態「２」（遷移先状態）と受理位置（ないので「０」）を記憶する（Ｓ３８）。
【０３０３】
次の圧縮ブロック（参照番号「１」）を取得する（Ｓ１８、Ｓ３１）。最初の状態は「２」である。
参照番号「１」を渡して、展開ルーチン（ネストレベル１）を呼び出す（Ｓ３２）。参照番号が０以外なので（Ｓ３２１）、状態履歴をチェックする（Ｓ３２２）。
状態履歴の、参照番号「１」最初の状態「２」の欄は空欄なので（Ｓ３２２）、圧縮辞書の参照番号「１」の欄を参照し、前方参照番号「０」を得る（Ｓ４１）。
前方参照番号「０」を渡して、展開ルーチンを再帰的に呼び出す（Ｓ４２）。ネストレベル１からの呼出しなので、ネストレベル２と呼ぶことにする。
ネストレベル２の展開ルーチンにおいて、参照番号が０なので（Ｓ３２１）、何もせずに帰ってくる。
ネストレベル１に戻り、圧縮辞書の参照番号「１」の欄を参照し、接尾文字「ａ」を得る（Ｓ４３）。
接尾文字「ａ」をＤＦＡに入力し、ＤＦＡの状態は「２」になる（Ｓ４４）。受理状態ではないので、出力はしない（Ｓ４５）。
状態履歴の参照番号「１」最初の状態「２」の欄に、遷移先状態「２」受理位置「０」を記憶して（Ｓ４８）、ネストレベル１の展開ルーチンは終了する。
【０３０４】
メインループに戻り、次の圧縮ブロック（接尾文字「ｂ」）を取得する（Ｓ３３）。
接尾文字「ｂ」をＤＦＡに入力し、ＤＦＡの状態は「３」になる（Ｓ３４）。受理状態ではないので、何も出力せず（Ｓ３５）、現在位置が「３」になる（Ｓ３６）。
圧縮辞書には、参照番号「１」と接尾文字「ｂ」が登録される。登録番号は「２」である。
状態履歴には、参照番号「２」最初の状態「２」の欄に、遷移先状態「３」受理位置「０」を記憶する。
【０３０５】
次の圧縮ブロック（参照番号「２」）を取得する（Ｓ１８、Ｓ３１）。最初の状態は「３」である。
参照番号「２」を渡して、展開ルーチン（ネストレベル１）を呼び出す（Ｓ３２）。参照番号が０以外なので（Ｓ３２１）、状態履歴をチェックする（Ｓ３２２）。
状態履歴の、参照番号「２」最初の状態「３」の欄は空欄なので（Ｓ３２２）、圧縮辞書の参照番号「２」の欄を参照し、前方参照番号「１」を得る（Ｓ４１）。
前方参照番号「１」を渡して、展開ルーチン（ネストレベル２）を再帰的に呼び出す（Ｓ４２）。
【０３０６】
ネストレベル２の展開ルーチンにおいて、参照番号が０以外なので（Ｓ３２１）、状態履歴をチェックする（Ｓ３２２）。
状態履歴の、参照番号「１」最初の状態「３」の欄は空欄なので（Ｓ３２２）、圧縮辞書の参照番号「１」の欄を参照し、前方参照番号「０」を得る（Ｓ４１）。
前方参照番号「０」を渡して、展開ルーチン（ネストレベル３）を再帰的に呼び出す（Ｓ４２）。
ネストレベル３の展開ルーチンにおいて、参照番号が０なので（Ｓ３２１）、何もせずに帰ってくる。
【０３０７】
ネストレベル２に戻り、圧縮辞書の参照番号「１」の欄を参照し、接尾文字「ａ」を得る（Ｓ４３）。
接尾文字「ａ」をＤＦＡに入力し、ＤＦＡの状態は「２」になる（Ｓ４４）。受理状態ではないので、出力はしない（Ｓ４５）。
状態履歴の参照番号「１」最初の状態「３」の欄に、遷移先状態「２」受理位置「０」を記憶して（Ｓ４８）、ネストレベル２の展開ルーチンは終了する。
【０３０８】
ネストレベル１に戻り、圧縮辞書の参照番号「２」の欄を参照し、接尾文字「ｂ」を得る（Ｓ４３）。
接尾文字「ｂ」をＤＦＡに入力し、ＤＦＡの状態は「３」になる（Ｓ４４）。受理状態ではないので、出力はしない（Ｓ４５）。
状態履歴の参照番号「２」最初の状態「３」の欄に、遷移先状態「３」受理位置「０」を記憶して（Ｓ４８）、ネストレベル１の展開ルーチンは終了する。
【０３０９】
メインループに戻り、次の圧縮ブロック（接尾文字「ｃ」）を取得する（Ｓ３３）。
接尾文字「ｃ」をＤＦＡに入力し、ＤＦＡの状態は「４」になる（Ｓ３４）。受理状態なので、ヒット位置「６」を出力し（Ｓ３５）、現在位置が「６」になる（Ｓ３６）。
圧縮辞書には、参照番号「２」と接尾文字「ｃ」が登録される。登録番号は「３」である。
状態履歴には、参照番号「３」最初の状態「３」の欄に、遷移先状態「４」受理位置「３」を記憶する。
【０３１０】
以下、同様に繰り返し、次から６つの圧縮ブロック（参照番号「０」接尾文字「ｄ」参照番号「０」接尾文字「ｅ」参照番号「０」接尾文字「ｃ」）についての処理が終わったところで、圧縮辞書及び状態履歴は、図１７に示す内容となっている。また、現在位置カウンタ１１５が記憶する現在位置は「９」、状態記憶部１１１が記憶するＤＦＡの現在の状態は「３」になっている。
【０３１１】
次の圧縮ブロック（参照番号「３」）を取得する（Ｓ３１）。最初の状態は「３」である。
参照番号「３」を渡して、展開ルーチン（ネストレベル１）を呼び出す（Ｓ３２）。参照番号が０以外なので（Ｓ３２１）、状態履歴をチェックする（Ｓ３２２）。
状態履歴の、参照番号「３」最初の状態「３」の欄には状態履歴が記憶されているので（Ｓ３２２）、状態履歴から遷移先状態「４」を取得する（Ｓ３２３）。
状態記憶部１１１が記憶したＤＦＡの現在の状態を「４」に更新する（Ｓ３２４）。
状態履歴から受理位置「３」を取得し（Ｓ３２５）、ヒット位置「１２」を出力して（Ｓ３２６）、ネストレベル１の展開ルーチンは終了する。
【０３１２】
メインループに戻り、次の圧縮ブロック（接尾文字「ｄ」）を取得する（Ｓ３３）。
接尾文字「ｄ」をＤＦＡに入力し、ＤＦＡの状態は「５」になる（Ｓ３４）。受理状態ではないので、何も出力せず（Ｓ３５）、現在位置が「１３」になる（Ｓ３６）。
圧縮辞書には、参照番号「３」と接尾文字「ｄ」が登録される。登録番号は「７」である。
状態履歴には、参照番号「７」最初の状態「３」の欄に、遷移先状態「５」受理位置「３」を記憶する。
【０３１３】
以下、圧縮ブロックが尽きるまで繰り返す（Ｓ１８）。
【０３１４】
このように、ＬＺ７８方式で圧縮されたテキストを検索する場合において、圧縮テキストを読み込みながら圧縮辞書を構築していきつつ、そのときのＤＦＡの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
【０３１５】
更に、ＬＺ７８方式においては、新しく辞書に登録する部分文字列は、それまでに登録した部分文字列に１文字加えたものである。したがって、一つの参照番号について検索を実行すると、それに含まれる前方文字列についても同時に検索をしていることになる。したがって、再帰的な呼出しによって、これらを状態履歴に記憶すれば、状態履歴が記憶されている場合が多くなり、同じ状態遷移を繰り返す必要がない。これにより、検索が高速に行えるという効果を奏する。
【０３１６】
なお、この実施の形態では、再帰的な呼出しを利用することに上述した効果を得ているが、ＬＺ７８方式の圧縮テキストを検索する場合に、再帰的な呼出しが必ず必要となるわけではなく、実施の形態１等で説明した方式でもよい。
圧縮辞書記憶部１１３が記憶する圧縮辞書の構造も、実施の形態１等で説明したように、参照番号と部分文字列とを記憶するものであってもよい。
状態遷移記憶部１１２が記憶する状態履歴の構造も、実施の形態１等で説明したような構造であってもよい。
【０３１７】
実施の形態７．
実施の形態７を図３、図６、図８、図１９、図２０を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０３１８】
この実施の形態では、ＬＺ７８方式で圧縮されたテキストを検索する別の場合について説明する。
【０３１９】
図１９は、ＬＺ７８形式による圧縮テキストの構造を示す図である。ＬＺ７８形式では、図４のような固定の圧縮辞書３０３を持たない。ＬＺ７８形式の圧縮テキストは圧縮ブロック列３００のみから構成される。各圧縮ブロック１２０２は、文字列が最も長く一致する圧縮辞書１２０３の参照番号と、次の不一致文字の情報を持つ。圧縮辞書１２０３は、文字列１２０５と、文字列を参照するための参照番号１２０４から構成され、圧縮テキスト伸張の過程で随時エントリが追加されていく。図１９の例に示したような圧縮ブロック列を伸張する場合、圧縮ブロック１２０６は、圧縮辞書１２０３の参照番号＝９、最初の不一致文字＝「ａ」なので、圧縮辞書１２０３の９番目のエントリの文字列に最初の不一致文字を加えた文字列「ａｂｃｄｅａ」と置き換えられる。さらに、この文字列「ａｂｃｄｅａ」が圧縮辞書１２０３の末尾に新たなエントリとして追加される。以後、圧縮ブロックの参照している圧縮辞書の文字列を、参照文字列と呼ぶこととする。
【０３２０】
これまでに、ＬＺ７８形式の圧縮辞書の参照を高速化するために、木構造やハッシュなどを用いた様々な方法が提案されているが、この実施の形態の圧縮テキスト検索装置では、その実現方式は問わない。
【０３２１】
この実施の形態による状態遷移記憶部は、図６に示したものと同様である。
【０３２２】
図２０は、この実施の形態の圧縮テキスト検索装置における検索処理の流れ図である。初期状態として、すでに検索条件入力部１０２が入力した検索条件から状態遷移表生成部１０５によって生成された状態遷移表を、状態遷移表記憶部１０６が記憶しているものとする。また、状態記憶部１１１には初期状態がセットされているものとする。圧縮辞書記憶部１１３と、状態遷移記憶部１１２の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを０に初期化する。
【０３２３】
まず、ステップＳ１１０１で圧縮ブロック取得部１０８によって、圧縮ブロック列の先頭から順に圧縮ブロックを１個取得する。ステップＳ１１０２で、状態記憶部１１１の現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。一致する場合は（ＹＥＳ）、ステップＳ１１０３で状態遷移履歴の末尾の状態と、圧縮ブロックの不一致文字から次の状態を取得し、状態記憶部１１１にセットする。次にステップＳ１１０４で、状態遷移履歴に受理位置があるか判定する。受理位置があった場合は（ＹＥＳ）、ステップＳ１１０５でヒット位置を計算して出力し、ステップＳ１１０６に進む。ここで、ヒット位置＝元テキスト長＋受理位置となる。現在の状態が受理状態である場合もヒット位置として、元テキスト長＋参照文字列長を出力する。ステップＳ１１０４で受理位置が無かった場合は（ＮＯ）、そのままステップＳ１１０６へ進む。ステップＳ１１０６では、圧縮辞書と状態遷移履歴を更新する。
【０３２４】
圧縮辞書に対しては、参照文字列に不一致文字を追加したものを、圧縮辞書の新たなエントリとして追加する。状態遷移履歴に対しては、圧縮辞書が参照する状態遷移履歴に現在の状態を加えたものを、新たなエントリとして追加する。
【０３２５】
ステップＳ１１０７では、圧縮ブロック列の終端に達しているか判定し、達していない場合は（ＮＯ）、ステップＳ１１０１で次の圧縮ブロックを取得する。ステップＳ１１０７で圧縮ブロック列の終端に達していた場合は（ＹＥＳ）、検索処理を終了する。図２０には明記していないが、ここで元テキスト長に、参照文字列長を加える。
【０３２６】
ステップＳ１１０２で、状態記憶部１１１が記憶した現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致しなかった場合は（ＮＯ）、ステップＳ１１０８に進み、参照文字列に不一致文字を加えた文字列に対して、状態遷移履歴を求める。ステップＳ１１０８で状態遷移履歴を求め終えたら、ステップＳ１１０７へ進む。圧縮ブロックの参照番号が０である場合、すなわち圧縮辞書に参照文字列が無い場合でも、ステップＳ１１０２からステップＳ１１０８へと進む。
【０３２７】
図８は、ステップＳ１１０８の処理の流れの一例を示す図である。図８については、実施の形態１において説明したので、ここでは説明を省略する。
【０３２８】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、高々２回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺ７８形式で圧縮された圧縮テキストを高速に検索することができる。
【０３２９】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺ７８形式の圧縮辞書を記憶する。
ＬＺ７８形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで１回の状態遷移で状態を遷移させさせる。さらに、不一致文字により状態を遷移させる。
参照文字列と不一致文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
【０３３０】
実施の形態８．
実施の形態８を図２１〜図２３を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０３３１】
この実施の形態では、ＬＺＷ方式で圧縮されたテキストを検索する場合について説明する。
【０３３２】
図２１は、この実施の形態において、圧縮テキスト記憶部１０３及び圧縮辞書記憶部１１３（辞書記憶部の一例）が記憶する記憶内容の一例を示す図である。
【０３３３】
圧縮テキスト記憶部１０３は、圧縮ブロック列３００を記憶している。圧縮ブロック列３００は、元の文字列５００「ａａｂａｂｃｄｅｃａｂｃｄｅｂａｂｃｄｅｃｃ」に、図５０の規則を適用して置換したものである。
【０３３４】
圧縮辞書記憶部１１３（辞書記憶部の一例）は、圧縮辞書（置換辞書の一例）を記憶する。圧縮辞書には、出現する可能性のある文字から構成される１文字の部分文字列すべてが最初に登録される。この例では、「ａ」「ｂ」「ｃ」「ｄ」「ｅ」の５種類の文字しか出現しないものとして説明する。したがって、圧縮辞書は、最初、参照番号１〜５に「ａ」「ｂ」「ｃ」「ｄ」「ｅ」の５つの部分文字列が登録される。
参照番号６以降は、検索が進むにつれて、登録されるものである。
【０３３５】
圧縮辞書記憶部１１３は圧縮辞書として、実施の形態６で説明した「参照番号」「前方参照番号」「接尾文字」に加え、「接頭文字」を記憶する。接頭文字は、その部分文字列の最初の１文字を示している。辞書更新時に、すぐに接尾文字を求められるように記憶しているものであり、なくてもよい。
【０３３６】
図２２は、この実施の形態において、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図である。
【０３３７】
状態遷移記憶部１１２は、状態履歴を記憶する。検索の始めにおいて、状態履歴は空であり、検索が進むにつれて状態履歴が登録されていく。
状態遷移記憶部１１２は状態履歴として、実施の形態６で説明したのと同様、「参照番号」「最初の状態」により参照可能な形で、「状態遷移履歴」と「受理位置」を記憶する。
状態遷移履歴は、最初の状態と最後の状態（遷移先状態）だけでなく、途中の状態もすべて記憶したものである。しかし、実施の形態６で説明したように、遷移先状態を記憶することとしてもよい。
その場合であっても、最初の状態の次の状態（２番目の状態）は記憶しておくほうが好ましい。状態履歴を更新する際に２番目の状態が必要になるので、ＤＦＡに入力せずともこれを取得できるからである。
【０３３８】
また、ここでは、状態遷移履歴と受理位置をリスト形式で記憶しているので、現在の状態と一致する最初の状態から始まる状態履歴が記憶されているかを条件判断部１１４が判断する際、リスト内を検索する必要がある。このような構成とすると、実施の形態６で説明したような表形式で記憶する場合に比べて処理に時間がかかるが、ＤＦＡの状態の数が多い場合には、状態遷移記憶部１１２が状態履歴を記憶するのに必要とする記憶領域を節約できる。したがって、ＣＰＵの処理能力、ハードディスクの記憶容量等を勘案して、どちらの形式で記憶するかを決定すればよい。
【０３３９】
図２３は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
【０３４０】
ＬＺＷ方式は、ＬＺ７８方式と符号化の規則が異なる。そこで、制御の流れも、それに対応する部分が異なっている。以下、異なる部分のみ説明する。
【０３４１】
初期化処理（Ｓ１０）において、圧縮辞書記憶部１１３は、出現する可能性のある文字から構成される１文字の部分文字列すべてを登録する。参照番号は、例えば、文字コードと同じ番号を用いてもよい。
【０３４２】
Ｓ１８において、圧縮ブロックが残っていなければ、検索処理を終了する。
【０３４３】
Ｓ５１において、次の圧縮ブロック（参照番号を示す符号９７１）を取得する。これは、圧縮辞書記憶部１１３が記憶した圧縮辞書を更新するために、次の１文字を知る必要があるからである。
Ｓ５２において、圧縮辞書記憶部１１３が記憶した圧縮辞書を参照して、次の圧縮ブロックの先頭の文字（接頭文字）を取得する。圧縮辞書に接頭文字を記憶しているので、次の圧縮ブロックを伸長しなくても、辞書を更新できる。
【０３４４】
Ｓ３８において、新しく辞書に登録した参照番号について、状態履歴を記憶する。この際、ＤＦＡにもう１文字入力したあとの状態を、遷移先状態として記憶する必要がある。
そこで、状態遷移記憶部１１２は、次の参照番号について記憶した状態遷移履歴から、２番目の状態を取得する。
あるいは、状態遷移表記憶部１０６が記憶した状態遷移表を参照して、２番目の状態を取得してもよい。
あるいは、ＤＦＡにもう１文字入力したあとで、状態履歴を記憶するよう構成してもよい。
【０３４５】
展開ルーチンの処理については、実施の形態６において図１８を用いて説明したものと同一なので、ここでは説明を省略する。
【０３４６】
このように、ＬＺＷ方式で圧縮されたテキストを検索する場合において、圧縮テキストを読み込みながら圧縮辞書を構築していきつつ、そのときのＤＦＡの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
【０３４７】
更に、ＬＺＷ方式においては、新しく辞書に登録する部分文字列は、それまでに登録した部分文字列に１文字加えたものである。したがって、一つの参照番号について検索を実行すると、それに含まれる前方文字列についても同時に検索をしていることになる。したがって、再帰的な呼出しによって、これらを状態履歴に記憶すれば、状態履歴が記憶されている場合が多くなり、同じ状態遷移を繰り返す必要がない。これにより、検索が高速に行えるという効果を奏する。
【０３４８】
埋込辞書参照型の圧縮方式には、この他にも様々なものがある。例えば、上述したＬＺ７８方式あるいはＬＺＷ方式の符号列を、さらにハフマン符号化（静的あるいは動的）によって置換し、更に全体のビット長を短くしたもの等がある。
ここで説明した実施の形態は、それらの圧縮方式によって圧縮されたテキストにも適用できる。
【０３４９】
実施の形態９．
実施の形態９を図２０、図２４を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０３５０】
この実施の形態では、ＬＺＷ方式で圧縮されたテキストを検索する別の場合について説明する。
【０３５１】
図２４は、ＬＺＷ形式による圧縮テキストの構造を示す図である。ＬＺＷ形式は、ＬＺ７８形式から派生した形式であり、ＬＺ７８形式同様に圧縮テキストは圧縮ブロック列３００のみから構成される。ＬＺＷ形式では、圧縮辞書に１バイト文字のエントリを予め（暗に）持つことを特徴としている。各圧縮ブロック１３０２は、文字列が最も長く一致する圧縮辞書の参照番号の情報のみを持つ。圧縮辞書の構造は、その１バイト文字のエントリを持つこと以外は、実施の形態７において図１９を用いて説明したものと同様である。
【０３５２】
これまでに、ＬＺＷ形式の圧縮辞書の参照を高速化するために、木構造やハッシュなどを用いた様々な方法が提案されているが、この実施の形態の圧縮テキスト検索装置では、その実現方式は問わない。
【０３５３】
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態７の図２０に示したものとほぼ同様であるので、図２０を援用して検索処理の流れを説明する。  初期状態として、すでに検索条件入力部１０２が入力した検索条件から状態遷移表生成部１０５が状態遷移表を生成し、状態遷移表記憶部１０６が記憶しているものとする。また、状態記憶部１１１には初期状態がセットされているものとする。圧縮辞書記憶部１１３と、状態遷移記憶部１１２の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを０に初期化する。
【０３５４】
なお、圧縮辞書記憶部１１３は、エントリ番号０〜２５５に対する参照を受けたとき、そのエントリ番号と同じ文字コードを持つ１バイト文字を返すものとする。これにより、１バイト文字をあらかじめ圧縮辞書に登録しておく必要がない。
【０３５５】
実施の形態７の図２０との差異は、ステップＳ１１０２とステップＳ１１０６である。まず、ステップＳ１１０１で圧縮ブロック取得部１０８によって、圧縮ブロック列の先頭から順に圧縮ブロックを１個取得する。ステップＳ１１０２で、状態記憶部１１１の現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。一致する場合は（ＹＥＳ）、ステップＳ１１０３で状態遷移履歴の末尾の状態を、状態記憶部１１１にセットする。次にステップＳ１１０４で、状態遷移履歴に受理位置があるか判定する。受理位置があった場合は（ＹＥＳ）、ステップＳ１１０５でヒット位置を計算して出力し、ステップＳ１１０６に進む。ここで、ヒット位置＝現在の元テキスト長＋受理位置をとする。ステップＳ１１０４で受理位置が無かった場合は（ＮＯ）、そのままステップＳ１１０６へ進む。
【０３５６】
ステップＳ１１０６では、圧縮ブロックの参照文字列に次の圧縮ブロックの参照文字列の先頭の文字を追加したものを、圧縮辞書に新たなエントリとして追加する。状態遷移履歴には、圧縮ブロックの参照する状態遷移履歴に、現在の状態を、新たなエントリとして追加する。さらに圧縮ブロックの参照文字列の先頭の文字から得られる次の状態を、そのエントリに追加する。次の圧縮ブロックが無い場合は、ステップＳ１１０６では何もしない。
【０３５７】
ステップＳ１１０７では、圧縮ブロック列の終端に達しているか判定し、達していない場合は（ＮＯ）、ステップＳ１１０１で次の圧縮ブロックを取得する。ステップＳ１１０７で圧縮ブロック列の終端に達していた場合は（ＹＥＳ）、検索処理を終了する。図２０には明記していないが、ここで圧縮前のテキスト長に、圧縮辞書の文字列長を加える。このようにすることで、現在圧縮前のテキストの何文字目まで検索したことになるかを知ることができる。
【０３５８】
ステップＳ１１０２で、状態記憶部１１１の現在の状態と、圧縮ブロックの参照する状態遷移履歴の先頭の状態が一致しなかった場合は（ＮＯ）、ステップＳ１１０８に進み、圧縮ブロックの参照文字列に対して、状態遷移履歴を求める。ステップＳ１１０８で状態遷移履歴を求め終えたら、ステップＳ１１０７へ進む。
【０３５９】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、２回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺＷ形式で圧縮された圧縮テキストを高速に検索することができる。
【０３６０】
この実施の形態と同様にして、ＬＺ７８形式から派生した圧縮形式によって圧縮された圧縮テキストをこの実施の形態の圧縮テキスト検索装置によって高速に検索することができる。
【０３６１】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺＷ形式の圧縮辞書を記憶する。
ＬＺＷ形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで１回の状態遷移で状態を遷移させる。次の圧縮ブロックの参照文字列の先頭の文字によって状態を遷移させる。
参照文字列と次の圧縮ブロックの参照文字列の先頭の文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
【０３６２】
実施の形態１０．
実施の形態１０を図７、図２５〜図２７を用いて説明する。
【０３６３】
いままでの実施の形態においては、検索装置においてＤＦＡに入力する文字のビット長と、圧縮技術において置換する部分文字列を構成する文字のビット長が一致するものと仮定していた。
【０３６４】
しかし、使用するコードによっては、文字を表現するビット列のビット長が異なる場合がある。
例えば、ＡＳＣＩＩコードを用いる場合、文字を表現するビット列のビット長は８ビット（１バイト）である。
これに対し、シフトＪＩＳコードを用いる場合、文字を表現するビット列のビット長は１６ビット（２バイト）である。
更にいえば、シフトＪＩＳコードはＡＳＣＩＩコードと混在させることができるので、同じ文字列の中に８ビットのビット列によって表される文字と１６ビットのビット列によって表される文字とが混在する場合もある。
【０３６５】
しかし、圧縮技術においては、それぞれの文字を表すビット列の長さが何ビットであるかは重要な問題ではない。
結果として得られる符号列全体のビット長が、元の文字列全体のビット長より短くなっていればよいのであって、その文字列が何を意味しているかを理解する必要はないからである。
そこで、圧縮技術においては通常、すべての文字列は８ビットのビット長を持つ文字から構成されているものとして扱っている。
【０３６６】
これに対して、検索装置においては、文字を表現したビット列のビット長よりも、文字数のほうが重要である。
例えば、ある文字列を画面に表示する場合、使用者はその文字列を構成する文字が、コンピュータ内部で何ビットのビット列によって表現されているかを意識する必要はない。
したがって、検索装置は通常、検索条件に合致する検索文字列が「何文字目にあった」と画面に表示する。
また、正規表現で指定する検索条件においては、「任意の１文字」といった指定の仕方が可能である。この場合、その１文字が、コンピュータ内部において何ビットのビット列で表現されているかは無関係である。
したがって、検索装置においてＤＦＡに入力する文字は、必ずしも８ビットのビット長を持つビット列であるとは限らない。
【０３６７】
図２５は、圧縮技術において取り扱う文字を表現したビット列のビット長と、検索装置において取り扱う文字を表現したビット列のビット長とが異なっている場合について説明するための説明図である。
【０３６８】
元の文字列５００は、シフトＪＩＳコードを用いる場合、コンピュータの内部では、内部表現５５０のビット列で表現されている。なお、図２５ではわかりやすいよう、内部表現のビット列を８ビットごとに区切って１６進数で表している。
【０３６９】
符号列６００は、これを圧縮技術によって圧縮したものである。上述したように、圧縮技術においては、文字を表現するビット列のビット長にかかわらず、８ビットを１文字として置換を行う。したがって、符号に置換された部分文字列が、元の文字列の文字の区切りとは違うところで区切られる場合がある。
【０３７０】
これを検索装置が検索する場合、例えば、最初の符号を復元してＤＦＡに入力しようとすると、「あ」「い」までは入力できるが、最後の８ビットが余ってしまい、ＤＦＡに入力することができない。
【０３７１】
そこで、この実施の形態は、未完文字復元部１２１とバイトデータ記憶部１２２（未完文字記憶部の一例）を設けることにより、この課題を解決するものである。
【０３７２】
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０３７３】
図２６は、この実施の形態における圧縮テキスト検索装置１００のブロック構成の一例を示すブロック図である。
未完文字復元部１２１は、圧縮ブロック（符号の一例）から復元した部分文字列に、ＤＦＡに入力できない文字（未完文字）が含まれているかを判断し、未完文字がある場合には、バイトデータ記憶部１２２に記憶させる。
他の部分は、実施の形態１において図３を用いて説明したものと同一なので、ここでは説明を省略する。
【０３７４】
未完文字は、次の部分文字列の先頭の文字（他の未完文字）と結合することによって、ＤＦＡに入力できる文字となる。
【０３７５】
図２７は、この実施の形態において、圧縮テキスト記憶部１０３、圧縮辞書記憶部１１３（辞書記憶部の一例）、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図である。
【０３７６】
圧縮テキスト記憶部１０３は、圧縮ブロック列３００を記憶している。圧縮ブロック列３００は、元の文字列５００を辞書参照型圧縮方式により置換して圧縮してしたものである。
【０３７７】
状態遷移記憶部１１２は、状態履歴を記憶する。検索開始時には、状態履歴は空である。検索が進むにつれて、埋まっていく。
状態遷移記憶部１１２は状態履歴として、状態遷移履歴、受理位置、未完文字、末尾の未完文字を記憶する。
「状態遷移履歴」は、その部分文字列をＤＦＡに入力する前（前の部分文字列の末尾に未完文字がある場合も含む）の状態（最初の状態）から、その部分文字列をＤＦＡに入力した後（その部分文字列の末尾に未完文字がある場合には、未完文字の手前まで入力した後）の状態（遷移先状態）までの、ＤＦＡの状態遷移の履歴である。なお、途中経過は記憶せず、最初の状態と遷移先状態だけを記憶してもよい。
「未完文字」は、その部分文字列を展開する前に、バイトデータ記憶部１２２が記憶していた未完文字である。これを、部分文字列の先頭にある未完文字と結合することによって、ＤＦＡに入力できる文字となる。
「末尾の未完文字」は、その部分文字列の最後に未完文字がある場合の未完文字を示す。
【０３７８】
圧縮辞書記憶部１１３は、圧縮に用いた辞書と同じ辞書を記憶している。これは、圧縮テキスト記憶部１０３が記憶していたものから取得してもよいし、圧縮ブロック列の中に埋め込まれた情報を抽出したものであってもよい。
圧縮ブロックによって置換される部分文字列には、ここに示すように、末尾にＤＦＡに入力できない文字（未完文字）を有するもの（例えば、参照番号１）、先頭にＤＦＡに入力できない文字（他の未完文字）を有するもの（例えば、参照番号２）、両方に有するもの（例えば、参照番号３）などがある。
【０３７９】
状態遷移表記憶部１０６は、検索条件入力部１０２が入力した検索条件（検索パターン）に基づいて、状態遷移表生成部１０５が生成した状態遷移表を記憶している。
例えば、検索条件入力部１０２が、正規表現「（あい｜えおう）［うお］え＊」を検索条件として入力する（ここで「［うお］」は「（う｜お）」の簡略表記である）。この正規表現は、「あいう」「あいお」「あいうお」「あいおお」「えおうう」「えおうお」「えおううお」「えおうおお」・・・などを意味する。図２７の状態遷移表は、この正規表現に基づいて、状態遷移表生成部１０５が生成するものである。
【０３８０】
図７は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
この実施の形態における制御の流れは、実施の形態１において図７を用いて説明した流れとほぼ同一である。ここでは、相違する点だけを説明する。
【０３８１】
Ｓ１２において、条件判断部１１４は、状態記憶部１１１が記憶した現在のＤＦＡの状態と、状態遷移記憶部１１２が記憶した圧縮ブロックに対応する状態遷移履歴（以後、圧縮ブロックの状態遷移履歴という）の先頭の状態とが一致するかを判定するとともに、バイトデータ記憶部１２２が記憶した未完文字と、状態遷移履歴の未完文字とが一致するかも判定する。条件判断部１１４は、両方が一致した場合のみ一致と判断し、Ｓ６２以降の処理に移る。
【０３８２】
Ｓ１３において、遷移先算出部１１６は、状態遷移履歴から取得した遷移先状態に、状態記憶部１１１が記憶したＤＦＡの状態を更新するとともに、バイトデータ記憶部１２２が記憶した未完文字を、状態遷移履歴から取得した末尾の未完文字に更新する。
【０３８３】
Ｓ１６において、文字取得部１０９が取得した文字が未完文字である場合には、未完文字復元部１２１がそれを判断し、バイトデータ記憶部１２２に未完文字を記憶させる。
【０３８４】
これ以外の部分における処理は、実施の形態１において図７を用いて説明したものと同一なので、ここでは説明を省略する。
【０３８５】
このように、未完文字がある場合にはそれを一時的に記憶しておき、ＤＦＡの状態と未完文字が両方とも一致するかを判断する。一致する場合には、これを展開してＤＦＡに入力しても全く同じ状態遷移をすることになるので、これを展開せず、過去の履歴を参照して、ＤＦＡの状態遷移を１回で済ませる。
これにより、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合でも、検索が高速になるという効果を奏する。
【０３８６】
なお、ここでは、辞書参照型圧縮方式によって圧縮された圧縮テキストを検索する場合について説明したが、実施の形態２〜実施の形態９で説明した構成と組み合わせることにより、他の圧縮方式によって圧縮された圧縮テキストを検索することも可能である。
【０３８７】
実施の形態１１．
実施の形態１１を図７、図２８を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１０で説明したものと同一なので、ここでは説明を省略する。
【０３８８】
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合の別の方式について説明する。
【０３８９】
図２８は、この実施の形態において、圧縮テキスト記憶部１０３、圧縮辞書記憶部１１３（辞書記憶部の一例）、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図である。
【０３９０】
状態遷移記憶部１１２は、状態履歴を記憶する。検索開始時には、状態履歴は空である。検索が進むにつれて、埋まっていく。
状態遷移記憶部１１２は状態履歴として、状態遷移履歴、受理位置、先頭の未完文字、末尾の未完文字を記憶する。
「状態遷移履歴」は、その部分文字列をＤＦＡに入力する前（その部分文字列の先頭に未完文字がある場合には、そこまで入力した後）の状態（最初の状態）から、その部分文字列をＤＦＡに入力した後（その部分文字列の末尾に未完文字がある場合には、未完文字の手前まで入力した後）の状態（遷移先状態）までの、ＤＦＡの状態遷移の履歴である。なお、途中経過は記憶せず、最初の状態と遷移先状態だけを記憶してもよい。
「先頭の未完文字」は、その部分文字列の先頭に未完文字がある場合の未完文字を示す。バイトデータ記憶部１２２が記憶していた未完文字を、これと結合することによって、ＤＦＡに入力できる文字となる。
「末尾の未完文字」は、その部分文字列の最後に未完文字がある場合の未完文字を示す。
【０３９１】
他の部分については、実施の形態１０において図２７を使って説明したものと同一であるので、ここでは説明を省略する。
【０３９２】
図７は、この実施の形態における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図である。
この実施の形態における制御の流れは、実施の形態１において図７を用いて説明した流れとほぼ同一である。ここでは、相違する点だけを説明する。
【０３９３】
Ｓ１１において、圧縮ブロック取得部１０８（符号取得部の一例）が圧縮ブロック（符号）を取得する。バイトデータ記憶部１２２が未完文字を記憶している場合には、未完文字復元部１２１が、部分文字列の先頭にある未完文字（他の未完文字）と結合して、ＤＦＡに入力できる文字を取得し、これをＤＦＡに入力して、状態遷移処理を行う。
これにより、Ｓ１２の処理をする段階では未完文字がなくなるので、Ｓ１２においては、未完文字が一致するかを判別する必要がなく、状態の一致のみを判別すればよい。
【０３９４】
Ｓ１３において、遷移先算出部１１６は、状態遷移履歴から取得した遷移先状態に、状態記憶部１１１が記憶したＤＦＡの状態を更新するとともに、バイトデータ記憶部１２２が記憶した未完文字を、状態遷移履歴から取得した末尾の未完文字に更新する。
【０３９５】
Ｓ１６において、文字取得部１０９が取得した文字が未完文字である場合には、未完文字復元部１２１がそれを判断し、バイトデータ記憶部１２２に未完文字を記憶させる。
【０３９６】
これ以外の部分における処理は、実施の形態１において図７を用いて説明したものと同一なので、ここでは説明を省略する。
【０３９７】
このように、未完文字がある場合にはそれを一時的に記憶しておき、次の圧縮ブロックの先頭にある未完文字と結合してＤＦＡに入力する。未完文字がなくなってから、ＤＦＡの状態が一致するかを判断するので、未完文字の存在を無視することができる。
これにより、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合でも、検索が高速になるという効果を奏する。
【０３９８】
なお、ここでは、辞書参照型圧縮方式によって圧縮された圧縮テキストを検索する場合について説明したが、実施の形態２〜実施の形態９で説明した構成と組み合わせることにより、他の圧縮方式によって圧縮された圧縮テキストを検索することも可能である。
【０３９９】
実施の形態１２．
実施の形態１２を図２９〜図３３を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１０で説明したものと同一なので、ここでは説明を省略する。
【０４００】
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合の更に別の方式について説明する。
【０４０１】
この圧縮テキスト検索装置は、入力されたマルチバイトコード文字を含む圧縮テキスト中に検索条件に適合する文字列が存在するか否かを判定し、存在する場合はその文字列の出現位置を、存在しない場合は何も出力しない検索装置である。
【０４０２】
マルチバイトコード文字を含むテキストでは、テキスト中に１バイトコードの文字と、２バイト以上のコードの文字が混在して存在する。ここでは、文字のコードを「（８２Ａ０）」のように（）で囲んだ１６進数値で表記するものとする。これ以降、主にシフトＪＩＳコードを例に説明する。文字コード（８２Ａ０）は、シフトＪＩＳコードの「あ」である。また、２バイト以上のコードの文字の、１文字に満たない部分コードをバイトデータ（未完文字の一例）と呼ぶこととする。例えば、「あ」のバイトデータは、（８２）や（Ａ０）である。
【０４０３】
図２９は、この実施の形態による圧縮テキストの構造を示す図である。図２９は、それぞれ実施の形態１において図４を用いて説明したものと対応している。
【０４０４】
一般的に辞書式圧縮は、１バイト単位で処理されるため、マルチバイトコード文字を含むテキストを圧縮した場合、２バイト以上からなる文字が圧縮辞書の２つ以上のエントリに分かれて登録されてしまうことがある。
図２９のような圧縮テキスト＜１、２、１、３、４、１、３＞を伸張する場合、圧縮ブロック列３００から１つずつ圧縮ブロック１７０２を取得し、その参照情報を元に圧縮ブロック１７０２を圧縮辞書の文字列１７０５と置き換える。
例えば、最初の圧縮ブロック１７０２は、圧縮辞書の１番目のエントリを参照しているため、最初の圧縮ブロックは、１番目のエントリの文字列「あいうえ（８２）」と置き換えることができる。同様に２番目の圧縮ブロックは、「（Ａ８）うい」と置き換えることができる。ここで、文字コード（８２Ａ８）は、シフトＪＩＳコードで「お」を表わしているため、１番目と２番目の圧縮ブロックからは、文字列「あいうえおうい」が得られる。同様に全ての圧縮ブロックについて繰り返すことで、圧縮ブロック列３００から伸張されたテキスト「あいうえおういあいうえいおうあえあいうえあえ」を得ることができる（（８２Ａ０）＝「あ」、（８２Ａ２）＝「い」）。
【０４０５】
図３０は、この実施の形態において、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図である。状態遷移記憶部１１２は、参照番号１８０１、状態遷移履歴１８０２、受理位置１８０３の情報を持つ。参照番号１８０１は、圧縮辞書の参照番号３０４と１対１に対応している。状態遷移履歴１８０２は、対応する圧縮辞書の文字列による状態遷移機械の状態遷移の履歴を記憶したものであり、先頭が圧縮辞書の文字列を読む直前の状態、末尾が圧縮辞書の文字列を全て読んだ直後の状態をさす。状態は、１バイトのデータではなく１文字に対して１回遷移する。例えば、１番目の状態遷移履歴の場合、状態［１］から開始して、文字列「あいうえ（８２）」を１文字読む毎に状態が［２］−［３］−［４］−［５］と遷移する。最後の「（８２）」は、バイトデータであるため状態を遷移させることができない。
このように、実施の形態１では、状態遷移の履歴の長さは、圧縮ブロックの参照文字列の文字列長＋１であったが、この実施の形態のマルチバイトコード文字を含むテキストを検索する圧縮テキスト検索装置では、参照文字列の文字列長＋１となるとは限らず、参照文字列の文字数＋１となる。受理位置１８０３は、圧縮ブロックの参照文字列の何バイト目で、状態遷移機械が受理状態に到達したかを表わしている。この受理位置は、文字単位でカウントしても良い。このとき、１文字に満たない１バイトデータがある場合でも、それを１文字とカウントしても良いし、しなくても良い。
【０４０６】
図３１は、状態遷移表記憶部１０６が記憶する状態遷移表の一例を示す図である。
図３１の状態遷移表１９０１の左端の列は、現在の状態を表わしている。また、１行目は次に入力された文字を表わしている。検索条件に含まれる正規表現を受理する状態遷移機械の状態遷移表は、照合が開始されるまでに生成される。
【０４０７】
図３２は、この実施の形態の圧縮テキスト検索装置における検索処理の流れ図である。初期状態として、検索条件入力部１０２が入力した検索条件から、状態遷移表生成部１０５が状態遷移表を生成し、状態遷移表記憶部１０６が記憶しているものとする。また、圧縮テキスト記憶部１０３が記憶した圧縮テキストから圧縮辞書についての情報を抽出し、圧縮辞書記憶部１１３が記憶しているものとする。また、状態記憶部１１１には初期状態がセットされているものとする。状態遷移記憶部１１２の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを０に初期化する。
【０４０８】
まず、ステップＳ１５０１で圧縮ブロック取得部１０８によって、圧縮ブロック列の先頭から順に圧縮ブロックを１個取得する。ステップＳ１５０２で、バイトデータ記憶部１２２にバイトデータがあるか判定する。バイトデータがある場合は（ＹＥＳ）、ステップＳ１５０３に進む。
【０４０９】
テキストが全て文字の割り付けられている文字コードからなり、バイトデータ記憶部１２２にバイトデータがある場合、圧縮ブロックの参照文字列の先頭にも、バイトデータがある。そこで、ステップＳ１５０３で、バイトデータ記憶部のバイトデータを上位バイト、参照文字列の最初のバイトデータを下位バイトとする１文字と、状態記憶部１１１の現在の状態を元に、状態遷移機械１１０によって次の状態を取得する。取得した次の状態は、状態記憶部１１１にセットする。同時にバイトデータ記憶部１２２を空にする。
【０４１０】
ステップＳ１５０２で、バイトデータが無い場合は（ＮＯ）、そのままステップＳ１５０４へと進む。
ステップＳ１５０４で、状態記憶部１１１の現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。一致する場合は（ＹＥＳ）、ステップＳ１５０５で状態遷移履歴の末尾の状態を、状態記憶部１１１にセットする。
次にステップＳ１５０６で、状態遷移履歴に受理位置があるか判定する。受理位置があった場合は（ＹＥＳ）、ステップＳ１５０７でヒット位置を計算して出力する。ここで、ヒット位置＝現在の元テキスト長＋受理位置となる。ステップＳ１５０６で受理位置が無かった場合は（ＮＯ）、そのままステップＳ１５０８へ進む。
ステップＳ１５０８では、圧縮ブロックの参照文字列の末尾に、バイトデータがあるか判定する。ステップＳ１５０８でバイトデータがある場合は（ＹＥＳ）、ステップＳ１５０９で、そのバイトデータをバイトデータ記憶部１２２にセットする。ステップＳ１５０８で、バイトデータが無い場合は（ＮＯ）、そのままステップＳ１５１０へと進む。
ステップＳ１５１０では、圧縮ブロック列の終端に達しているか判定し、達していない場合は（ＮＯ）、ステップＳ１５０１で次の圧縮ブロックを取得する。ステップＳ１５１０で圧縮ブロック列の終端に達していた場合は（ＹＥＳ）、検索処理を終了する。
図３２には明記していないが、ここで元テキスト長に、圧縮辞書の文字列長を加える。
【０４１１】
ここでは、ヒット位置をテキストの先頭からのバイト数として出力するようにしたが、文字数として出力しても良い。その場合は、元テキスト長をカウントする代わりに、元テキストの文字数をカウントするようにし、状態遷移履歴の受理位置も文字数で記録するようにすると良い。
【０４１２】
ステップＳ１５０４で、状態記憶部１１１が記憶した現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致しなかった場合は（ＮＯ）、ステップＳ１５１１に進み、圧縮ブロックの参照文字列に対して、状態遷移履歴を求める。
ステップＳ１５０２で、参照文字列の先頭がバイトデータであった場合は、そのバイトデータの次の文字から始まる文字列に対して、状態遷移履歴を求める。
ステップＳ１５１１で状態遷移履歴を求め終えたら、ステップＳ１５１０へ進む。
【０４１３】
図３３は、図３２の検索処理の流れにおけるステップＳ１５１１の処理の流れ図である。ここでは、状態遷移履歴の一時的な記憶領域Ｈを用意し、初期状態として空であるものとする。
まず、ステップＳ１６０１で、現在の状態を記憶領域Ｈの状態遷移履歴の先頭に追加する。ステップＳ１６０２で、文字取得部１０９によって圧縮ブロックの参照文字列の先頭から順に１文字ずつ取得する。
ステップＳ１６０３で、ステップＳ１６０１で取得した文字と、状態記憶部１１１が記憶した現在の状態を入力として、状態遷移機械１１０から次の状態を取得し、状態記憶部１１１にセットする。
ステップＳ１６０４では、ステップＳ１６０３で取得した状態を、記憶領域Ｈの状態遷移履歴に追加する。
ステップＳ１６０５では、状態記憶部１１１の状態が受理状態か判定する。受理状態であった場合は（ＹＥＳ）、ステップＳ１６０６でヒット位置を出力し、ステップＳ１６０７に進む。ここで、ヒット位置は元テキスト長（バイト）＋圧縮ブロックの参照文字列の先頭からのバイト数となる。このとき、同時に記憶領域Ｈの状態遷移履歴の受理位置に、参照文字列の先頭からのバイト数をセットする。ステップＳ１６０５で受理状態では無かった場合は（ＮＯ）、そのままステップＳ１６０７に進む。
ステップＳ１６０７では、文字列の終端に達しているか判定し、達していない場合には（ＮＯ）、ステップＳ１６０８へ進む。
ステップＳ１６０８では、次の文字がバイトデータであるか判定し、バイトデータであった場合は（ＹＥＳ）、そのまま処理を終了する。バイトデータではない場合は（ＮＯ）、ステップＳ１６０２で次の文字を取得する。
ステップＳ１６０７で、文字列の終端まで処理していた場合は（ＹＥＳ）、処理を終了する。
処理を終了する時に、記憶領域Ｈの状態遷移履歴の履歴と受理位置を、圧縮ブロックの参照する状態遷移履歴に反映する。
【０４１４】
上記の図３３の処理の流れでは、処理の終了時点で状態遷移履歴を反映するとしたが、常に更新しなくても良い。
すなわち、最初に取得した状態遷移履歴から更新しないようにしても良いし、状態遷移履歴の先頭の状態がある特定の状態のときのみ、履歴を更新するようにしても良い。
【０４１５】
図３３の処理開始時に、文字列の先頭がバイトデータであった場合は、そのまま処理を終了してよい。
【０４１６】
この実施の形態では、ステップＳ１５０４で、状態記憶部１１１が記憶した現在の状態と、状態遷移記憶部の圧縮ブロックに対応する状態遷移履歴の先頭の状態が一致するか判定するようにしたが、図３３（図３２のステップＳ１５１１）のステップＳ１６０３で次の状態を取得したあと、状態遷移履歴の状態と比較し、一致した場合はステップＳ１５１１の処理を終了し、ステップＳ１５０５に処理が移るように構成しても良い。
【０４１７】
図２６〜図３３を用いて、この実施の形態による圧縮テキスト検索装置の処理の例を示す。初期状態として、検索条件入力部１０２が正規表現を含んだ検索条件を入力し、入力した検索条件に基づいて、状態遷移表生成部１０５がその正規表現を受理するＤＦＡの状態遷移表１９０１を生成し、状態遷移表記憶部１０６が記憶している。受理状態は状態［４］のみとする。また、状態記憶部１１１には、初期状態［１］が記憶されているものとする。状態遷移記憶部１１２の状態遷移履歴は空であるとする。バイトデータ記憶部１２２も空である。今、圧縮テキスト記憶部１０３が記憶している圧縮テキストから、圧縮ブロック列３００と圧縮辞書１７０３を得る。圧縮辞書は圧縮辞書記憶部１１３に記憶される。なお、ここで使用する文字はすべて２バイト文字であるとする。
【０４１８】
まず、ステップＳ１５０１で圧縮ブロック列３００から最初の圧縮ブロックを取得する。
次にステップＳ１５０２で、バイトデータ記憶部１２２にバイトデータがないので、ステップＳ１５０４に進む。
ステップＳ１５０４では、状態記憶部１１１が記憶している現在の状態［１］に対して、圧縮ブロックの参照する状態遷移履歴は空なので、状態は一致しない。よって、ステップＳ１５１１に移行する。
【０４１９】
図３３のステップＳ１６０１では、現在の状態を、状態遷移記憶部の１番目の状態遷移履歴の先頭にセットする。
ステップＳ１６０２では、圧縮ブロックが参照している圧縮辞書の文字列「あいうえ（８２）」の最初の１文字「あ」を取得する。
次にステップＳ１６０３では、現在の状態［１］と文字「あ」を元に、状態遷移機械１１０によって次の状態［２］を取得する。取得した状態［２］を状態記憶部１１１にセットして、次のステップＳ１６０４に進む。
ステップＳ１６０４では、現在の状態を、１番目の状態遷移履歴に追加する。ここで、状態遷移記憶部１１２が記憶する１番目の状態遷移履歴は「１−２」となる。
ステップＳ１６０５では、現在の状態が受理状態であるか判定し、受理状態ではないのでステップＳ１６０７へ進む。
ステップＳ１６０７では、圧縮辞書の文字列の終端に達したか判定し、達していないのでステップＳ１６０８へ進み、次の文字がバイトデータでもないので、ステップＳ１６０２で次の文字「い」を取得する。
【０４２０】
２文字目「い」に対しても同様に処理を行い、ステップＳ１６０８に達した時点で、現在の状態は［３］、状態遷移履歴は「１−２−３」となる。
【０４２１】
次に、ステップ２０１で次の文字「う」を取得する。状態［３］で文字「う」を取得した場合、状態遷移表１９０１より次の状態［４］を得る。よって、ステップＳ１６０４の実行直後では、現在の状態［４］、状態遷移履歴「１−２−３−４」となる。
ステップＳ１６０５で現在の状態が受理状態か判定し、受理状態であるのでステップＳ１６０６に進む。現在２バイト文字を３文字目まで取得したところなので、ヒット位置として２バイト×３＝６出力する。同時に、１番目の状態遷移履歴の受理位置に６を追加する。
【０４２２】
同様に処理を繰り返して、４文字目の「え」のステップＳ１６０８で、文字がバイトデータか判定する。シフトＪＩＳコードの場合、文字の１バイト目でそれが１バイト文字であるか２バイト文字であるかは判別可能である。次の文字（８２）はバイトデータであるため処理を終了する。この時点で、テキストの先頭から９バイトまでの処理が終わり、現在の状態は［５］、１番目の状態遷移履歴は「１−２−３−４−５」となっている。
【０４２３】
次に処理は図１３のステップＳ１５０８へと進む。ステップＳ１５０８では、末尾の文字がバイトデータ（８２）であるので、ステップＳ１５０９で（８２）をバイトデータ記憶部１２２にセットする。そしてステップＳ１５１０へと進み、圧縮ブロック列の終端に達していないため、ステップＳ１５０１で次の圧縮ブロックを取得する。この時点で、元テキスト長は９バイトである。
ステップＳ１５０２で、バイトデータ記憶部１２２にバイトデータ（８２）があるので、ステップＳ１５０３へ進む。
ステップＳ１５０３で、バイトデータ記憶部１２２のバイトデータ（８２）を上位バイト、参照文字列の先頭のバイトデータ（Ａ８）を下位バイトとする文字「お」（＝（８２Ａ８））と、現在の状態［５］から、状態遷移機械１１０によって次の状態［６］を取得し、状態記憶部１１１にセットする。そしてバイトデータ記憶部１２２を空にする。
ステップＳ１５０４以降は同様に処理を行って、ステップＳ１５１０に達した時点でテキストの１４バイト目まで処理が終わり、現在の状態は［１］、１番目の状態遷移履歴は「１−２−３−４−５」、２番目の状態遷移履歴は「６−３−１」である。
【０４２４】
ステップＳ１５０１で３番目の圧縮ブロックを取得する。３番目の圧縮ブロックの参照先は＜１＞である。
ステップＳ１５０２で、バイトデータ記憶部１２２にバイトデータがないため、ステップＳ１５０４へと進む。
ステップＳ１５０４で、現在の状態［１］と、１番目の状態遷移履歴の先頭の状態［１］を比較し、一致しているのでステップＳ１５０５へと進む。
ステップＳ１５０５では、状態遷移履歴の末尾の状態［５］を、状態記憶部１１１が現在の状態として記憶する。
ステップＳ１５０６で、１番目の状態遷移履歴には受理状態があるため、ステップＳ１５０７でヒット位置を計算し出力する。３番目の圧縮ブロックを取得する直前までに処理したテキストは１４バイト、また状態遷移履歴の受理位置は６なので、１４＋６＝２０がヒット位置となる。
ステップＳ１５０８で参照文字列の末尾にバイトデータがないのでステップＳ１５１０へ進む。
ステップＳ１５１０で、圧縮ブロックの終端ではないので、ステップＳ１５０１に進む。
以降同様に処理を行い、圧縮ブロック列の終端まで処理を終えた時点で検索処理を終了する。
【０４２５】
以上のように、この実施の形態によれば、状態記憶部の現在の状態と、取得した圧縮ブロックに対応する状態遷移履歴の先頭の状態が一致しなかった場合には、状態遷移を処理するのに対して、圧縮ブロックが参照している圧縮辞書の文字列長に比例したステップ数を要する。一方で、現在の状態と状態遷移履歴の先頭の状態が一致した場合には、高々２回の状態遷移で処理することができる。現在の状態と文字によって状態遷移先が一意に決定される状態遷移機械では、現在の状態が初期状態である場合が多い。そのため、圧縮率が高いほど、すなわち長さが長い文字列が繰り返し出現しているようなテキストほど、状態遷移に要するステップ数を削減することができる。
正規表現に適合する文字列がテキスト中に存在するかの照合自体は、従来から利用されている、正規表現を受理する状態遷移が一意に決定される状態遷移機械を使用している。
このように、この実施の形態の圧縮テキスト検索装置では、正規表現を含んだ検索条件によって、マルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
【０４２６】
この実施の形態では、例としてシフトＪＩＳのテキストについて説明したが、他のマルチバイトコード文字のテキストでも同様に検索することができる。例えば日本語ＥＵＣ（Ｅｘｔｅｎｄｅｄ  ＵＮＩＸ  Ｃｏｄｅ）（ＵＮＩＸは登録商標）は、シフトＪＩＳ同様に１バイト目で１〜３バイト文字のいずれであるか判定することが可能であり、バイトデータが１バイトか２バイトかを注意すればよい。また、ＪＩＳは、１バイト文字であるか２バイト文字であるかを判定するための、情報を持つ。その情報をバイトデータ記憶部１２２などにバイトデータとともに記憶しておくなどとするとよい。
【０４２７】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
辞書式圧縮方式によって圧縮されたマルチバイトコード文字を含むテキストを、伸張することなく、正規表現によって検索する検索装置である。
検索には、状態遷移が一意に決定できる状態遷移機械を使用する。
検索時には、圧縮ブロックが参照する辞書中の文字列毎に、状態遷移機械の状態遷移の履歴を記憶しておき、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、履歴の末尾の状態まで状態遷移を一気に遷移させる。
１文字に満たないバイトデータを記憶する記憶部を備え、辞書中の文字列の末尾に１文字に満たないバイトデータが含まれる場合には、そのバイトデータを記憶しおき、次の圧縮ブロックの先頭からバイトデータを取得した時点で、状態遷移を処理する。
【０４２８】
実施の形態１３．
実施の形態１３を図３４、図３５を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１０で説明したものと同一なので、ここでは説明を省略する。
【０４２９】
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、ＬＺ７７方式で圧縮されたテキストを検索する場合について説明する。
【０４３０】
図３４は、この実施の形態による、圧縮辞書記憶部１１３と状態遷移記憶部１１２の記憶する情報を図示したものである。圧縮辞書記憶部１１３は、スライド窓２１０３を記憶する。状態遷移記憶部１１２は、スライド窓に対応した状態遷移履歴２１０４と、受理位置２１０５を記憶している。また、状態遷移履歴２１０４は、スライド窓長＋１文字分の状態遷移を記憶している。受理位置２１０５は、状態遷移履歴２１０４の中で、受理状態の位置を記憶している。
この実施の形態では、圧縮辞書記憶部１１３のスライド窓２１０３がバイトデータ記憶部の役割を兼ねる。
【０４３１】
図３５は、この実施の形態の圧縮テキスト検索装置における検索処理の流れ図である。初期状態として、検索条件入力部１０２が入力した検索条件から状態遷移表生成部１０５が状態遷移表を生成し、状態遷移表記憶部１０６が記憶しているものとする。また、状態記憶部１１１には初期状態がセットされているものとする。圧縮辞書記憶部１１３と、状態遷移記憶部１１２の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを０に初期化する。
【０４３２】
最初に、ステップＳ２００１で、圧縮ブロック列の先頭から順に圧縮ブロックを１個ずつ取得する。
ステップＳ２００２で、圧縮ブロックの参照文字列の先頭がバイトデータか判定する。バイトデータの場合で、圧縮辞書記憶部の末尾にバイトデータが存在する場合は、その末尾のバイトデータを上位バイト、参照文字列の先頭のバイトデータを下位バイトとする１文字と、現在の状態を元に状態遷移機械１１０によって次の状態を取得し、現在の状態と状態遷移履歴２１０４の末尾にセットする。圧縮辞書記憶部の末尾にバイトデータが無い場合は、ステップＳ２００８に進んでよい。
ステップＳ２００４で、現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。参照文字列の先頭がバイトデータであった場合は、その次の文字の状態と比較する。先頭の状態が一致した場合は（ＹＥＳ）、ステップ２００５で、スライド窓の（参照文字列の位置＋参照文字列長）の位置の文字の状態を現在の状態にセットする。ステップＳ２００６で、参照文字列の位置から（参照文字列の位置＋参照文字列長）の位置の間に受理状態があるか判定する。受理状態がある場合は（ＹＥＳ）、ステップＳ２００７でヒット位置を計算して出力し、ステップＳ２００８へ進む。受理状態が無い場合は（ＮＯ）、何もせずにステップＳ２００８へ進む。
ステップＳ２００８では、スライド窓と状態遷移履歴を更新する。すなわち、スライド窓中の文字列を、（参照文字列長＋１）バイト分前へシフトし、末尾に参照文字列の位置から参照文字列長分の文字列と、最初の不一致文字を追加する。同様に、状態遷移履歴も同様に、（参照文字列長＋１）バイト分前へシフトし、末尾に参照文字列の先頭の文字から参照文字列分の後ろの文字までの状態遷移履歴を追加する。状態遷移履歴は、さらに、参照文字列の末尾と不一致文字が共にバイトデータで、合わせて１文字となる場合には、状態遷移機械１１０によって、次の状態を取得し、状態記憶部１１１と、状態遷移履歴の末尾にセットする必要がある。
ステップＳ２００９では、圧縮ブロック列の終端に達しているか判定し、達していない場合は（ＮＯ）、ステップＳ２００１で次の圧縮ブロック列を取得する。達していた場合は（ＹＥＳ）、検索処理を終了する。
【０４３３】
ステップＳ２００４で、現在の状態と、状態遷移履歴の圧縮ブロックの参照文字列の先頭の文字の状態が一致しない場合は（ＮＯ）、ステップＳ２０１０で参照文字列に最初の不一致文字を加えた文字列に対して状態遷移の履歴を求める。すなわち、図３３の処理の流れと同様に、参照文字列に最初の不一致文字を加えた文字列の先頭から順に１文字ずつ取得しながら、状態遷移機械によって次の状態を取得する。ステップＳ２０１０の処理が終了したら、ステップＳ２００８でスライド窓と状態遷移履歴を更新する。
【０４３４】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列の文字数分の回数要する状態遷移の処理を、高々３回の状態遷移で処理することができ、処理ステップを削減することができる。
【０４３５】
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺ７７形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
【０４３６】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺ７７形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長＋１の長さの状態遷移履歴を記憶する。
スライド窓の末尾をバイトデータ記憶部として利用する。
ＬＺ７７形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで状態を１回の状態遷移で遷移させ、さらに参照文字列の末尾と不一致文字とで合わせて１文字となる場合にはその文字により状態を遷移させる。
【０４３７】
実施の形態１４．
実施の形態１４を図３５を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１０で説明したものと同一なので、ここでは説明を省略する。
【０４３８】
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、ＬＺＳＳ方式で圧縮されたテキストを検索する場合について説明する。
【０４３９】
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態１３で図３５を用いて説明したものと同様である。まず、圧縮ブロックの先頭のビットが１であった場合、すなわち圧縮辞書に参照文字列がある場合を考える。実施の形態１３との主要な差異は、圧縮ブロックに不一致文字が無いことである。すなわち、ステップＳ２００８やステップＳ２００９、ステップＳ２０１０の処理で不一致文字を考慮しないこと以外は、実施の形態７と同様に検索することができる。
【０４４０】
次に、圧縮ブロックの先頭のビットが０であった場合を考える。ここで、圧縮ブロックの不一致文字は常に１バイトである。このときは、ステップＳ２００２以降の処理として、次の３通りがある。まず、不一致文字が１バイト文字であった場合である。この場合は、現在の状態と、不一致文字から次の状態を取得し、ステップＳ２００５で状態記憶部１１１にセットし、ステップＳ２００８の処理を実行する。不一致文字がバイトデータで、スライド窓の末尾にもバイトデータがある場合は、ステップＳ２００３、ステップＳ２００８の処理を実行する。不一致文字がバイトデータで、スライド窓の末尾にバイトデータが無い場合は、ステップＳ２００８の処理を実行するだけでよい。
【０４４１】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長に比例したステップ数要する状態遷移の処理を、高々２回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺＳＳ形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
【０４４２】
ここで示したＬＺＳＳ形式以外にも、ＬＺＢ形式やＬＺＢＷ形式など、ＬＺ７７形式から派生した圧縮形式で圧縮されたテキストを、この実施の形態の圧縮テキスト検索装置によって同様に検索することができる。
【０４４３】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺＳＳ形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長＋１の長さの状態遷移履歴を記憶する。
スライド窓の末尾をバイトデータ記憶部として利用する。
ＬＺＳＳ形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで１回の状態遷移で状態を遷移させる。
【０４４４】
実施の形態１５．
実施の形態１５を図３２を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１０で説明したものと同一なので、ここでは説明を省略する。
【０４４５】
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、ＬＺ７８方式で圧縮されたテキストを検索する場合について説明する。
【０４４６】
この実施の形態による状態遷移記憶部は、図３０に示したものと同様である。
【０４４７】
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態１２で説明したものとほぼ同様であるので、図３２を援用して検索処理の流れを説明する。実施の形態１２と異なる点のみを記述する。
ＬＺ７８形式で圧縮されたテキストを検索する場合には、ステップＳ１５０８の直前かステップＳ１５１０の直前で、圧縮辞書と状態遷移履歴にエントリを追加する必要がある。まず、圧縮ブロックの参照文字列に不一致文字を加えたものを、圧縮辞書の新たなエントリとして追加する。
不一致文字がバイトデータで、かつ参照文字列の末尾がバイトデータで無い場合や、不一致文字と参照文字列の末尾が共にバイトデータで、かつ合わせても１文字に満たない場合は、圧縮ブロックが参照する状態遷移履歴を、そのまま状態遷移記憶部１１２の新たなエントリとして追加する。
そして、そのバイトデータをバイトデータ記憶部１２２に追加する。不一致文字と参照文字列の末尾が共にバイトデータで合わせて１文字になる場合や、不一致文字が１バイト文字である場合は、その文字と現在の状態から次の状態を取得し、その取得した状態を状態記憶部と、状態遷移履歴の末尾にセットする。さらにその状態が受理状態であれば、ヒット位置を出力し、受理位置にも追加する。
ステップＳ１５０４で、現在の状態と圧縮ブロックの参照する状態遷移履歴の先頭の状態が一致しなかった場合は、状態遷移記憶部の新しいエントリには、ステップＳ１５１１で取得した状態遷移履歴を追加する。
【０４４８】
ステップＳ１５１１では、参照文字列に不一致文字を加えた文字について、状態遷移履歴を求める。
【０４４９】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列の文字数分の回数要する状態遷移の処理を、高々３回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺ７８形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
【０４５０】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺ７８形式の圧縮辞書を記憶する。
ＬＺ７８形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで１回の状態遷移で状態を遷移させさせる。さらに参照文字列の末尾と不一致文字とで合わせて１文字となる場合にはその文字により状態を遷移させる。
参照文字列と不一致文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
【０４５１】
実施の形態１６．
実施の形態１６を図３５を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１０で説明したものと同一なので、ここでは説明を省略する。
【０４５２】
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、ＬＺＷ方式で圧縮されたテキストを検索する場合について説明する。
【０４５３】
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態１５とほぼ同様であるので、図３５を援用して検索処理の流れを説明する。実施の形態１５の検索処理との差異は、圧縮ブロックに不一致文字が含まれないことである。この実施の形態の圧縮テキスト検索装置では、次の圧縮ブロックの先頭の文字を、実施の形態１５の不一致文字の代わりに利用する。
【０４５４】
以上のように、この実施の形態によれば、圧縮ブロック列を１個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、高々３回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、ＬＺＷ形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
【０４５５】
同様にして、ＬＺ７８形式から派生した圧縮形式によって圧縮されたマルチバイトコード文字を含む圧縮テキストを、この実施の形態の圧縮テキスト検索装置によって高速に検索することができる。
【０４５６】
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にＬＺＷ形式の圧縮辞書を記憶する。
ＬＺＷ形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで１回の状態遷移で状態を遷移させさせる。さらに参照文字列の末尾と次の圧縮ブロックの参照文字列の先頭の文字とで合わせて１文字となる場合にはその文字により状態を遷移させる。
参照文字列と次の圧縮ブロックの参照文字列の先頭の文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
【０４５７】
実施の形態１７．
実施の形態１７を図３６を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０４５８】
この実施の形態では、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する状態履歴の内容の別の例について説明する。
【０４５９】
図３６は、この実施の形態による圧縮テキスト検索装置の、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図である。この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部１１２を、１つの圧縮辞書のエントリに対して複数の状態遷移履歴を記憶するように構成したものである。
【０４６０】
この実施の形態の圧縮テキスト検索装置の状態遷移記憶部の１つのエントリは、エントリの参照番号２２０１と、状態遷移履歴２２０２、受理位置２２０３の情報を記憶する。参照番号１は、圧縮辞書の参照番号と１対１に対応する識別子である。
状態遷移履歴は、対応する圧縮辞書の文字列による状態遷移機械の、状態遷移の履歴を記憶したものであり、先頭が圧縮辞書の文字列を読む直前の状態、末尾が圧縮辞書の文字列を全て読んだ直後の状態をさす。
受理位置２２０３は、状態遷移履歴のどこで、状態遷移機械が受理状態に到達したかを表わしている。
この実施の形態の圧縮テキスト検索装置では、１つの状態遷移記憶部のエントリに、０以上の状態遷移履歴２２０２と受理位置２２０３の組を記憶する。状態遷移履歴２２０２と受理位置２２０３の組をレコードと呼ぶこととする。
【０４６１】
この実施の形態の圧縮テキスト検索装置は、例えば、実施の形態１で説明した図７のステップＳ２０７で求めた状態遷移履歴と受理位置を、圧縮ブロックが参照する状態遷移記憶部のエントリの、新たなレコードとして追加する。
【０４６２】
１つの圧縮ブロックに対して、状態履歴を１つしか記憶しない場合には、状態記憶部１１１が記憶した現在の状態と、状態遷移記憶部１１２の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致した時のみ、圧縮ブロックの参照文字列に対する状態遷移の回数を削減することができる。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、状態記憶部の現在の状態と、状態遷移記憶部の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致しているか判定する時、複数の状態遷移の履歴を記憶することができるため、状態が一致する確率を高めることができる。よって、より状態遷移の回数を削減することができる確率が高くなり、より検索処理を高速化することができる。
【０４６３】
ここで説明した圧縮テキスト検索装置は、圧縮辞書の１つのエントリに対して、複数の状態遷移の履歴を記憶することを特徴とする。
【０４６４】
実施の形態１８．
実施の形態１８を図３７を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０４６５】
この実施の形態では、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する状態履歴の内容の別の例について説明する。
【０４６６】
図３７は、この実施の形態による圧縮テキスト検索装置の、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図である。この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部１１２を、スライド窓に対して複数の状態遷移履歴を記憶するように構成したものである。
【０４６７】
この実施の形態の圧縮テキスト検索装置の状態遷移記憶部は、状態を（スライド窓の長さ＋１）個分記憶する状態遷移履歴２３０４と受理位置２３０５の組から構成されるレコードを複数組備える。
【０４６８】
この実施の形態の圧縮テキスト検索装置の検索処理の流れを説明する。
【０４６９】
１つの圧縮ブロックに対して、状態履歴を１つしか記憶しない場合には、状態記憶部１１１が記憶した現在の状態と、状態遷移記憶部１１２の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致した時のみ、圧縮ブロックの参照文字列に対する状態遷移の回数を削減することができる。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、状態記憶部の現在の状態と、状態遷移記憶部の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致しているか判定する時、複数の状態遷移の履歴を記憶することができるため、状態が一致する確率を高めることができる。よって、より状態遷移の回数を削減することができる確率が高くなり、より検索処理を高速化することができる。
【０４７０】
ここで説明した圧縮テキスト検索装置は、辞書中の１つの文字列に対して、ＬＺ７７形式およびＬＺＳＳ形式から派生した圧縮形式のスライド窓に対して、複数の状態遷移の履歴を記憶することを特徴とする。
【０４７１】
実施の形態１９．
実施の形態１９を図３８を用いて説明する。
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０４７２】
この実施の形態では、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する状態履歴の内容の別の例について説明する。
【０４７３】
図３８は、この実施の形態による圧縮テキスト検索装置の、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図である。この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部１１２を、状態遷移の履歴の先頭と末尾の状態のみを記憶するように構成したものである。
【０４７４】
この実施の形態の圧縮テキスト検索装置の状態遷移記憶部は、参照番号２４０１、状態遷移履歴の先頭の状態２４０２、状態遷移履歴の末尾の状態２４０３、受理位置２４０４を記憶する。この実施の形態の圧縮テキスト検索装置は、例えば、実施の形態１で説明した図７のステップＳ２０７で求めた状態遷移履歴の先頭と末尾の状態、受理位置のみを、状態遷移記憶部にセットする。
【０４７５】
状態遷移記憶部１１２が状態遷移履歴を全部記憶する場合には、圧縮辞書のエントリの数と圧縮辞書の文字列の長さに応じて、記憶領域を必要とする。そのため、圧縮辞書のエントリの数や、圧縮辞書の文字列の長さが大きくなるとメモリなどの記憶容量を圧迫することがある。
この実施の形態の圧縮テキスト検索装置では、状態遷移の先頭の状態と末尾の状態、そして受理位置のみが分ればよい。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、状態遷移記憶部が必要とする記憶領域の大きさは、圧縮辞書の文字列の長さには依存せず、圧縮辞書のエントリの数の定数倍で抑えることができる。
【０４７６】
ここで説明した圧縮テキスト検索装置は、辞書中の文字列に対して状態遷移の履歴を記憶する際に、履歴の先頭の状態と、末尾の状態のみを記憶することを特徴とする。
【０４７７】
実施の形態２０．
この実施の形態における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観、ハードウェア構成、ブロック構成は、実施の形態１で説明したものと同一なので、ここでは説明を省略する。
【０４７８】
この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部１１２を、圧縮ブロックの参照文字列の長さが、予め決められた長さ以上のときのみ、状態遷移の履歴をセットするようにしたものである。
【０４７９】
例えば、図４を例にすると、参照文字列の長さが５以上の場合のみ、状態遷移履歴を記憶するとした場合、１番目の状態遷移のみを記憶する。
【０４８０】
この実施の形態の圧縮テキスト検索装置は、状態記憶部１１１が記憶した現在の状態と、状態遷移記憶部１１２の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致した場合に、圧縮ブロックの参照文字列に対する状態遷移を１ステップで処理することができる。このとき、削減できる処理のステップ数は、圧縮ブロックが参照している文字列の長さが長いほど大きくなる。すなわち、圧縮ブロックの参照文字列が短い場合には、処理のステップ数の削減効果は小さい。
【０４８１】
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、圧縮辞書の文字列が短いエントリに対応した状態遷移履歴を記憶しなくて良いため、状態遷移記憶部の必要とする記憶領域を削減することができる。
【０４８２】
ここで説明した圧縮テキスト検索装置は、辞書中の文字列に対して状態遷移の履歴を記憶する際に、予め定められた長さ以上の文字列に対してのみ、状態遷移の履歴を記憶することを特徴とする。
【０４８３】
実施の形態１７乃至実施の形態２０で説明した状態遷移記憶部１１２が記憶する状態履歴の構成は、複数組み合わせて構成しても良い。
【図面の簡単な説明】
【０４８４】
【図１】実施の形態１における圧縮テキスト検索装置１００（文字列検索装置の一例）の外観の一例を示す図。
【図２】実施の形態１における圧縮テキスト検索装置のハードウェア構成の一例を示す図。
【図３】実施の形態１における圧縮テキスト検索装置１００のブロック構成の一例を示すブロック図。
【図４】実施の形態１において、圧縮テキスト記憶部１０３が記憶した圧縮テキストの一例を示す図。
【図５】実施の形態１において、状態遷移記憶部１１２が記憶する状態履歴の構造を示す図。
【図６】実施の形態１において、状態遷移表記憶部１０６が記憶する状態遷移表２００の一例を示す図。
【図７】実施の形態１における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図。
【図８】図７のＳ１６における処理の詳細の一例を示すフローチャート図。
【図９】実施の形態２において、圧縮テキスト記憶部１０３及び状態遷移記憶部１１２が記憶する記憶内容の一例を示す図。
【図１０】実施の形態２における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図。
【図１１】ＬＺ７７形式による圧縮テキストの構造を示す図。
【図１２】実施の形態３における、圧縮辞書記憶部１１３（辞書記憶部の一例）と状態遷移記憶部１１２（履歴記憶部の一例）の記憶する情報を示す図。
【図１３】実施の形態３の圧縮テキスト検索装置１００における検索処理の流れ図。
【図１４】実施の形態４において、圧縮テキスト記憶部１０３及び状態遷移記憶部１１２の記憶内容の一例を示す図。
【図１５】実施の形態４における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図。
【図１６】ＬＺＳＳ形式による圧縮テキストの構造を示す図。
【図１７】実施の形態６において、圧縮テキスト記憶部１０３及び圧縮辞書記憶部１１３（辞書記憶部の一例）及び状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図。
【図１８】実施の形態６における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図。
【図１９】ＬＺ７８形式による圧縮テキストの構造を示す図。
【図２０】実施の形態７の圧縮テキスト検索装置における検索処理の流れ図。
【図２１】実施の形態８において、圧縮テキスト記憶部１０３及び圧縮辞書記憶部１１３（辞書記憶部の一例）が記憶する記憶内容の一例を示す図。
【図２２】実施の形態８において、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図。
【図２３】実施の形態８における圧縮テキスト検索装置１００の検索処理の制御の流れの一例を示すフローチャート図。
【図２４】ＬＺＷ形式による圧縮テキストの構造を示す図。
【図２５】圧縮技術において取り扱う文字を表現したビット列のビット長と、検索装置において取り扱う文字を表現したビット列のビット長とが異なっている場合について説明するための説明図。
【図２６】実施の形態１０における圧縮テキスト検索装置１００のブロック構成の一例を示すブロック図。
【図２７】実施の形態１０において、圧縮テキスト記憶部１０３、圧縮辞書記憶部１１３（辞書記憶部の一例）、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図。
【図２８】実施の形態１１において、圧縮テキスト記憶部１０３、圧縮辞書記憶部１１３（辞書記憶部の一例）、状態遷移記憶部１１２（履歴記憶部の一例）が記憶する記憶内容の一例を示す図。
【図２９】実施の形態１２による圧縮テキストの構造を示す図。
【図３０】実施の形態１２において、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図。
【図３１】状態遷移表記憶部１０６が記憶する状態遷移表の一例を示す図。
【図３２】実施の形態１２の圧縮テキスト検索装置における検索処理の流れ図。
【図３３】図３２の検索処理の流れにおけるステップＳ１５１１の処理の流れ図。
【図３４】実施の形態１３による、圧縮辞書記憶部１１３と状態遷移記憶部１１２の記憶する情報を示す図。
【図３５】実施の形態１３の圧縮テキスト検索装置における検索処理の流れ図。
【図３６】実施の形態１７による圧縮テキスト検索装置の、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図。
【図３７】実施の形態１８による圧縮テキスト検索装置の、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図。
【図３８】実施の形態１９による圧縮テキスト検索装置の、状態遷移記憶部１１２が記憶する状態履歴の構造を示す構成図。
【図３９】ＤＦＡの動作における状態の遷移の一例を示す概念図。
【図４０】ＤＦＡの状態の遷移についての説明図。
【図４１】オートマトン実行部がＤＦＡを実行するために記憶する状態遷移表の一例を示す図。
【図４２】オートマトン実行部の処理の流れの一例を示すフローチャート図。
【図４３】ＤＦＡの一例を示す概念図。
【図４４】ＬＺＳＳ方式における符号化の一例を示す図。
【図４５】従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図。
【図４６】ＬＺ７７方式における符号化の一例を示す図。
【図４７】辞書参照型圧縮方式における符号化の一例を示す図。
【図４８】ＬＺ７８方式における符号化の一例を示す図。
【図４９】従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図。
【図５０】ＬＺＷ方式における符号化の一例を示す図。
【符号の説明】
【０４８５】
１００  圧縮テキスト検索装置、１０２  検索条件入力部、１０３  圧縮テキスト記憶部、１０４  照合結果出力部、１０５  状態遷移表生成部、１０６  状態遷移表記憶部、１０７  照合部、１０８  圧縮ブロック取得部、１０９  文字取得部、１１０  状態遷移機械、１１１  状態記憶部、１１２  状態遷移記憶部、１１３  圧縮辞書記憶部、１１４  条件判断部、１１５  現在位置カウンタ、１１６  遷移先算出部、１１７  検索成功判別部、１２１  未完文字復元部、１２２  バイトデータ記憶部、２００  状態遷移表、３００  圧縮ブロック列、５００  元の文字列、６００  符号列、６５０  置換辞書、９０１  ＣＲＴ表示装置、９０２  Ｋ／Ｂ、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ装置、９０７  スキャナ装置、９１０  システムユニット、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信ボード、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群、９３１  電話器、９３２  ＦＡＸ機、９４０  インターネット、９４１  ゲートウェイ、９４２  ＬＡＮ。
【図１】
2006302082.tif 000003
【図２】
2006302082.tif 000004
【図３】
2006302082.tif 000005
【図４】
2006302082.tif 000006
【図５】
2006302082.tif 000007
【図６】
2006302082.tif 000008
【図７】
2006302082.tif 000009
【図８】
2006302082.tif 000010
【図９】
2006302082.tif 000011
【図１０】
2006302082.tif 000012
【図１１】
2006302082.tif 000013
【図１２】
2006302082.tif 000014
【図１３】
2006302082.tif 000015
【図１４】
2006302082.tif 000016
【図１５】
2006302082.tif 000017
【図１６】
2006302082.tif 000018
【図１７】
2006302082.tif 000019
【図１８】
2006302082.tif 000020
【図１９】
2006302082.tif 000021
【図２０】
2006302082.tif 000022
【図２１】
2006302082.tif 000023
【図２２】
2006302082.tif 000024
【図２３】
2006302082.tif 000025
【図２４】
2006302082.tif 000026
【図２５】
2006302082.tif 000027
【図２６】
2006302082.tif 000028
【図２７】
2006302082.tif 000029
【図２８】
2006302082.tif 000030
【図２９】
2006302082.tif 000031
【図３０】
2006302082.tif 000032
【図３１】
2006302082.tif 000033
【図３２】
2006302082.tif 000034
【図３３】
2006302082.tif 000035
【図３４】
2006302082.tif 000036
【図３５】
2006302082.tif 000037
【図３６】
2006302082.tif 000038
【図３７】
2006302082.tif 000039
【図３８】
2006302082.tif 000040
【図３９】
2006302082.tif 000041
【図４０】
2006302082.tif 000042
【図４１】
2006302082.tif 000043
【図４２】
2006302082.tif 000044
【図４３】
2006302082.tif 000045
【図４４】
2006302082.tif 000046
【図４５】
2006302082.tif 000047
【図４６】
2006302082.tif 000048
【図４７】
2006302082.tif 000049
【図４８】
2006302082.tif 000050
【図４９】
2006302082.tif 000051
【図５０】
2006302082.tif 000052