JP4726046B2 - 文字列検索装置及びコンピュータプログラム及び文字列検索方法 - Google Patents

文字列検索装置及びコンピュータプログラム及び文字列検索方法 Download PDF

Info

Publication number
JP4726046B2
JP4726046B2 JP2005124860A JP2005124860A JP4726046B2 JP 4726046 B2 JP4726046 B2 JP 4726046B2 JP 2005124860 A JP2005124860 A JP 2005124860A JP 2005124860 A JP2005124860 A JP 2005124860A JP 4726046 B2 JP4726046 B2 JP 4726046B2
Authority
JP
Japan
Prior art keywords
state
character
character string
automaton
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2005124860A
Other languages
English (en)
Other versions
JP2006302082A (ja
Inventor
隆顕 中村
光則 郡
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP2005124860A priority Critical patent/JP4726046B2/ja
Publication of JP2006302082A publication Critical patent/JP2006302082A/ja
Application granted granted Critical
Publication of JP4726046B2 publication Critical patent/JP4726046B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は、文書の中から所定の文字列を検索する技術に関する。
近年様々な分野で文書の電子化が進んでいる。大量の電子化された文書が利用されるに伴って、次のような課題も出てきている。
第一の課題は、大量に存在する文書の中から、所望の文書を見つけ出すことが困難になるということである。そのため、電子化された文書を効率的に検索する方式が求められている。
この課題を解決する技術としては、DFA(Deterministic Finite Automaton:決定性有限オートマトン)を用いた検索方法が知られている(例えば、非特許文献1等)。
また、固定した文字列を検索するだけでは、検索の効率が悪い。そこで、検索文字列の一部または全部を選択的に指定したり、同一の文字列の繰り返しの指定を許すことによって、検索条件を一般化し、類似する文字列を同時に検索することが行われる。このように、検索文字列を一般化して表現した検索パターンの表記方法としては、正規表現等が知られている。
正規表現に基づいて、それを検索可能なNFA(Nondeterministic Finite Automaton:非決定性有限オートマトン)を構成できることが知られている(例えば、非特許文献1、非特許文献2等)。
さらに、NFAは、それと等価なDFAに変換できることが知られている(例えば、非特許文献1、非特許文献2等)。
第二の課題は、大量の文書を保存するための記憶装置の容量や、ネットワークを介して文書をやり取りする場合にネットワークの帯域を消費すると言うことである。記憶装置の容量節約や、ネットワークを流れるデータ転送量の縮小のため、電子化された文書を効率よく圧縮する方式が求められている。
この課題を解決する技術としては、LZ(Lempel−Ziv)77方式、LZ78方式、LZSS(Lempel−Ziv−Storer−Syzmanski)方式、LZW(Lempel−Ziv−Welch)方式、ハフマン符号化方式等、様々な可逆圧縮法が知られている。
第三の課題は、上記した検索技術と圧縮技術は、それぞれ独立して発達してきたため、圧縮された文書を効率よく検索することが困難であるということである。
この課題を解決する技術としては、単純に、一度圧縮テキスト(圧縮された文書)を伸張(復元)した後で、検索する方式が一般的である。検索の方法としては、例えば、状態遷移機械(有限オートマトン)を用いて文字列照合を行う。
その一方で、圧縮された文書を伸長せずに検索する方式も知られている(例えば、特許文献1、非特許文献1等)。
特許文献1に記載の検索方式は、圧縮テキストを固定の検索文字列によって高速に検索する方式に関するものである。この方式では、圧縮辞書と固定の検索文字列を入力として有限オートマトンを作成し、その有限オートマトンによって圧縮テキストを伸張することなく検索することで、圧縮率の逆数倍高速に検索することができる。
非特許文献1に記載の検索方式は、LZ78形式またはLZW形式で圧縮された圧縮テキストを、正規表現を含んだ検索条件によって高速に検索する方式に関するものである。この方式では、圧縮テキストを伸張することなく、決定性有限オートマトンによって検索することで、高速に検索することができる。
特開平10−260980号公報 Gonzalo Navarro、"Regular Expression Searching on Compressed Text"、Journal of Discrete Algorithms Volume 1、Issue 5−6(October 2003)、423〜443ページ、2003 E.J.Hopcroft,D.J.Ullman,"Formal Languages And Their Relation to Automata"、 Addison Wesley(1969)(邦題「言語理論とオートマトン」、サイエンス社、昭和46年)
圧縮された文書を伸長してから検索を行う方式は、圧縮テキストを伸張する時間と、文字列照合の時間が必要となり、検索時間が長くなるという課題がある。
特許文献1に記載の検索方式は、固定の検索文字列と圧縮の辞書を入力としており、正規表現を検索条件として扱うことはできないという課題がある。また、現在広く利用されている辞書式圧縮方式LZ77、LZSS、LZ78、LZWなどの方式では、圧縮テキストを伸張しながら同時に圧縮の辞書を生成するため、検索の開始時点で圧縮辞書が存在することを前提とした特許文献1の方式を適用することができないという課題がある。
非特許文献1に記載の検索方式は、テキストがシングルバイトコードからなることを前提としており、マルチバイトコード文字を含むテキストを検索することを考慮されていないという課題がある。また、LZ78やLZW形式の圧縮辞書の特徴を利用した方式であるため、圧縮辞書にそのような特徴を持たない他の圧縮方式で圧縮されたテキストを検索することができないという課題がある。
本発明は、例えば、上記のような課題を解決するためになされたもので、圧縮された文書を効率よく検索することを目的とする。
本発明に係る文字列検索装置は、
状態を保持し、文字を入力し、上記保持した状態と上記入力した文字とに基づいて遷移先状態を算出し、上記保持した状態を上記算出した遷移先状態に更新するオートマトンであって、所定の文字列を構成する文字を入力した場合に、上記記憶した状態が所定の状態となるか否かを判別することにより、所定の検索パターンに対応する検索文字列が上記文字列に含まれるか否かを判別できるよう構成したオートマトンを実行することによって、
上記文字列に含まれる部分文字列を上記部分文字列に対応する所定の符号に置換した符号列を取得して、上記文字列から上記検索文字列を検索する文字列検索装置において、
上記オートマトンを実行するオートマトン実行部と、
上記オートマトンが保持した状態を状態履歴として記憶する履歴記憶部と、
上記符号列を構成する符号を取得する符号取得部と、
上記オートマトンが保持する状態と上記履歴記憶部が記憶した状態履歴と上記符号取得部が取得した符号とに基づいて、第一の条件及び第二の条件を満たすか否かを判断する条件判断部と、
上記条件判断部が第一の条件を満たすと判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて遷移先状態を算出し、上記オートマトンが保持した状態を、算出した遷移先状態に更新する遷移先算出部と、
上記条件判断部が第二の条件を満たすと判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を復元し、上記部分文字列を構成する文字を上記オートマトンに入力する文字列復元部と、
を有することを特徴とする。
本発明によれば、例えば、圧縮されたテキストに含まれる文字列を検索する場合において、正規表現等による検索条件の指定を行い、これを有限オートマトンに変換して検索を行う検索装置において、圧縮ブロックに置換された部分文字列に対して行った検索の履歴を記憶し、記憶した履歴を用いて、オートマトンの状態遷移を省略することにより、検索が高速に行えるとの効果を奏する。
まず、DFA(オートマトンの一例)を用いた検索方法について説明する。
DFAによる文字列照合方式は状態遷移機械(オートマトン)のモデルに基づいている。状態遷移機械は内部に状態と状態遷移関数を持つ。状態遷移関数は現在の状態と入力文字に対して次の状態を決定する関数である。DFAを用いた文字列照合方式では、入力テキストを1文字ずつ読み出し、現在の状態と入力文字の組に対して状態遷移関数を適用して得られた次の状態に遷移する。この方法によるとテキストを後戻りすることなく1度走査することによって照合を行うことができ、高速な文字列照合が可能になる。複数の条件による照合を行う場合、照合に成功した条件を区別するため、DFAを拡張し各状態に出力を定義した出力つき有限オートマトン(Moore(ムーア)機械)も用いられている。
図39は、DFAの動作における状態の遷移の一例を示す概念図である。
図39において、状態990〜993は、DFAの状態を示す。DFAは、状態990〜993のうち、どれか一つの状態を保持しており、入力によって保持している状態が遷移(更新)する。検索開始時は、初期状態990を保持している。
図中の矢印は、状態の遷移を示す。矢印に添えられた文字を入力すると、矢印の先の状態へ遷移する。
例えば、現在の状態が状態990で、文字「a」を入力すると、状態991に遷移する。また、現在の状態が状態990で、文字「b」または「c」を入力すると、状態990のまま変わらない。
ここでは、説明を簡単にするため、DFAに入力する文字は「a」「b」「c」の3種類しかないものとしているが、実際のDFAに入力する文字の種類はもっと多くてもよいことはもちろんである。
ここでいう「文字」とは、アルファベットや漢字といった狭義の文字に限らず、およそコンピュータが文字として扱えるものであれば何でも構わない。コンピュータ上において、文字はビット列で表現されている。例えば、ASCII(American Standard Code for Information Interchange)コードを用いる場合、文字「a」は「01000001」(41h)という8ビットのビット列で表現される。あるいは、シフトJIS(Japan Industry Standard:日本工業規格)コードを用いる場合、文字「あ」は「1000001010100000」(82A0h)という16ビットのビット列で表現される。このように、使用する文字コードによっては、それを表現するビット列のビット長が異なる場合もある。したがって、およそコンピュータ上でビット列として表現できるものは、すべて「文字」として扱うことができ、DFAに入力することができる。
ただし、DFAは、あらかじめ入力に対応した遷移先が決まっていなければ動作させることができないので、DFAに入力する可能性のある文字の種類は有限個でなければならない。
図39において、状態993は特別な状態であり、これを受理状態という。検索を目的として構成したDFAにおいては、検索に成功したときに、受理状態となる。
図39に示すDFAは、検索文字列「abc」を検索するためのものである。
文字列「bababcc」の中から検索文字列「abc」を検索する場合を例にとって、図39に示すDFAの動作を説明する。
DFAには、文字列「bababcc」を構成する文字を、最初から1文字ずつ入力していく。
図40は、図39に示すDFAに文字を入力していった場合に、DFAの状態がどのように遷移するかを示す図である。
検索開始時には、DFAの状態は初期状態990である。
まず、文字「b」を入力すると、DFAの状態は状態990のまま変わらない。
次に、文字「a」を入力すると、DFAの状態は状態991に遷移する。
次に、文字「b」を入力すると、DFAの状態は状態992に遷移する。
次に、文字「a」を入力すると、DFAの状態は状態991に遷移する。
次に、文字「b」を入力すると、DFAの状態は状態992に遷移する。
次に、文字「c」を入力すると、DFAの状態は状態993に遷移する。
状態993は受理状態であるから、この時点で、文字列「bababcc」に検索文字列「abc」が含まれていることが分かる。また、6文字目の「c」を入力した時点で、DFAの状態が受理状態993になったので、検索文字列「abc」は、文字列「bababcc」の6文字目で終わる位置に現れることもわかる。
次に、文字「c」を入力すると、DFAの状態は状態990に遷移する。
DFAに入力する文字がなくなったので、これでDFAは動作を終了する。
以上の動作により、文字列「bababcc」のなかには検索文字列「abc」が1回出現し、その出現位置は6文字目で終わる位置であることがわかる。
次に、オートマトン実行部がこのDFAを実行する処理の流れについて説明する。
オートマトン実行部は、図39のDFAに対応して図41の遷移先一覧表を記憶している。
この表は、DFAが最左欄の状態にあるときに、最上欄の文字を入力すると、次に遷移する遷移先の状態を示すものである。
図42は、オートマトン実行部の処理の流れの一例を示すフローチャート図である。
検索開始時に、オートマトン実行部は、DFAの状態を初期化して、初期状態にする(S991)。例えば、DFAの状態を記憶するメモリに、初期状態の状態番号0を記憶する。
次に、例えば、文字列復元部が、オートマトンに文字列を1文字ずつ入力する(S992)。すなわち、オートマトン実行部に入力する文字を通知し、オートマトン実行部がこれを取得する。
オートマトン実行部は、記憶した遷移先一覧表を参照して、現在のDFAの状態と入力した文字とに基づいて、遷移先状態を算出する(S993)。
次に、オートマトン実行部は、DFAの状態を更新する(S994)。例えば、DFAの状態を記憶するメモリに、遷移先状態の状態番号を記憶する。
オートマトン実行部は、DFAの状態が受理状態が否かを判別する(S995)。DFAの状態が受理状態である場合には、検索に成功したので、検索成功処理をする(S996)。例えば、検索に成功したことを示すメッセージや検索文字列の出現した位置をCRT表示装置901に表示する。
以上の処理を、DFAに入力する文字がなくなるまで繰り返す(S997)。
図43は、もう少し複雑なDFAの一例である。
図43に示すDFAは、文字列「ababb」及び「abca」及び「aba」及び「bb」を検索できるように構成されている。
次に、正規表現について説明する。
正規表現とは、正規言語と呼ばれる言語のクラスを表現する表記方法である。
正規言語とは、それを構成する文字を任意に連結した文字列のうち、一定の規則に従う文字列の集合である。
正規表現は、正規言語を構成する文字とメタ文字とからなる文字列であり、ある文字列が正規言語に属するかどうかを識別するための規則を表現している。
正規表現の表記法には様々なものが知られている。ここではその一例について説明する。
説明を簡単にするため、正規言語を構成する文字は「a」「b」「c」の3種類しかないものとする。
また、メタ文字は「(」「)」「|」「*」「?」の5種類があるものとする。ここで、「(」「)」はグループ化を意味する。「|」は選択を意味する。「*」は0回以上の繰り返しを意味する。「?」は0回または1回の出現を意味する。
例えば、正規表現「(ab|c)」は、文字列「ab」及び「c」を要素とする正規言語を表現するものである。
また、例えば、正規表現「ab*」は、文字列「a」、「ab」、「abb」、「abbb」、・・・を要素とする正規言語を表現するものである。
また、例えば、正規表現「c?b」は、文字列「b」及び「cb」を要素とする正規言語を表現するものである。
実際に知られている正規表現はもっと複雑であるが、ここでは説明しない(非特許文献2等を参照のこと)。
このように、正規表現を用いると、文字列の集合を簡単に表現できるので、正規表現は検索条件を記述する検索パターンに用いられる。
例えば、文字列「ababb」及び「abca」及び「aba」及び「bb」を検索したい場合、これを正規表現で記述すると、「ababb|abca|aba|bb」となる。あるいは「(aba)?(bb)?|abca」と記述してもよいし、「abc?a|(aba)?bb」と記述してもよい。
正規表現を用いて記述した検索パターンに対応する検索文字列を検索する場合、正規表現に対応するNFAを求めて、NFAを実行することによって検索する方法がある。
NFAは、DFAと同じくオートマトンの一種であるが、ある状態に対して、一つの文字を入力した場合に遷移する遷移先状態が2つ以上あったり、文字を入力しない場合でも状態が遷移(これを「空遷移」または「ε遷移」という)したりするので、遷移先状態を一意に決定することができない。
そこで、NFAを実行するには、遷移先が2つ以上ある場合、そのうちの1つを選択してとりあえず実行してみる。実行して失敗した場合には、分岐点に戻り、別の選択肢を選択してまた実行する。このように、バックトラックをすることにより、NFAを実行することが可能である。
しかし、このようにバックトラックによりNFAを実行すると、途中で失敗した場合に後戻りが生じるので、検索に時間がかかる。
そこで、NFAをDFAに変換し、変換されたDFAを実行することで、後戻りせずに短時間で検索することができる。
正規表現からNFAを求める方法、NFAをDFAに変換する方法については、既に知られたものがあるので、ここでは説明しない(例えば、非特許文献1等を参照のこと)。
次に、文書圧縮技術について説明する。
現在一般的な文書圧縮技術には、自己参照型のものと辞書参照型のものがある。また、辞書参照型には、別に辞書を用意するものと、圧縮文書の中に辞書が埋め込まれているものとがある。
自己参照型の圧縮技術について説明する。この圧縮方式には、例えば、LZ77方式やLZSS方式がある。
自己参照型圧縮技術において基本となる考え方は、元の文字列の異なる位置に、同じ部分文字列がある場合、一方を他方への参照で置換することによって、文字列全体の符号長を短くしようというものである。
図44は、LZSS方式における符号化の一例を示す図である。
ここで、文字列「cbababcbc」を圧縮する場合を例にとって説明する。なお、ここでは、ASCIIコードを用いているものとする。したがって、1文字は8ビットのビット列によって表現されている。
文字列に含まれる部分文字列は、次の規則にしたがって符号に変換される。
規則1:1文字からなる部分文字列は、フラグ981(1ビット)とその文字を表現するビット列982(8ビット)からなる9ビットの符号に変換する。
規則2:部分文字列が、それより前に出現した他の部分文字列と一致する場合には、フラグ981(1ビット)、他の部分文字列の出現位置983(例えば8ビット)、部分文字列の長さ984(例えば5ビット)の合計14ビットの符号に変換する。
フラグ981は、規則1で変換したか規則2で変換したかを区別するためのもので、あとで元の文字列を復元するときに使用する。
ビット列982は、その文字を表すASCIIコードである。ここでは、元の文字と同じコードを使用しているが、元の文字を復元することができれば、異なるコードに置き換えてもよい。
他の部分文字列の出現位置983は、それより前に出現した他の部分文字列の先頭の位置を、現在の部分文字列の先頭の位置からの距離(何文字前か)で表したものである。この例では、出現位置983は8ビットのビット列で表現しているので、256文字より前に他の部分文字列がある場合には、規則2を適用することができない。
部分文字列の長さ984は、規則2を適用して符号化する部分文字列の文字数である。この例では、部分文字列の長さ984は5ビットのビット列で表現しているので、32文字以上の部分文字列には、規則2を適用することができない。
文字列「cbababcbc」を圧縮する場合、最初の「c」「b」「a」はそれ以前に出現したことがないので、1文字ずつ規則1を適用して符号601〜603に変換する。
4文字目から始まる3文字の部分文字列「bab」は、2文字目(現在位置から見て2文字前)から始まる3文字の他の部分文字列「bab」と一致するので、規則2を適用して符号604に変換する(このように、他の部分文字列は、自分自身と一部重なっていても構わない)。
7文字目から始まる2文字の部分文字列「cb」は、1文字目(現在位置から見て6文字前)から始まる2文字の他の部分文字列「cb」と一致するので、規則2を適用して符号605に変換する。
9文字目から始まる1文字の部分文字列「c」は、7文字目から始まる1文字の部分文字列「c」と一致するので、規則2を適用して変換してもよい。しかし、規則2を適用すると、変換した符号は14ビットになるのに対して、規則1で変換すれば9ビットにしかならないので、圧縮効率が高くなるよう(圧縮後のビット長が短くなるよう)規則1を適用して符号606に変換する。
以上の変換により、全体のビット長が72ビットあった文字列「cbabacbc」は、全体のビット長が64ビットの符号列に置換される。
このようにして置換した符号列から元の文字列を復元する手順について説明する。
図45は、従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図である。
まず、符号列から1ビット(フラグ981)取得し(S981)、続く符号が規則1で変換されたものか規則2で変換されたものかを判別する(S982)。
フラグ981が「1」なら、規則1なので、続く8ビット(符号982)を取得し(S983)、それを文字として出力する(S984)。
出力した文字は、出力履歴に記憶する(S985)。
例えば、図44の符号601は、文字「c」に変換し、出力する。
フラグ981が「0」なら、規則2なので、続く13ビット(出現位置983及び長さ984)を取得する(S986)。
例えば、図44の符号604であれば、2文字前から3文字であるとわかる。
次に、出力履歴を参照して、部分文字列を復元し、出力する(S987)。
出力した文字は、出力履歴として記憶する(S988)。
例えば、図44の符号604であれば、出力履歴の2文字前を読み出す。この時点で出力履歴として「cba」の3文字が記憶してあるので、2文字前は「b」である。そこで、「b」を出力し、すぐに出力履歴として記憶する。出力履歴は「cbab」となる。
これを長さが示す文字数繰り返す(S989)。
2文字目において、2文字前は「a」なので、続いて2文字目「a」を出力する。出力履歴は「cbaba」となる。3文字目において、2文字前は「b」なので、3文字目「b」を出力する。3文字分出力したので、符号604についての処理は終わり、次の処理に移る。したがって、符号604に対応して、「bab」の3文字が出力される。
これを符号列が終わるまで繰り返す(S990)。
図46は、同じく自己参照型圧縮技術の一種であるLZ77方式における符号化の一例を示す図である。
LZ77方式は、LZSS方式と符号化の規則が異なるが、他の部分はほとんど同じである。
LZ77方式では、次の2つの規則により、元の文字列を符号列に置換する。
規則1:部分文字列のうち、最後の1文字を除いた部分文字列が、それより前に出現した他の部分文字列と一致する場合には、他の部分文字列の出現位置983(例えば8ビット)及び部分文字列の長さ984(例えば5ビット)の合計13ビットの符号と、最後の1文字を示すビット列(例えば8ビット)の2つの符号に変換する。
規則2:1文字からなる部分文字列は、出現位置0及び長さ0を示す符号(例えば13ビット)と、その文字を示すビット列(例えば8ビット)の2つの符号に変換する。ここで、出現位置0は、他の文字列への参照がないことを示す一例である。
この規則によれば、他の部分文字列へのポインタを示す符号と、文字を表現するビット列を示す符号とは、必ず交互に出現することになるので、その符号がどちらの意味であるかを示すフラグは必要ない。
符号化、復元の動作についての説明は、省略する。
辞書参照型の圧縮技術について説明する。
辞書参照型圧縮技術において基本となる考え方は、元の文字列の部分文字列が、辞書(置換辞書)に登録してある単語と一致する場合、その部分文字列を、辞書に登録してある符号で置換することによって、文字列全体のビット長を短くしようというものである。
例えば、図47に示すような辞書があるとする。文字列「cbababcbc」を圧縮すると、符号列「12233」を得る。符号1つ当りのビット長が12ビットだとすれば、全体のビット長は60ビットになる。
例えば、自然言語を記述した文書を圧縮する場合、その言語の単語や、よく出現するフレーズを辞書に登録しておけば、高い圧縮率を得ることができる。
辞書は、符号列とは別に用意しておいてもよいし、符号列に埋め込んでもよい。
埋込辞書参照型の圧縮技術について説明する。この圧縮方式にはLZ78方式、LZW方式などがある。
埋込辞書参照型は、辞書参照型の一形態である。埋込辞書参照型では、辞書を別に用意するのではなく、符号列の中に辞書の情報を埋め込んである。
図48は、LZ78方式における符号化の一例を示す図である。
ここで、文字列「cbababcbc」を圧縮する場合を例にとって説明する。なお、ここでは、ASCIIコードを用いているものとする。したがって、1文字は8ビットのビット列によって表現されている。
文字列に含まれる部分文字列は、次の規則にしたがって、符号列に変換される。
規則1:部分文字列が辞書に登録されている場合、辞書の参照番号(例えば、10ビット)を示す符号971に変換し、次の1文字を、その文字を示すビット列(8ビット)の符号972に変換する。
規則2:1文字からなる部分文字列が辞書に登録されていない場合、参照番号0を示す符号971及びその文字を示すビット列の符号972の2つに変換する。ここで、参照番号0は、辞書に登録されていないことを示す番号の一例であり、他の番号でもよい。
この規則によれば、参照番号を示す符号971と、文字を表現するビット列を示す符号972とは、必ず交互に出現することになるので、その符号がどちらの意味であるかを示すフラグは必要ない。しかし、規則1と規則2とを区別するためのフラグビットを設けて、規則2の場合は、その文字を示す符号だけに変換してもよい。
この規則により変換した部分文字列+1文字は、置換辞書に登録されていない。もし登録されていれば、もう1文字長い部分文字列を同じビット長の符号に変換できるからである。そこで、この部分文字列+1文字を新しく置換辞書650に登録する。
圧縮開始前において、置換辞書650には何も登録されていない。しかし、あらかじめ取り決めた部分文字列を登録しておくこととしてもよい。例えば、1文字からなる部分文字列をすべて置換辞書650に登録しておけば、規則2は必要なくなる。
文字列「abababcbc」についていえば、最初の「a」は置換辞書650に登録されていない。そこで、規則2を適用して、参照番号「0」及び文字「a」を符号621及び符号622として出力する。そして部分文字列「c」を置換辞書650に登録する。参照番号は「1」となる。
次の「b」も置換辞書650に登録されていないので、参照番号「0」と文字「b」を出力し、「b」を置換辞書650に登録する(参照番号2)。
次の「a」は置換辞書650に登録されている(参照番号1)が、「ab」が登録されていないので、参照番号「1」と文字「b」を出力し、「ab」を置換辞書650に登録する(参照番号3)。
次の「ab」は置換辞書650に登録されている(参照番号3)が、「abc」は登録されていないので、参照番号「3」と文字「c」を出力し、「abc」を置換辞書650に登録する(参照番号4)。
次の「b」は置換辞書650に登録されている(参照番号2)が、「bc」は登録されていないので、参照番号「2」と文字「c」を出力し。「bc」を置換辞書650に登録する(参照番号5)。
このようにして置換した符号列から元の文字列を復元する手順について説明する。
図49は、従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図である。
まず、置換辞書650を初期化する(S971)。例えば、空にする。
次に、符号列から10ビット(辞書参照番号を示す符号971)取得し(S972)、参照番号が0以外なら(S973)、置換辞書650を参照して、参照番号に対応する前方文字列を求め、出力する(S974)。
符号列から8ビット(文字を表すビット列の符号972)取得し(S975)、それが示す文字を出力する(S976)。
S974及びS976で出力した文字を結合し、置換辞書650に新しく登録する(S977)。
これを符号列が尽きるまで繰り返す(S978)。
例えば、図48の符号列600を復元する場合について説明する。
最初に、置換辞書650を空にする。
符号621は参照番号「0」を示し、符号622は文字「a」を示すので、この2つの符号から部分文字列「a」を復元し、出力する。そして「a」を置換辞書650に登録する(参照番号1)。
符号623は参照番号「0」を示し、符号624は文字「b」を示すので、この2つの符号から部分文字列「b」を復元し、出力する。そして「b」を置換辞書650に登録する(参照番号2)。
符号625は参照番号「1」を示し、符号626は文字「b」を示すので、この2つの符号から部分文字列「ab」を復元し、出力する。そして「ab」を置換辞書650に登録する(参照番号3)。
符号627は参照番号「3」を示し、符号628は文字「b」を示すので、この2つの符号から部分文字列「abc」を復元し、出力する。そして「abc」を置換辞書650に登録する(参照番号4)。
符号629は参照番号「2」を示し、符号630は文字「c」を示すので、この2つの符号から部分文字列「bc」を復元し、出力する。そして「bc」を置換辞書650に登録する(参照番号5)。
なお、置換辞書650には、参照番号に対応する部分文字列を記憶する代わりに、復元した文字列内の対応する部分へのポインタを記憶してもよい。あるいは、前方文字列に対応する参照番号と残りの1文字を記憶してもよい。
図50は、同じく埋込辞書参照型圧縮技術の一種であるLZW方式における符号化の一例を示す図である。
ここで、文字列「cbababcbc」を圧縮する場合を例にとって説明する。なお、ここでは、ASCIIコードを用いているものとする。したがって、1文字は8ビットのビット列によって表現されている。
文字列に含まれる部分文字列は、次の規則にしたがって、符号列に変換される。
規則1:部分文字列を、辞書の参照番号を示す符号971に変換する。
辞書には、出現する可能性のある1文字からなる部分文字列をすべて最初に登録しておく。したがって、部分文字列が辞書に登録されていない場合はない。そのため、LZ78形式と異なり、辞書に登録されていない場合の変換規則(規則2)が存在しない。
この例では、出現する可能性がある文字が「a」「b」「c」の3種類しかないものとしているので、辞書には「a」「b」「c」の3つの部分文字列が最初に登録される。
変換した部分文字列+次の1文字(未変換)を、新しく辞書に登録する。
この規則によれば、規則が1つしか存在しないので、符号化の規則を区別する必要がない。また、最初から辞書に登録されている部分文字列があるので、LZ78方式に比べて圧縮率がよい。
符号化、復元の詳細についての説明は、省略する。
実施の形態1.
実施の形態1を図1〜図8を用いて説明する。
図1は、この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観の一例を示す図である。
図1において、圧縮テキスト検索装置100は、システムユニット910、CRT(Cathode Ray Tube)表示装置901、キーボード(K/B)902、マウス903、コンパクトディスク装置(CDD)905、プリンタ装置906、スキャナ装置907を備え、これらはケーブルで接続されている。
さらに、圧縮テキスト検索装置100は、FAX機932、電話器931とケーブルで接続され、また、ローカルエリアネットワーク(LAN)942、ゲートウェイ941を介してインターネット940に接続されている。
図2は、この実施の形態における圧縮テキスト検索装置のハードウェア構成の一例を示す図である。
図2において、圧縮テキスト検索装置100は、プログラムを実行するCPU(Central Processing Unit)911を備えている。CPU911は、バス912を介してROM(Read Only Memory)913、RAM(Random Access Memory)914、通信ボード915、CRT表示装置901、K/B902、マウス903、FDD(Flexible Disk Drive)904、磁気ディスク装置920、CDD905、プリンタ装置906、スキャナ装置907と接続されている。
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部の一例である。
通信ボード915は、FAX機932、電話器931、LAN942等に接続されている。
例えば、通信ボード915、K/B902、スキャナ装置907、FDD904などは、入力部の一例である。
また、例えば、通信ボード915、CRT表示装置901などは、出力部の一例である。
ここで、通信ボード915は、LAN942に限らず、直接、インターネット940、或いはISDN等のWAN(ワイドエリアネットワーク)に接続されていても構わない。直接、インターネット940、或いはISDN等のWANに接続されている場合、圧縮テキスト検索装置100は、インターネット940、或いはISDN等のWANに接続され、ゲートウェイ941は不用となる。
磁気ディスク装置920には、オペレーティングシステム(OS)921、ウィンドウシステム922、プログラム群923、ファイル群924が記憶されている。プログラム群923は、CPU911、OS921、ウィンドウシステム922により実行される。
上記プログラム群923には、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが記憶されている。プログラムは、CPU911により読み出され実行される。
ファイル群924には、以下に述べる実施の形態の説明において、「〜の判定結果」、「〜の計算結果」、「〜の処理結果」として説明するものが、「〜ファイル」として記憶されている。
また、以下に述べる実施の形態の説明において説明するフローチャートの矢印の部分は主としてデータの入出力を示し、そのデータの入出力のためにデータは、RAM914もしくは磁気ディスク装置920、FD(Flexible Disk)、光ディスク、CD(コンパクトディスク)、MD(ミニディスク)、DVD(Digital Versatile Disk)等のその他の記録媒体に記録される。あるいは、信号線やその他の伝送媒体により伝送される。
また、以下に述べる実施の形態の説明において「〜部」として説明するものは、ROM913に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、ハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。
また、以下に述べる実施の形態を実施するプログラムは、また、RAM914もしくは磁気ディスク装置920、FD(Flexible Disk)、光ディスク、CD(コンパクトディスク)、MD(ミニディスク)、DVD(Digital Versatile Disk)等のその他の記録媒体による記録装置を用いて記憶されても構わない。
図3は、この実施の形態における圧縮テキスト検索装置100のブロック構成の一例を示すブロック図である。
この圧縮テキスト検索装置は、入力された圧縮テキスト中に検索条件に適合する文字列が存在するか否かを判定し、存在する場合はその文字列の末尾の位置をヒット位置として出力する検索装置である。また、存在しない場合は何も出力しない。
図3において、圧縮テキスト検索装置100は、検索条件入力部102、圧縮テキスト記憶部103、照合結果出力部104、状態遷移表生成部105、状態遷移表記憶部106、照合部107から構成される。照合部107は、圧縮ブロック取得部108、文字取得部109、状態遷移機械110、状態記憶部111、状態遷移記憶部112、圧縮辞書記憶部113、条件判断部114、現在位置カウンタ115、遷移先算出部116、検索成功判別部117を有する。
検索条件入力部102は、検索条件(検索パターンの一例)を入力する。検索条件は、正規表現を用いて表現されている。しかし、固定の検索文字列でもよい。
状態遷移表生成部105は、検索条件の入力を受け付けると、検索条件と適合する文字列を受理するDFA(オートマトンの一例)に対応する状態遷移表を生成する機能を備えている。
すなわち、検索条件入力部102に入力した検索条件に基づいて、それに対応するNFAを求め、更に、NFAをDFAに変換し、それに対応する状態遷移表(遷移先一覧表の一例)を生成する。
状態遷移表生成部105が生成した状態遷移表は、状態遷移表記憶部106が記憶する。
圧縮テキスト記憶部103は、圧縮テキスト(符号列の一例)を記憶する。圧縮テキストとは、電子化された文書(文字列の一例)を圧縮技術によって符号化し、全体のビット長を短くしたものである。なお、圧縮テキストは、必ずしも文書を符号化したものである必要はなく、コンピュータが記憶するデータを符号化したものであってもよい。
照合部107は、圧縮テキストの入力を受け付けると、状態遷移表を参照しながら、圧縮テキスト中に検索条件に適合する文字列が存在するか否かを判定し、存在する場合はそのヒット位置を出力する機能を備える。
すなわち、圧縮テキスト記憶部103が記憶した圧縮テキストを入力すると、その圧縮テキストに対応する圧縮前の文書の中に、検索条件に合致する部分文字列が含まれるか否かを判別し、含まれる場合にはその出現位置(ヒット位置)を出力する。
照合部107が出力したヒット位置は、照合結果出力部104が、例えばCRT表示装置901に表示する。
圧縮ブロック取得部108(符号取得部の一例)は、入力された圧縮テキストから、圧縮ブロック(符号の一例)を1つずつ取得する機能を備える。
すなわち、圧縮テキスト記憶部103が記憶した圧縮テキストから、それを構成する圧縮ブロックを先頭から順に取得する。
圧縮辞書記憶部113(辞書記憶部の一例)は、圧縮テキストから圧縮辞書(置換辞書の一例)を取得し記憶する機能を備える。
すなわち、圧縮テキストの中に圧縮辞書の情報が埋め込まれている埋込辞書参照型圧縮方式において、圧縮テキストに埋め込まれた圧縮辞書の情報を抽出し、記憶する。あるいは、圧縮テキストとは別に圧縮辞書を用意する辞書参照型圧縮方式の場合には、別に用意した圧縮辞書を取得して記憶しておく。
文字取得部109(文字列復元部の一例)は、圧縮辞書記憶部113に記憶されている圧縮辞書を参照しながら、圧縮ブロック取得部108によって取得された圧縮ブロックから文字を1文字ずつ取得する機能を有する。
すなわち、圧縮辞書記憶部113が記憶した圧縮辞書に基づいて、圧縮ブロックに対応する部分文字列を求める。更に、その部分文字列を構成する文字を先頭から順に取得し、状態遷移機械110に入力する。
状態記憶部111は、状態遷移機械110の現在の状態を記憶する機能を備える。状態遷移機械110は、文字取得部109と状態記憶部111の状態を元に、状態遷移表を参照することで、次の状態を取得し、状態記憶部111の状態を更新する機能を備える。状態遷移記憶部112は、圧縮辞書記憶部113の文字列に対応した状態遷移の履歴を記憶する機能を備える。
すなわち、状態記憶部111及び状態遷移機械110はオートマトン実行部の一例であり、状態遷移表記憶部106が記憶した状態遷移表に対応するDFAを実行する。DFAの保持する状態は、状態記憶部111が記憶する。状態遷移機械110は、状態記憶部111が記憶したDFAの状態と、文字取得部109が入力した文字とに基づいて、状態遷移表記憶部106が記憶した状態遷移表を参照し、遷移先状態を取得する。状態記憶部111は、状態遷移機械110が取得した遷移先状態を、DFAの状態として、古いDFAの状態に上書きして記憶する(更新する)。
状態遷移記憶部112(履歴記憶部の一例)は、状態記憶部111が記憶したDFAの状態の履歴(状態履歴)を記憶する。
条件判断部114は、圧縮ブロックを元の部分文字列に復元するか否か等の条件を判断する。
現在位置カウンタ115は、元の文字列が検索条件に合致する検索文字列を含む場合に、そのヒット位置を求めるため、検索の現在位置を示すカウンタである。
遷移先算出部116は、状態遷移記憶部112が記憶した状態履歴に基づいて、DFAの遷移先状態を算出する。
検索成功判別部117は、元の文字列の中に検索パターンに合致する検索文字列が含まれるか否かを判別し、含まれる場合にはその出現位置を出力する。
図3の圧縮テキスト検索装置100の各機能部は、複数のCPUなどの演算装置と、メモリなどの記憶装置によって構成しても良いし、単一の演算装置と1以上の記憶装置上で動作するソフトウェアとして実現しても良い。
図4は、この実施の形態において、圧縮テキスト記憶部103が記憶した圧縮テキストの一例を示す図である。
辞書式圧縮(辞書参照型圧縮方式)によって圧縮された圧縮テキストは、圧縮ブロック列300(符号列の一例)と、圧縮辞書303(置換辞書の一例)とから構成される。
1つの圧縮ブロック302(符号の一例)は、圧縮辞書の1つのエントリの参照番号を含んでいる。
圧縮辞書記憶部113は、圧縮テキストから圧縮辞書の情報を抽出し、記憶している。圧縮辞書は、文字列305(部分文字列の一例)と、文字列の参照番号304(符号の一例)との対応を示す表である。
図4に示す圧縮ブロック列300「1213414」を伸張(復元)する場合、圧縮ブロック列300から1つずつ圧縮ブロック302を取得し、その参照情報を元に圧縮ブロック302を圧縮辞書の文字列305(以後、圧縮ブロックの参照文字列と呼ぶ)と置き換える。
例えば、最初の圧縮ブロック302は、圧縮辞書の1番目のエントリを参照しているため、最初の圧縮ブロックは、1番目のエントリの文字列「abcde」と置き換えることができる。同様に全ての圧縮ブロックについて繰り返すことで、圧縮ブロック列300から伸張されたテキスト「abcdecbabcdebecdabcded」を得ることができる。辞書式圧縮では、このようにテキスト中に出現する文字列を、その文字列よりもビット長が短い圧縮ブロックに置き換えることで、同じ文字列が繰り返し出現するほど高い圧縮率を得ることができる。
ここでは、圧縮辞書を表の形式で記載したが、圧縮ブロックと、圧縮辞書のエントリを1対1に対応付けることができれば、圧縮辞書の実現方式は問わない。すなわち木構造やハッシュを使っても良い。
以後、圧縮ブロックの参照番号を<>で囲んだ数値として表記する。
図5は、この実施の形態において、状態遷移記憶部112が記憶する状態履歴の構造を示す図である。
状態遷移記憶部112は、参照番号401(符号の一例)、状態遷移履歴402、受理位置403の情報を持つ。
参照番号401は、圧縮辞書の参照番号304と1対1に対応付けられている。
状態遷移履歴402は、対応する圧縮辞書の文字列による状態遷移機械の状態遷移の履歴を記憶したものであり、先頭が圧縮辞書の文字列を読む直前の状態、末尾が圧縮辞書の文字列を全て読んだ直後の状態をさす。例えば、1番目のエントリの場合、状態[1]から開始して、文字列「abcde」を1文字読む毎に状態が[2]−[3]−[4]−[5]と遷移し、最後の「e」を読んだ直後に状態[6]になったことを意味する。
受理位置403は、圧縮辞書の文字列の何文字目で、状態遷移機械が受理状態に到達したかを表わしている。例えば、図4で状態[4]が受理状態であったとする。このとき、エントリ1の受理位置403は、圧縮辞書の文字列の3文字目の「c」を読んだ直後に受理状態[4]に到達したことを意味している。
ここでは、受理位置は1番目と3番目のエントリに各1つずつしかないが、1つの状態遷移履歴に2つ以上の受理位置があっても良い。
この実施の形態では、正規表現とテキストの照合には、状態遷移が一意に決定できる状態遷移機械を使用する。このような状態遷移機械の代表的なものにDFAがある。
図6は、この実施の形態において、状態遷移表記憶部106が記憶する状態遷移表200の一例を示す図である。状態遷移表200の左端の列は、現在の状態を表わしている。また、1行目は次に入力された文字を表わしている。それ以外の要素は次の状態(遷移先状態)を表わしている。例えば、現在の状態が[1]で、次の入力文字が「a」であった場合、状態[1]の行、文字「a」の列(2行2列目)の状態[2]が次の状態である。
検索条件に含まれる正規表現を受理する状態遷移機械の状態遷移表200は、圧縮テキストが入力され照合が開始されるまでに、状態遷移表生成部105によって生成される。
例えば、検索条件入力部102が、正規表現「(ab|dec)[ce]e*」を検索条件として入力する(ここで「[ce]」は「(c|e)」の簡略表記である)。この正規表現は、「abc」「abe」「abce」「abee」「decc」「dece」「decce」「decee」・・・などを意味する。図6の状態遷移表200は、この正規表現に基づいて、状態遷移表生成部105が生成するものである。
図7は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
初期化処理(S10)において、検索条件入力部102が入力した検索条件に基づいて、状態遷移表生成部105が検索条件を受理するDFAに対応する状態遷移表を生成し、状態遷移表記憶部106が記憶する。
圧縮テキスト記憶部103が記憶した圧縮テキストから圧縮辞書の情報を抽出し、圧縮辞書記憶部113が記憶する。
状態記憶部111は初期状態(状態番号=1)を記憶する。
状態遷移記憶部112は、記憶する状態遷移履歴を空にする。
現在位置カウンタ115は、圧縮前のテキスト(または元テキストという)長をカウントするため、記憶する現在位置を0に初期化する。
圧縮ブロック取得部108が、圧縮ブロック列の先頭から順に圧縮ブロックを1個取得する(S11)。
条件判断部114は、状態記憶部111が記憶した現在のDFAの状態と、状態遷移記憶部112が記憶した圧縮ブロックに対応する状態遷移履歴(以後、圧縮ブロックの状態遷移履歴という)の先頭の状態とが一致するか判定する(S12)。
すなわち、状態遷移記憶部112が記憶する状態履歴のうち、圧縮ブロック取得部108が取得した圧縮ブロックに対応する状態遷移履歴402を参照し、最初の状態(その圧縮ブロックに対応する部分文字列をDFAに入力する前のDFAの状態)を取得する。取得した最初の状態と、現在のDFAの状態とを比較して、一致するか否かを判断する。
条件判断部114が一致する(第一の条件を満たす)と判断した(S12)場合には、遷移先算出部116が、上記一致した状態遷移履歴を参照し、最後の状態(その圧縮ブロックに対応する部分文字列をDFAに入力した後のDFAの状態)を取得する(遷移先状態)。遷移先算出部116は、取得した遷移先状態に、状態記憶部111が記憶したDFAの状態を更新する(S13)。
遷移先算出部116がDFAの状態を更新した場合、途中で通るはずの状態を飛ばすことになる。その中に受理状態がある場合には、DFAが受理状態になることなく、次へ進んでしまう。
そこで、状態遷移記憶部112は、途中通るはずの状態の中に受理状態があるかどうか、また、ある場合にはその位置がどこか(受理位置403)を記憶している。
そこで、検索成功判別部117は、状態遷移記憶部112が記憶した状態履歴のうち、一致した状態遷移履歴を参照し、受理状態があるかどうかを判別する(S14)。
受理状態がある場合には、検索成功判別部117は、現在位置カウンタ115が記憶した現在の元テキスト長(現在位置)に、状態遷移記憶部112が記憶した状態履歴のうち、一致した状態遷移履歴402に対応する受理位置403を加えて、ヒット位置を求めて出力する(S15)。その場合、照合結果出力部104がCRT表示装置901に表示する。
場合によっては、受理位置が複数ある場合もある。その場合には、その全ての受理位置に対して、出現位置(ヒット位置)を出力する。
逆に、受理状態がない場合には、何も出力しない。
条件判断部114が一致しない(第二の条件を満たす)と判断した(S12)場合には、圧縮ブロックから部分文字列を復元して、DFAに入力し、状態遷移履歴を求める処理を行う(S16)。
最後に、現在位置カウンタ115は、記憶した現在位置に、圧縮ブロックに対応する部分文字列の長さ(文字数)を加え、更新して記憶する(S17)。
以上の処理を圧縮ブロックが尽きるまで繰り返す(S18)。
図8は、図7のS16における処理の詳細の一例を示すフローチャート図である。
状態遷移記憶部112は、状態遷移履歴の一時的な記憶領域Hを用意し、初期状態として、状態記憶部111が記憶したDFAの状態(最初の状態)を記憶する(S161)。あるいは、記憶領域Hを空にし、DFAの状態を記憶領域Hの先頭に追加してもよい。
次に、文字取得部109が、圧縮ブロックの参照文字列(圧縮辞書記憶部113が記憶した圧縮辞書から取得した、参照番号に対応する部分文字列)を参照し、先頭から順に1文字ずつ取得し、DFAに入力する(S162)。
状態遷移機械110は、入力の文字と状態を元に、状態遷移表記憶部106が記憶した状態遷移表を参照して、次の状態を取得する。すなわち、状態記憶部111が記憶したDFAの現在の状態と、文字取得部109が入力した文字とに基づいて、状態遷移表記憶部106が記憶した状態遷移表を参照し、遷移先状態を取得し、状態記憶部111にセットする(更新する)。状態記憶部111は、状態遷移機械110が取得した遷移先状態を、新たに、DFAの状態として記憶する(S163)。
状態遷移記憶部112は、状態記憶部111が記憶したDFAの新たな状態を記憶領域Hの最後に追加する(S164)。
検索成功判別部117は、状態記憶部111が記憶したDFAの新たな状態が受理状態であるかを判別する(S165)。
検索成功判別部117が受理状態であると判別した場合、状態遷移記憶部112は、文字取得部109がDFAに入力した文字数を受理位置として、記憶領域Hに記憶させる(S166)。
更に、現在位置カウンタ115が記憶した現在位置に受理位置を加え、ヒット位置として出力する(S167)。出力されたヒット位置は、照合結果出力部104がCRT表示装置901に表示する。
これを参照文字列を構成する文字が尽きるまで繰り返す(S168)。
最後に、状態遷移記憶部112は、記憶領域Hに記憶した状態遷移履歴及び受理位置を、圧縮ブロックの状態遷移履歴に反映する。すなわち、圧縮ブロックの参照番号に対応する位置に複写して記憶する(S169)。
なお、一時的な記憶領域Hを用意せず、状態遷移記憶部112が、圧縮ブロックの参照番号に対応する位置に、直接、状態遷移履歴及び受理位置を記憶してもよい。そうすれば、記憶領域Hの記憶内容を複写するステップが省けるので好ましい。
また、状態遷移履歴の途中は記憶せず、最初の状態と最後の状態だけを記憶することとしてもよい。そうすれば、記憶領域の節約になるので好ましい。
また、状態遷移記憶部112は、圧縮ブロックの参照番号に対応する状態履歴として、最初の状態に対応して複数の状態履歴を記憶してもよい。そうすれば、状態履歴として記憶した最初の状態と現在の状態とが一致する可能性が高くなり、状態遷移を飛ばすことができるので好ましい。
あるいは、圧縮ブロックの参照番号に対応する状態履歴として、1つの状態履歴しか記憶しないこととしてもよい。そうすれば、状態履歴を記憶する記憶領域の節約になるので好ましい。
その場合、既にその圧縮ブロックの参照番号に対応する状態履歴(最初の状態が異なる)を記憶している場合には、状態履歴を記憶しないこととしてもよい。あるいは、最初の状態が特定の状態(例えば、初期状態)のときだけ、状態履歴を上書きすることとしてもよい。そうすれば、出現頻度の高い状態のときに、最初の状態と現在の状態とが一致する可能性が高くなり、状態遷移を飛ばすことができるので好ましい。
この手順にしたがって、圧縮テキスト検索装置100が実際にどのように動作するか、図4〜図6に示した具体例を使って説明する。
初期化処理(S10)により、各記憶部が記憶内容を初期化する。
状態遷移表記憶部106は、図6に示す状態遷移表200を記憶する。状態遷移表200は、検索条件入力部102が入力した検索条件(正規表現を含む)に基づいて、状態遷移表生成部105が生成したものである。状態遷移表200に対応するDFAにおいて、初期状態は状態番号1に対応する状態であり、受理状態は状態番号4に対応する状態である。これも、状態遷移表記憶部106が記憶している。なお、DFAの初期状態は必ず1つであるが、受理状態は複数あってもよい。
状態記憶部111は初期状態(状態番号=1)を記憶する。
状態遷移記憶部112は、記憶する状態履歴を空にする。
圧縮辞書記憶部113は、圧縮辞書を記憶する。
現在位置カウンタ115は、現在位置として0を記憶する。
圧縮テキスト記憶部103が記憶した圧縮ブロック列300から、圧縮ブロック取得部108が圧縮ブロックを取得する(S11)。最初の圧縮ブロック302は「1」である。
条件判断部114が、状態記憶部111が記憶した現在のDFAの状態と、状態遷移記憶部112が記憶した状態履歴のうち、圧縮ブロックに対応する状態遷移履歴の最初の状態とを比較する(S12)。
しかし、状態履歴は空なので、対応する最初の状態は記憶されていない。
そこで、条件判断部114は、一致しないと判断する(S16へ)。
状態遷移記憶部112は、記憶領域Hに、状態記憶部111が記憶したDFAの現在の状態(=1)を記憶する(S161)。
文字取得部109は、圧縮辞書記憶部113が記憶した圧縮辞書の参照番号1を参照し、部分文字列「abcde」から、最初の文字「a」を取得し、DFAに入力する(S162)。
状態遷移機械110は、DFAの現在の状態が状態番号1、入力した文字が「a」なので、状態遷移表記憶部106が記憶した状態遷移表200を参照し、状態番号2を遷移先状態として取得する。状態記憶部111は、新たなDFAの状態として状態番号2を記憶する(S163)。
状態遷移記憶部112は、状態番号2を記憶領域Hの最後に追加し(S164)、「12」となる。
検索成功判別部117は、状態記憶部111が記憶した状態(状態番号2)が受理状態(状態番号4)ではないと判別する(S165)。したがって、S166及びS167の処理は行わない。
まだ参照文字列を構成する文字が残っているので(S168)、文字取得部109が次の文字「b」を取得し、DFAに入力する(S162)。
状態遷移機械110は、状態番号2、入力文字「b」なので、状態遷移表200より、遷移先状態の番号3を取得し、状態記憶部111が記憶する(S163)。
状態遷移記憶部112が状態番号3を記憶領域Hの最後に追加し(S164)、「123」となる。
検索成功判別部117は、現在の状態(状態番号3)が受理状態(状態番号4)でないと判別する(S165)。
まだ文字が尽きていないので(S168)、文字取得部109は次の文字「c」を取得し、DFAに入力する(S162)。
状態番号3、入力文字「c」なので、新たなDFAの状態は状態番号4になり、記憶領域Hに追加する(S163、S164)。
検索成功判別部117は、現在の状態(4)が受理状態(4)であることを判別する(S165)。
状態遷移記憶部112は、記憶領域Hに、受理位置を記憶する(S166)。ここまでで文字取得部109がDFAに入力した文字数は3なので、受理位置は3となる。
更に、検索成功判別部117は、現在位置カウンタ115が記憶した現在位置(=0)に、受理位置(=3)を加え、ヒット位置(=3)を算出して出力する(S167)。
まだ文字が尽きていないので(S168),次の文字「d」をDFAに入力する(S162)。
状態番号4、入力文字「d」なので、新たなDFAの状態は5になり、記憶される(S163、S164)。
現在の状態(5)は受理状態(4)ではないので、次へ進む(S165)。
同様にして(S168)、次の文字「e」を入力し(S162)、新たな状態6になる(S163、S164)。受理状態ではないので次へ進む(S165)。
参照文字列を構成する文字が尽きたので(S168)、状態遷移記憶部112は、記憶領域Hに記憶した状態遷移履歴及び受理位置を、状態履歴のうち、圧縮ブロックの参照番号1に対応する位置に複写する(S169)。
ここまでで、記憶領域Hには、状態遷移履歴として「123456」が、受理位置として「3」が記憶されていたので、これを参照番号1に対応する位置に記憶する。
現在位置カウンタ115が記憶した現在位置(=0)に、圧縮ブロックに対応する部分文字列の長さ(文字数、=5)を加えて、現在位置を5に更新する(S17)。
圧縮ブロックがまだ尽きていないので(S18)、圧縮ブロック取得部108が次の圧縮ブロック「2」を取得する。
状態遷移記憶部112は、参照番号2に対応する状態遷移履歴を記憶していないので、条件判断部114は、一致しないと判断する(S12)。
さきほどと同様にして状態遷移履歴を求める(S16)。
圧縮辞書の参照番号2に対応する部分文字列は「cb」なので、DFAの状態は、最初の状態が状態番号6、文字「c」を入力して状態番号3、文字「b」を入力して状態番号1へと遷移する。
このなかに受理状態(4)はないので、検索成功判別部117は何も出力しない。
したがって、状態遷移記憶部112は、状態遷移履歴として「631」を、状態履歴の参照番号2に対応する位置に記憶する。受理位置はないので、記憶しない。
現在位置カウンタ115が記憶した現在位置(=5)は、文字数2を加えて、7となる(S17)。
圧縮ブロックがまだ尽きていないので(S18)、圧縮ブロック取得部108が次の圧縮ブロック「1」を取得する。
状態遷移記憶部112は、参照番号1に対応する状態遷移履歴を記憶している。状態記憶部111が記憶したDFAの現在の状態は1である。状態遷移記憶部112が記憶した状態履歴のうち、参照番号1に対応する状態遷移履歴の最初の状態も1で一致する。したがって、条件判断部114は、一致すると判断する(S12)。
そこで、遷移先算出部116は、一致した状態遷移履歴の最後の状態から、遷移先状態の状態番号6を取得し、状態記憶部111に記憶させる(S13)。
検索成功判別部117は、一致した状態遷移履歴に対応して、状態遷移記憶部112が受理位置を記憶しているか否かを判別する(S14)。この場合、受理位置「3」を記憶しているので、現在位置(=7)に受理位置(=3)を加えて、ヒット位置(=10)を算出し、出力する(S15)。
現在位置カウンタ115が記憶した現在位置(=7)は、文字数5を加えて、12となる(S17)。
以下、同様にして、圧縮ブロック取得部108が取得すべき圧縮ブロックがなくなるまで処理を続け(S18)、圧縮ブロックの終端まで処理を終えた時点で検索処理を終了する。
なお、この例においては、条件判断部114が、状態記憶部111が記憶したDFAの現在の状態と、状態遷移記憶部112が記憶した状態遷移履歴のうち圧縮ブロックの参照番号に対応する状態遷移履歴の最初の状態とが一致するかを判定している。
しかし、DFAの状態を更新(遷移)するたびに、状態遷移記憶部112が記憶した状態遷移履歴において対応する状態と比較し、一致する場合には、残りの状態遷移を飛ばす構成としてもよい。
また、一つ状態を更新するたびに比較するのではなく、あらかじめ定めた回数更新した後に比較することとしてもよい。
例えば、参照文字列のi番目(iは自然数)の文字について次の状態を取得したあと、状態遷移履歴のi番目の状態と比較し、一致した場合はS16の処理を終了し、S13に処理が移るように構成しても良い。このとき、一時的な記憶領域Hに記憶した状態遷移履歴の先頭からi番目までを、圧縮ブロックの状態遷移履歴に反映させる。
なお、ステップS16の処理で圧縮ブロックの状態遷移履歴を、常に更新するように構成してもよいし、常に更新しなくても良い。すなわち、最初に取得した状態遷移履歴から更新しないようにしても良いし、状態遷移履歴の先頭の状態がある特定の状態のときのみ、履歴を更新するようにしても良い。
以上のように、この実施の形態によれば、状態記憶部111が記憶したDFAの現在の状態と、取得した圧縮ブロックの状態遷移履歴の先頭の状態が一致しなかった場合には、状態遷移を処理するのに、圧縮ブロックの参照文字列の長さ分のステップ数を要する。一方で、現在の状態と状態遷移履歴の先頭の状態が一致した場合には、状態遷移を1ステップで処理することができる。現在の状態と文字によって状態遷移先が一意に決定される状態遷移機械では、現在の状態が初期状態である場合が多い。そのため、圧縮率が高いほど、すなわち長さが長い文字列が繰り返し出現しているようなテキストほど、状態遷移に要するステップ数を削減することができる。
正規表現に適合する文字列がテキスト中に存在するかの照合自体は、従来から利用されている、正規表現を受理する状態遷移が一意に決定される状態遷移機械を使用している。
このように、この実施の形態の圧縮テキスト検索装置では、正規表現を含んだ検索条件によって、圧縮テキストを高速に検索することができる。
ここで説明した検索装置は、以下の特徴を有する。
辞書式圧縮方式によって圧縮されたテキストを、伸張することなく、正規表現によって検索する検索装置である。
検索には、状態遷移が一意に決定できる状態遷移機械を使用する。
状態遷移機械、状態遷移表生成部、圧縮ブロック取得部、文字取得部、状態記憶部、状態遷移記憶部、圧縮辞書記憶部から構成される。
検索時には、圧縮ブロックが参照する辞書中の文字列毎に、状態遷移機械の状態遷移の履歴を状態遷移記憶部に記憶しておき、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、履歴の末尾の状態まで、1回の状態遷移で遷移させる。
このように、オートマトンの状態遷移を利用して検索を行う文字列検索装置において、圧縮テキストを伸長して元の文字列を復元することなく、圧縮テキストから直接、圧縮ブロックを取得して検索を行うことにより、圧縮テキストを伸長するのにかかる時間を削減し、検索が高速になるという効果を奏する。
取得した圧縮ブロックについて、過去に検索したことがなければ、これを元の部分文字列に復元して、オートマトンの状態遷移を行い、検索する。しかし、過去に検索したことがあり、そのときのオートマトンの状態が同じであれば、同じ状態遷移をもう一度行う必要はない。したがって、過去に検索したときの状態遷移を記憶しておき、オートマトンの状態遷移を1回で済ませることにより、検索が高速になるという効果を奏する。
しかも、オートマトンの状態遷移を1回で済ませるためにわざわざ遷移後の状態を計算するのではなく、実際に検索を行ったときの状態遷移を記憶するのであるから、無駄な計算をすることがない。これにより、検索が高速になるという効果を奏する。
検索に利用するオートマトンとして、決定性有限オートマトンを用いることにより、遷移先状態を一意に算出できるので、バックトラックをする必要がなく、検索が高速になるという効果を奏する。
検索文字列の指定に、正規表現により表現された検索パターンを用いることができるので、検索の自由度が増し、効率的な検索ができるという効果を奏する。
また、一般的に、正規表現を検索できるよう構成されたDFAは、固定文字列を検索できるよう構成されたDFAよりも、複雑で状態の数も多い。このようなDFAに対して、圧縮ブロックの状態遷移を1回で済ませるよう、遷移後の状態を前もって計算しておくことは無駄が多い。しかし、この実施の形態のように、実際に検索したときの状態遷移を履歴として記憶する方式であれば、無駄な計算をすることはないので、検索が高速になるという効果を奏する。
実施の形態2.
実施の形態2を図3、図6、図9〜図10、図46を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZ77方式で圧縮されたテキストを検索する場合について説明する。
図9は、この実施の形態において、圧縮テキスト記憶部103及び状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図である。
圧縮テキスト記憶部103は、圧縮ブロック列300(符号列の一例)を記憶している。図9に示す圧縮ブロック列300は、元の文字列500「abcdecbabcdebecdabcded」に、図46の規則を適用して置換したものである。
状態遷移記憶部112(履歴記憶部の一例)は、DFA(オートマトンの一例)の状態とDFAに入力した文字とを状態履歴として記憶する。
状態遷移記憶部112は状態履歴として、文字と状態を1対1に対応づけて記憶する。
例えば、文字411と状態461とを対応づけて記憶している。以下、文字412と状態462、文字413と状態463も同様に対応づけて記憶している。以下の説明では、状態履歴を、状態と文字を「()」で括って表現するものとする。例えば、図9に示す状態履歴は「(1、a)(2、b)(3、c)(4、d)…」と表現する。
状態遷移記憶部112が記憶する状態履歴は、最初は空である。検索が進むにつれて少ずつ増えていく。
例えば、文字411は、元の文字列500の最初の文字「a」に対応し、この文字をDFAに入力したときに記憶したものである。状態461は、文字411をDFAに入力する前において、状態記憶部111が記憶していたDFAの状態である。
図10は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
初期化処理(S10)において、検索条件入力部102が入力した検索条件(検索パターンの一例)に基づいて、状態遷移表生成部105が検索条件を受理する状態遷移機械(DFA)に対応する状態遷移表を生成し、状態遷移表記憶部106が記憶する。
状態記憶部111は初期状態(状態番号=1)を記憶する。
状態遷移記憶部112は、記憶する状態履歴を空にする。
現在位置カウンタ115は、現在位置として0を記憶する。
圧縮ブロック取得部108(符号取得部の一例)が、圧縮ブロック列(符号列の一例)の先頭から順に圧縮ブロック(符号の一例)を1個取得する(S21)。
圧縮ブロック列300は、図46の規則を適用して置換したものなので、奇数番目の圧縮ブロックは符号985あるいは符号986であり、偶数番目の圧縮ブロックは符号982である。S21では、奇数番目の圧縮ブロックを取得するので、それがダミーポインタ(符号986)でなければ、他の文字列へのポインタの情報を含んでいる。
条件判断部114は、圧縮ブロック取得部108が取得した圧縮ブロックが0かどうかを見て、0でない場合には、他の文字列へのポインタの情報を含んでいると判断する(S22)。
条件判断部114は、含んでいると判断した場合、圧縮ブロックを解読して、他の部分文字列の(最初の文字の)出現位置983(現在位置からの距離)及び部分文字列の長さ984を取得する。更に、状態遷移記憶部112が記憶した状態履歴から、出現位置に対応する(出現位置の文字数分だけ前に記憶した状態履歴の)状態及び文字を取得し(S23)、取得した状態と状態記憶部111が記憶しているDFAの現在の状態とを比較する(S24)。
S24において、条件判断部114が一致する(第一の条件を満たす)と判断した場合、状態遷移記憶部112は、条件判断部114が取得した状態及び文字を状態履歴の最後に追加する(S251)。
遷移先算出部116は、状態履歴から、次の状態及び文字を取得する(S252)。
検索成功判別部117は、遷移先算出部116が取得した状態が受理状態であるか否かを判別し、受理状態である場合には、照合結果出力部104が、ヒット位置として現在位置カウンタ115が記憶する現在位置を出力する(S253)。
現在位置カウンタ115が記憶する現在位置を1つ増やし、部分文字列の残りの長さを1つ減らす(S254)。
部分文字列の残りがまだあれば、S251から繰り返す(S255)。
S251〜S255の処理が終わったら、遷移先算出部116は、S252で取得した状態に、状態記憶部111が記憶したDFAの状態を更新する(S256)。
S24において、条件判断部114が一致しない(第二の条件を満たす)と判断した場合、状態遷移記憶部112は、状態記憶部111が記憶した状態及び条件判断部114が取得した文字を、状態履歴の最後に追加する(S261)。
文字取得部109(文字列復元部の一例)は、条件判断部114が取得した文字を取得し、DFAに入力する。状態遷移機械110は、文字取得部109が入力した文字と、状態記憶部111が記憶したDFAの現在の状態とに基づいて、状態遷移表記憶部106が記憶した状態遷移表を参照し、遷移先状態を取得する。状態遷移機械110は、取得した遷移先状態を、状態記憶部111に記憶させ、現在の状態を更新する(S262)。
検索成功判別部117は、更新されたDFAの現在の状態が受理状態であるか否かを判別し、受理状態である場合には、照合結果出力部104が、ヒット位置として現在位置カウンタ115が記憶する現在位置を出力する(S263)。
現在位置カウンタ115が記憶する現在位置を1つ増やし、部分文字列の残りの長さを1つ減らす(S264)。
部分文字列の残りがまだあれば、S23から繰り返す(S265)。
繰り返し処理において、条件判断部114は、再び、状態が一致するかを判定している(S24)。部分文字列を入力する前の状態が、状態履歴と異なっていても、何文字かDFAに入力した後で、一致する場合があるからである。
これにより、最初の状態が一致しなかった場合でも、途中で状態が一致した場合には、それ以降の状態遷移を1回で済ませることができ、検索が高速に行えるという効果を奏する。
しかし、条件判断が増えることによる処理速度の低下を防ぐため、状態の比較は最初だけ行うように構成してもよい。
あるいは、毎回比較するのではなく、何回かに一回比較する構成としてもよい。
S22で、条件判断部114が他の文字列へのポインタの情報を含んでいないと判断した場合、あるいは、S23以下の処理が終わった場合、圧縮ブロック取得部108は、圧縮ブロック列300から次の圧縮ブロックを取得する(S27)。
これは、偶数番目の圧縮ブロックなので、文字を表現するビット列の符号982である。
したがって、条件判断部114は、無条件にこれが他の文字列へのポインタの情報を含むものではないと判断する。
文字取得部109は、圧縮ブロック取得部108が取得した圧縮ブロックに対応する文字を取得し、状態遷移記憶部112は、状態記憶部111が記憶したDFAの現在の状態及び文字取得部109が取得した文字を、状態履歴の最後に追加する(S281)。
文字取得部109が、取得した文字をDFAに入力し、状態遷移機械110が遷移先状態を算出して、状態記憶部111が記憶したDFAの現在の状態を更新する(S282)。
検索成功判別部117は、更新されたDFAの現在の状態が受理状態であるか否かを判別し、受理状態である場合には、照合結果出力部104が、ヒット位置として現在位置カウンタ115が記憶する現在位置を出力する(S283)。
現在位置カウンタ115が記憶する現在位置を1つ増やす(S284)。
まだ圧縮ブロック列300に圧縮ブロックが残っていれば、S21から処理を繰り返す(S29)。
以上説明した動作を、図6及び図9に示した具体例を使って、詳しく説明する。
初期化処理(S10)により、各記憶部が記憶内容を初期化する。
状態遷移表記憶部106は、図6に示す状態遷移表200を記憶する。状態遷移表200は、検索条件入力部102が入力した検索条件(正規表現を含む)に基づいて、状態遷移表生成部105が生成したものである。状態遷移表200に対応するDFAにおいて、初期状態は状態番号1に対応する状態であり、受理状態は状態番号4に対応する状態である。これも、状態遷移表記憶部106が記憶している。なお、DFAの初期状態は必ず1つであるが、受理状態は複数あってもよい。
状態記憶部111は初期状態(状態番号=1)を記憶する。
状態遷移記憶部112は、記憶する状態履歴を空にする。
現在位置カウンタ115は、現在位置として「1」を記憶する。
圧縮テキスト記憶部103が記憶した圧縮ブロック列300から、圧縮ブロック取得部108が圧縮ブロックを取得する(S21)。最初の圧縮ブロック311は「0、0」である。
条件判断部114が、取得した圧縮ブロックに他の部分文字列へのポインタの情報が含まれていないと判断し(S21)、S27へ進む。
圧縮ブロック取得部108が次の圧縮ブロック312「a」を取得する(S27)。
状態遷移記憶部112は、状態記憶部111が記憶したDFAの現在の状態「1」及び文字「a」を、状態履歴の最後に追加する(状態461及び文字411)(S27)。
文字取得部109がDFAに文字「a」を入力し、DFAの状態は「2」になる(S282)。受理状態ではないので、出力はせず(S283)、現在位置が「2」になる(S284)。次の圧縮ブロックへ進む(S29)。
次に取得した圧縮ブロック(S21)は「0、0」なので(S22)、S27へ進む。
次に取得した圧縮ブロック(S27)は「b」なので、状態「2」と文字「b」を状態履歴に追加(状態462及び文字412)し(S281)、DFAに文字「b」を入力すると、DFAの状態は「3」になる(S282)。受理状態か判別し(S283)、現在位置が「3」になる(S284)。次へ進む(S29)。
次に取得した圧縮ブロック(S21)は「0、0」なので(S22)、S27へ進む。
次に取得した圧縮ブロック(S27)は「c」なので、状態「3」と文字「c」を状態履歴に追加(状態463及び文字413)し(S281)、DFAに文字「c」を入力すると、DFAの状態は「4」になる(S282)。受理状態なので、ヒット位置(=3)を出力し(S283)、現在位置が「4」になる(S284)。次へ進む(S29)。
次に取得した圧縮ブロック(S21)は「0、0」なので(S22)、S27へ進む。
次に取得した圧縮ブロック(S27)は「d」なので、状態「4」と文字「d」を状態履歴に追加し(S281)、DFAに文字「d」を入力すると、DFAの状態が「5」になる(S282)。受理状態か判別し(S283)、現在位置が「5」になる(S284)。次へ進む(S29)。
次に取得した圧縮ブロック(S21)は「0、0」なので(S22)、S27へ進む。
次に取得した圧縮ブロック(S27)は「e」なので、状態「5」と文字「e」を状態履歴に追加し(S281)、DFAに文字「e」を入力すると、DFAの状態が「6」になる(S282)。受理状態か判別し(S283)、現在位置が「6」になる(S284)。次へ進む(S29)。
この時点で、状態履歴は「(1、a)(2、b)(3、c)(4、d)(5、e)」となる。
次に取得した圧縮ブロック「3、1」(S21)はポインタなので(S22)、出現位置「3」、長さ「1」を取得し、3文字前(出現位置=3)の状態463「3」及び文字413「c」を取得する(S23)。
取得した状態「3」と、状態記憶部111が記憶したDFAの現在の状態(=6)とを比較する(S24)。
一致しないので、現在の状態「6」と取得した文字「c」を状態履歴に追加する(S261)。DFAに文字「c」を入力して、DFAの状態が「3」になる(S262)。受理状態か判別し(S263)、現在位置が「7」になる(S264)。長さ文字数分の入力が終わったので(S265)、S27へ進む。
次に取得した圧縮ブロック(S27)は「b」なので、状態「3」と文字「b」を状態履歴に追加し(S281)、DFAに文字「b」を入力すると、DFAの状態が「1」になる(S282)。受理状態か判別し(S283)、現在位置が「8」になる(S284)。次へ進む(S29)。
この時点で、状態履歴は「(1、a)(2、b)(3、c)(4、d)(5、e)(6、c)(3、b)」となる。
次に取得した圧縮ブロック「7、5」(S21)はポインタなので(S22)、出現位置「7」、長さ「5」を取得し、7文字前(出現位置=7)の状態461「1」及び文字411「a」を取得する(S23)。
取得した状態「1」と、状態記憶部111が記憶したDFAの現在の状態(=1)とを比較する(S24)。
一致するので、取得した状態「1」と文字「a」を状態履歴に追加する(状態468及び文字418)(S251)。状態履歴から7文字前の状態462「2」及び文字412「b」を取得し(S252)、取得した状態「2」が受理状態か判別する(S253)。現在位置は「9」になり(S254)、繰り返しは残り4文字となる(S255)。
取得した状態「2」と文字「b」を状態履歴に追加する(状態469及び文字419)(S251)。状態履歴から7文字前の状態463「3」及び文字413「c」を取得し(S252)、取得した状態「3」が受理状態か判別する(S253)。現在位置は「10」になり(S254)、繰り返しは残り3文字となる(S255)。
取得した状態「3」と文字「c」を状態履歴に追加する(状態470及び文字420)(S251)。状態履歴から7文字前の状態「4」及び文字「d」を取得し(S252)、取得した状態「4」が受理状態なので、ヒット位置「10」を出力する(S253)。現在位置は「11」になり(S254)、繰り返しは残り2文字となる(S255)。
取得した状態「4」と文字「d」を状態履歴に追加する(S251)。状態履歴から7文字前の状態「5」及び文字「e」を取得し(S252)、取得した状態「5」が受理状態か判別する(S253)。現在位置は「12」になり(S254)、繰り返しは残り1文字となる(S255)。
取得した状態「5」と文字「e」を状態履歴に追加する(S251)。状態履歴から7文字前の状態「6」及び文字「c」を取得し(S252)、取得した状態「6」が受理状態か判別する(S253)。現在位置は「13」になり(S254)、繰り返しを終了する(S255)。DFAの現在の状態は「6」になる(S256)。
次に取得した圧縮ブロック(S27)は「b」なので、状態「6」と文字「b」を状態履歴に追加し(S281)、DFAに文字「b」を入力すると、DFAの状態が「1」になる(S282)。受理状態か判別し(S283)、現在位置が「14」になる(S284)。次へ進む(S29)。
次に取得した圧縮ブロック「8、2」(S21)はポインタなので(S22)、出現位置「8」、長さ「2」を取得し、8文字前(出現位置=8)の状態「6」及び文字「c」を取得する(S23)。
取得した状態「3」と、状態記憶部111が記憶したDFAの現在の状態(=1)とを比較する(S24)。
一致しないので、現在の状態「1」と取得した文字「c」を状態履歴に追加する(S261)。DFAに文字「c」を入力して、DFAの状態が「1」になる(S262)。受理状態か判別し(S263)、現在位置が「15」になる(S264)。繰り返しは残り1文字となる(S265)。
8文字前の状態「3」及び文字「b」を取得する(S23)。
取得した状態「3」と、状態記憶部111が記憶したDFAの現在の状態(=1)とを比較する(S24)。
一致しないので、現在の状態「1」と取得した文字「b」を状態履歴に追加する(S261)。DFAに文字「b」を入力して、DFAの状態が「1」になる(S262)。受理状態か判別し(S263)、現在位置が「16」になる(S264)。繰り返しを終了する(S265)。
次に取得した圧縮ブロック(S27)は「d」なので、状態「1」と文字「d」を状態履歴に追加し(S281)、DFAに文字「d」を入力すると、DFAの状態が「5」になる(S282)。受理状態か判別し(S283)、現在位置が「17」になる(S284)。次へ進む(S29)。
次に取得した圧縮ブロック「9、5」(S21)はポインタなので(S22)、出現位置「9」、長さ「5」を取得し、9文字前(出現位置=9)の状態「1」及び文字「a」を取得する(S23)。
取得した状態「1」と、状態記憶部111が記憶したDFAの現在の状態(=5)とを比較する(S24)。
一致しないので、現在の状態「5」と取得した文字「a」を状態履歴に追加する(S261)。DFAに文字「a」を入力して、DFAの状態が「2」になる(S262)。受理状態か判別し(S263)、現在位置が「15」になる(S264)。繰り返しは残り4文字となる(S265)。
9文字前の状態「2」及び文字「b」を取得する(S23)。
取得した状態「2」と、状態記憶部111が記憶したDFAの現在の状態(=2)とを比較する(S24)。
一致するので、取得した状態「2」と文字「b」を状態履歴に追加する(S251)。状態履歴から9文字前の状態「3」及び文字「c」を取得し(S252)、取得した状態「3」が受理状態か判別する(S253)。現在位置は「16」になり(S254)、繰り返しは残り3文字となる(S255)。
以下、同様の処理の繰り返しなので、説明は省略する。
なお、状態遷移記憶部112は状態履歴をすべて記憶しておく必要はない。例えば、出現位置983を表すビット列が8ビットのビット長である場合、最大255文字前までしか参照できない。したがって、256文字分以上前の状態履歴を記憶していても使われることはないので、古いものから順に消去してしまってよい。
このように、LZ77方式で圧縮されたテキストを検索する場合において、一般にLZ77方式の圧縮テキストを復元するのに使用されるスライド窓の機能を拡張し、そのときのDFAの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
実施の形態3.
実施の形態30を図3、図11〜図13を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZ77方式で圧縮されたテキストを検索する別の場合について説明する。
図11は、LZ77形式による圧縮テキストの構造を示す図である。LZ77形式では、図4のような固定の圧縮辞書を持つ代わりに、固定長のスライド窓と呼ばれる自らのテキストの一部を辞書として利用する。スライド窓の長さは実装方式に依存する。LZ77形式の圧縮テキストは圧縮ブロック列300のみから構成される。各圧縮ブロック802は、スライド窓803中の一致する文字列の位置、一致文字列長、最初の不一致文字の情報を持っている。例えば、図11の例では、圧縮ブロック804は、一致する文字列の位置=1、一致文字列長=5、最初の不一致文字=「b」である。これは、圧縮ブロック804がスライド窓803(この例では、スライド窓の長さを8としている)の1番目の文字から5文字目までの文字列に、文字「b」を加えた文字列「abcdeb」と等しいことを意味する。ここで、スライド窓803の下に付加した数値は、スライド窓中の文字位置を明確にするために便宜上付加したものである。以降、スライド窓の一致する文字列の位置から始まり、一致文字列長の長さを持つ文字列を、圧縮ブロックの参照文字列と呼ぶこととする。また、圧縮ブロックの一致する文字列の位置を参照位置、一致文字列の長さを参照文字列長とも呼ぶこととする。
これまでに、LZ77形式のスライド窓の参照を高速化するために、様々な方法が提案されているが、この実施の形態では、上記のスライド窓の機能を備えていれば、その実現方式は問わない。
図12は、この実施の形態における、圧縮辞書記憶部113(辞書記憶部の一例)と状態遷移記憶部112(履歴記憶部の一例)の記憶する情報を図示したものである。圧縮辞書記憶部113は、スライド窓210を記憶している。状態遷移記憶部112は、スライド窓長+1の状態遷移を記憶する状態遷移履歴220と、受理位置230を記憶している。受理位置230は、状態遷移履歴220の中で、受理状態の位置を記憶している。圧縮ブロックの参照位置がnのとき、状態遷移履歴の先頭の状態からn番目の状態を、状態遷移履歴の参照位置と呼ぶ。
図13は、この実施の形態の圧縮テキスト検索装置100における検索処理の流れ図である。初期状態として、検索条件入力部102が入力した検索条件から状態遷移表生成部105によって状態遷移表が生成され、状態遷移表記憶部106が記憶されているものとする。また、状態記憶部111には初期状態(=1)がセットされているものとする。圧縮辞書記憶部113と、状態遷移記憶部112の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを0に初期化する。
最初に、ステップS701で、圧縮ブロック取得部108により、圧縮ブロック列の先頭から順に圧縮ブロックを1個ずつ取得する。ステップS702で、状態記憶部111が記憶したDFAの現在の状態と、状態遷移履歴の参照位置の状態が一致するか判定する。状態が一致した場合は(YES)、ステップS703で状態遷移履歴の先頭から(参照位置+参照文字列長)番目の状態と、最初の不一致文字から次の状態遷移を取得し、現在の状態にセットする。ステップS704で、状態遷移履歴の参照位置から(参照位置+参照文字列長)番目の位置の間に受理状態があるか判定する。受理状態がある場合は(YES)、ステップS705でヒット位置を計算して出力する。ヒット位置は現在の元テキスト長+受理位置となる。現在の状態が受理状態である場合もヒット位置として、元テキスト長+参照文字列長を出力する。受理状態が無い場合は(NO)、何もせずにステップS706へ進む。ステップS706では、スライド窓と状態遷移履歴を更新する。
スライド窓の更新では、まず、スライド窓中の文字列を、(参照文字列長+1)文字分前へシフトする。次にスライド窓の最後の文字の後ろに参照文字列と最初の不一致文字を追加する。同様に、状態遷移履歴も、(参照文字列長+1)文字分前へシフトし、末尾に参照位置から参照文字列長分の状態遷移履歴を追加する。状態遷移履歴にはさらに現在の状態を追加する。
ステップS707では、圧縮ブロック列の終端に達しているか判定し、達していない場合は(NO)、ステップS701で次の圧縮ブロック列を取得する。達していた場合は(YES)、検索処理を終了する。このステップS707で、元テキスト長に参照文字列長+1を加える。
ステップS702で、現在の状態と、状態遷移履歴の参照位置の状態が一致しない場合は(NO)、ステップS708で参照文字列に最初の不一致文字を加えた文字列に対して、状態遷移の履歴を求める。すなわち、図7の処理の流れと同様に、参照文字列に不一致文字を加えた文字列の先頭から順に1文字ずつ取得しながら、状態遷移機械によって次の状態を取得する。ステップS708の処理が終了したら、ステップS706でスライド窓と状態遷移履歴を更新する。すなわち、スライド窓中の文字列を、(参照文字列長+1)文字分前へシフトし、スライド窓の最後の文字の後ろに参照文字列と最初の不一致文字を追加する。同様に、状態遷移履歴も、同様に(参照文字列長+1)文字分前へシフトし、末尾にステップS708で取得した状態遷移の履歴をセットする。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、2回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZ77形式で圧縮された圧縮テキストを高速に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZ77形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長+1の長さの状態遷移履歴を記憶する。
LZ77形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで状態を1回の状態遷移で遷移させ、さらに不一致文字により状態を遷移させる。
実施の形態4.
実施の形態4を図3、図14、図15、図44を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZSS方式で圧縮されたテキストを検索する場合について説明する。
図14は、この実施の形態において、圧縮テキスト記憶部103及び状態遷移記憶部112の記憶内容の一例を示す図である。
圧縮テキスト記憶部103は、圧縮ブロック列300(符号列の一例)を記憶する。図14に示す圧縮ブロック列300は、元の文字列500「abcdecbabcdebecdabcded」に、図44の規則を適用して置換したものである。
状態遷移記憶部112(履歴記憶部の一例)は、DFA(オートマトンの一例)の状態とDFAに入力した文字とを状態履歴として記憶する。
この実施の形態では、実施の形態2と異なり、文字に対応する状態を複数記憶できる。
例えば、文字431は状態481と対応づけられている。また、文字438は状態488及び状態448と対応づけられている。具体的な実現方法としては、表形式、リスト形式、ポインタ形式等の構造が考えられるが、他の実現方法でもよい。
また、実施の形態2と同様に、文字と状態を1対1対応として記憶することとしてもよい。
図15は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
図15は、実施の形態2で説明した図10とほぼ同じなので、異なる部分のみ説明する。
LZSS方式は、LZ77方式と符号化の方式が異なっている。したがって、制御の流れも、それに対応する部分が異なっている。
すなわち、圧縮ブロック取得部108は、まず圧縮ブロック列300から1ビット(フラグ981)を取得し、圧縮ブロックの長さを判別する。フラグ981が「1」の場合、図44の規則1であるから、続く8ビット(ビット列982)を取得する。フラグ981が「0」の場合、図44の規則2であるから、続く13ビット(出現位置983及び長さ984)を取得する(S21)。
条件判断部114は、フラグ981が「1」の場合、他の部分文字列へのポインタの情報を含まないと判断し(S22)、文字取得部109が圧縮ブロックから文字を取得し、状態遷移記憶部112が、現在の状態と取得した文字とを状態履歴の最後に追加する(S281)。
条件判断部114は、フラグ981が「0」の場合、他の部分文字列へのポインタの情報を含むと判断し(S22)、圧縮ブロックから、他の部分文字列の(最初の文字の)出現位置983(現在位置からの距離)及び部分文字列の長さ984を取得する。更に、状態遷移記憶部112が記憶した状態履歴から、出現位置に対応する状態及び文字を取得し、状態記憶部111が記憶しているDFAの現在の状態と比較する(S24)。
この実施の形態では、もう一つ実施の形態2と異なる部分がある。この実施の形態では、文字に対応して複数の状態を記憶できるよう、状態遷移記憶部112を構成している点である。
S24において、条件判断部114は、取得した状態が複数ある場合に、そのなかにDFAの現在の状態と一致するものがあるかどうかを判別する(S24)。
一致するものがあった場合、状態遷移記憶部112は、一致しなかった状態も含めて、取得した状態すべてと文字とを、状態履歴の最後に追加する(S251)。
遷移先算出部116は、次の状態及び文字を取得する(S252)。
検索成功判別部117は、取得した状態のうち、一致した状態に対応する状態が受理状態かを判別する(S253)。
例えば、図14において、状態遷移記憶部112は、文字438「b」に対応して、状態488「4」及び状態448「2」の2つの状態を記憶している。これに対して、現在の状態が「2」だったとする。
S23において、条件判断部114が状態「4」及び「2」、文字「b」を取得する。
S24において、条件判断部114は、取得した状態(4、2)に現在の状態(=2)が含まれているので、一致すると判断する。
S251において、状態遷移記憶部112は、取得した状態「4」及び「2」すべてと、文字「b」とを、状態履歴の最後に追加する。
S252において、遷移先算出部116は、次の状態495「1」及び状態475「3」と、文字445「c」とを取得する。
ここで、次の状態489「1」は、状態488「4」に対応しており、DFAの状態が状態488「4」だったときに文字「b」を入力して遷移した状態を示している。また、次の状態449「3」は、状態448「2」に対応しており、DFAの状態が状態448「2」だったときに文字「b」を入力して遷移した状態を示している。図15では、この対応関係を矢印を使って表現しているが、状態遷移記憶部112はこの関係を、例えば、ポインタを用いて記憶する。
S253において、検索成功判別部117は、取得した2つの状態のうち、一致した状態448に対応する状態449「3」が受理状態か否かを判別する。
同様に、S256において、遷移先算出部116が算出する遷移先状態も、取得した状態が複数あるときは、一致した状態に対応する状態となり、状態記憶部111は、その状態を記憶する(S256)。
S24において、取得した状態の中にDFAの現在の状態と一致するものがなかった場合、条件判断部114は一致しないと判断する(S24)。
状態遷移記憶部112は、現在の状態及び取得した状態と、取得した文字とを状態履歴の最後に追加する(S261)。
したがって、状態が一致しなかった場合、1つの文字に対応して記憶する状態が1つ増えることになる。
自己参照型の圧縮技術において、元の文字列に同じ部分文字列が何回も出てくる場合、現在位置から近い方の部分文字列を参照することがある。出現位置を符号化する際のビット数の制限により、遠い方を参照することができないからである。また、あまり遠い部分文字列を参照することとすると、圧縮の際に時間がかかり過ぎ、また復元の際に記憶領域を消費し過ぎて、実用に耐えない場合があるからである。
同じ部分文字列が何回も出現する場合において、状態を1つしか記憶しなければ、状態が一致する可能性は低い。しかし、状態を複数記憶できることとすれば、その分状態が一致する可能性が高くなる。これにより、検索が更に高速に行えるという効果を奏する。
以上説明した動作を、図6及び図14に示す具体例を使って、詳しく説明する。
圧縮ブロック334まで処理が終わり、状態遷移記憶部112は、状態履歴として状態481〜484及び文字431〜434を記憶している。
状態記憶部111は、DFAの現在の状態として「5」を記憶している。
次の圧縮ブロック335を取得する(S21)。フラグ981が「0」なので、ポインタである(S22)。出現位置「4」、長さ「2」なので、4文字前の状態481「1」及び文字431「a」を取得し(S23)、取得した状態「1」と現在の状態「5」とを比較する(S24)。
一致しないので、現在の状態「5」及び取得した状態「1」と文字「a」とを状態履歴の最後に追加する(状態485、445、文字435)(S261)。
DFAに文字「a」を入力し、現在の状態が「2」に遷移する(S262)。
受理状態か判別し(S263)、現在位置を進める(S264)。繰り返しは残り1文字になる(S265)。
4文字前の状態482「2」及び文字432「b」を取得し、取得した状態「2」と現在の状態「2」とを比較する(S24)。
一致するので、取得した状態「2」と文字「a」とを状態履歴の最後に追加する(状態486及び文字436)(S251)。
このとき、前の状態が「1」でも「5」でも同じ状態「2」になるので、状態486は、状態485と状態445の両方に対応づけられる(図14の矢印)。
状態履歴から、4文字前の状態483「3」及び文字433「c」を取得し(S252)、受理状態か判別し(S253)、現在位置を進める(S254)。繰り返しは終了する(S255)。
DFAの状態を、取得した状態「3」に更新し(S256)、次の圧縮ブロックへ進む(S29)。
次の圧縮ブロック336を取得する(S21)。フラグ981が「1」なので、文字である(S22)。文字「e」を取得し、現在の状態「3」及び文字「e」を状態履歴に追加する(状態487及び文字437)(S281)。文字「e」をDFAに入力すると、DFAの状態は「4」になる(S282)。受理状態か判別し(S283)、現在位置を進める(S284)。次の圧縮ブロックへ進む(S29)。
次の圧縮ブロック337を取得する(S21)。フラグ981が「0」なので、ポインタである(S22)。出現位置「6」、長さ「7」なので、6文字前の状態482「2」及び文字432「b」を取得し(S23)、取得した状態「2」と現在の状態「4」とを比較する(S24)。
一致しないので、現在の状態「4」及び取得した状態「2」と文字「b」とを状態履歴に追加する(状態488、448、文字438)(S261)。
DFAに文字「b」を入力し、現在の状態が「1」に遷移する(S262)。
受理状態か判別し(S263)、現在位置を進める(S264)。繰り返しは残り6文字になる(S265)。
6文字前の状態483「3」及び文字433「c」を取得し(S23)、取得した状態「3」と現在の状態「1」とを比較する(S24)。
一致しないので、現在の状態「1」及び取得した状態「3」と文字「c」とを状態履歴に追加する(状態489、449、文字439)(S261)。
このとき、状態489は状態488と対応づける。また、状態449は状態448と対応づける。
DFAに文字「c」を入力し、現在の状態が「1」に遷移する(S262)。
受理状態か判別し(S263)、現在位置を進める(S264)。繰り返しは残り5文字になる(S265)。
6文字前の状態484「4」及び文字434「d」を取得し(S23)、取得した状態「4」と現在の状態「1」とを比較する(S24)。
一致しないので、現在の状態「1」及び取得した状態「4」と文字「d」とを状態履歴に追加する(状態490、450、文字440)(S261)。
このとき、状態490は状態489と対応づける。また、状態450は状態449と対応づける。
DFAに文字「d」を入力し、現在の状態が「5」に遷移する(S262)。
受理状態か判別し(S263)、現在位置を進める(S264)。繰り返しは残り4文字になる(S265)。
6文字前の状態485「5」、状態445「1」及び文字435「a」を取得し(S23)、取得した状態と現在の状態「1」とを比較する(S24)。
状態445と一致するので、取得した状態「1」及び「5」と文字「a」とを状態履歴に追加する(状態491、451、文字441)(S251)。
このとき、状態491は状態490及び状態450と対応づける。どちらの状態からも同じ状態「1」に遷移するからである。また、状態451は、前の状態と対応づけない。
6文字前の状態486「2」及び文字435「b」を取得する(S252)。
取得した状態が受理状態か判別し(S253)、現在位置を進める(S254)。繰り返しは残り3文字になる(S265)。
以下、同様の処理の繰り返しなので、説明は省略する。
このように、LZSS方式で圧縮されたテキストを検索する場合において、一般にLZSS方式の圧縮テキストを復元するのに使用されるスライド窓の機能を拡張し、そのときのDFAの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
また、そのときのDFAの状態だけでなく、それが参照している過去に検索したときの状態遷移を合わせて記憶することにより、直接参照していない場合でも、過去の状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が更に高速に行えるという効果を奏する。
なお、このように、1つの文字に対して複数の状態を記憶できるようにした構成は、LZSS方式の圧縮テキストに限るものではなく、LZ77方式の圧縮テキストを検索する場合にも用いることができる。
更に、自己参照型の圧縮方式には、この他にも様々なものがある。例えば、上述したLZ77方式あるいはLZSS方式の符号列を、さらにハフマン符号化(静的あるいは動的)によって置換し、更に全体のビット長を短くしたもの等がある。
ここで説明した実施の形態は、それらの圧縮方式によって圧縮されたテキストにも適用できる。
実施の形態5.
実施の形態5を図3、図13、図16を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZSS方式で圧縮されたテキストを検索する別の場合について説明する。
図16は、LZSS形式による圧縮テキストの構造を示す図である。LZSS形式は、LZ77形式の圧縮ブロックの冗長なデータを削除することにより、より圧縮効率を高めることを目的とした圧縮形式である。LZSS形式では、LZ77形式と同様に、図4のような固定の圧縮辞書303を持つ代わりに、固定長のスライド窓と呼ばれる自らのテキストの一部を辞書として利用する。LZSS形式の圧縮テキストは圧縮ブロック列300のみから構成される。LZ77形式では、スライド窓に参照文字列が無い場合でも、圧縮ブロックには参照位置=0、参照文字列長=0という冗長な情報が含まれている。LZSS形式では、圧縮ブロックの先頭に1ビットのフラグを設けることで冗長なデータを削除する。スライド窓に参照文字列が無い場合は、圧縮ブロック1002のように先頭のビットを0とし、次に不一致文字がセットされる。参照文字列が存在する場合は、圧縮ブロック1004のように先頭のビットを1とし、次に参照位置と参照文字列長がセットされる。
これまでに、LZSS形式のスライド窓の参照を高速化するために、様々な方法が提案されているが、この実施の形態の圧縮テキスト検索装置では、上記のスライド窓の機能を備えていれば、その実現方式は問わない。
この実施の形態の圧縮テキスト検索装置100における検索処理の流れは、図13に示したものと同様である。初期状態として、検索条件入力部102が入力した検索条件から状態遷移表生成部105が状態遷移表を生成し、状態遷移表記憶部106が記憶しているものとする。また、状態記憶部111には初期状態がセットされているものとする。圧縮辞書記憶部113と、状態遷移記憶部112の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを0に初期化する。
実施の形態3との主要な差異は、ステップS702とステップS706である。最初に、ステップS701で、圧縮ブロック列の先頭から順に圧縮ブロックを1個ずつ取得する。ステップS702で、圧縮ブロックの先頭のビットを判定する。さらに、圧縮ブロックの先頭のビットが1であった場合は、現在の状態と、状態遷移履歴の参照位置の状態が一致するか判定する。状態が一致した場合は(YES)、ステップS703で状態遷移履歴の先頭から(参照位置+参照文字列長)番目の状態を現在の状態にセットする。ステップS704で、状態遷移履歴の参照位置から(参照位置+参照文字列長)番目の状態が受理状態であるか判定する。受理状態である場合は(YES)、ステップS705でヒット位置を計算して出力し、ステップS706へ進む。受理状態が無い場合は(NO)、何もせずにステップS706へ進む。ステップS706では、スライド窓と状態遷移履歴を更新する。
スライド窓の更新では、まず、スライド窓中の文字列を、参照文字列長分前へシフトする。次にスライド窓の最後の文字の後ろに参照文字列を追加する。同様に、状態遷移履歴も、参照文字列長分前へシフトし、末尾に参照位置から参照文字列長分の状態遷移履歴を追加する。
ステップS707では、圧縮ブロック列の終端に達しているか判定し、達していない場合は(NO)、ステップS701で次の圧縮ブロック列を取得する。達していた場合は(YES)、検索処理を終了する。ステップS707で、元テキスト長に、圧縮ブロックの先頭のビットが0の場合は1を、先頭のビットが1の場合は参照文字列長を加える。
ステップS702で、圧縮ブロックの先頭の1ビットが0であるか、現在の状態と状態遷移履歴の参照位置の状態が一致しない場合は(NO)、ステップS708で不一致文字または参照文字列に対して状態遷移の履歴を求める。すなわち、図5の処理の流れと同様に、文字列の先頭から順に1文字ずつ取得しながら、状態遷移機械によって次の状態を取得する。ステップS708の処理が終了したら、ステップ706でスライド窓と状態遷移履歴を更新する。すなわち、スライド窓中の文字列を、1文字または参照文字列長分前へシフトする。次にスライド窓の最後の文字の後ろに不一致文字または参照文字列を追加する。同様に、状態遷移履歴も、1文字または参照文字列長分前へシフトし、末尾にステップS708で取得した状態遷移の履歴を追加する。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長に比例したステップ数要する状態遷移の処理を、1回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZSS形式で圧縮された圧縮テキストを高速に検索することができる。
ここで示したLZSS形式以外にも、LZB(Lempel−Ziv−Bell)形式やLZBW(Lempel−Ziv−Bender−Wolf)形式など、LZ77形式から派生した圧縮形式で圧縮されたテキストを、この実施の形態の圧縮テキスト検索装置によって同様に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZSS形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長+1の長さの状態遷移履歴を記憶する。
LZSS形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで1回の状態遷移で状態を遷移させる。
実施の形態6.
実施の形態6を図3、図6、図17、図18、図48を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZ78方式で圧縮されたテキストを検索する場合について説明する。
図17は、この実施の形態において、圧縮テキスト記憶部103及び圧縮辞書記憶部113(辞書記憶部の一例)及び状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図である。
圧縮テキスト記憶部103は、圧縮ブロック列300を記憶している。圧縮ブロック列300は、元の文字列500「aababcdecabcdebabcdecc」に、図48の規則を適用して置換したものである。
状態遷移記憶部112は、辞書の「参照番号」を行とし、「最初の状態」を列とする表の形で状態履歴を記憶する。しかし、このような表の形ではなく、例えばリスト形式で記憶してもよい。
状態履歴としては「遷移先状態」及び「受理位置」を記憶する。状態履歴は最初は空であり、検索が進むにつれて、埋まっていく。
圧縮辞書記憶部113は、圧縮ブロック列300から抽出した圧縮辞書(置換辞書の一例)を記憶する。圧縮辞書は、辞書の「参照番号」と、前方参照番号及び接尾文字(後方文字列の一例)とを対応づけている。ここで「参照番号」に対応する部分文字列は、前方参照番号に対応する部分文字列(前方文字列の一例)の後に接尾文字を付けたものである。また、前方参照番号が「0」の場合は、対応する部分文字列は、接尾文字1文字からなる文字列である。
例えば、参照番号1は、部分文字列「a」に対応する。参照番号2は、参照番号1に対応する部分文字列「a」に接尾文字「b」を付けたもの(「ab」)に対応する。参照番号3は、「ab」+「c」で、「abc」に対応する。
圧縮辞書は最初は空であり、検索が進むにつれて、エントリが増えていく。
図18は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
初期化処理(S10)において、検索条件入力部102が入力した検索条件(検索パターンの一例)に基づいて、状態遷移表生成部105が検索条件を受理する状態遷移機械(DFA)に対応する状態遷移表を生成し、状態遷移表記憶部106が記憶する。
状態記憶部111は初期状態(状態番号=1)を記憶する。
状態遷移記憶部112は、記憶する状態履歴を空にする。
圧縮辞書記憶部113は、記憶部する圧縮辞書を空にする。
現在位置カウンタ115は、現在位置として0を記憶する。
圧縮ブロック取得部108(符号取得部の一例)が、圧縮ブロック列(符号列の一例)の先頭から順に、圧縮ブロック(符号の一例)を1個取得する(S31)。状態遷移記憶部112は、状態記憶部111が記憶したDFAの現在の状態を、最初の状態として記憶しておく。
図48の規則によれば、参照番号を示す符号971と文字を表すビット列の符号972とは交互に出現するので、奇数番目の圧縮ブロックは、参照番号を示す符号971である。
圧縮ブロック取得部108は、参照番号を条件判断部114に渡して、展開ルーチンを実行する(S32)。
展開ルーチンでは、条件判断部114が、受け取った参照番号が0か否かを判断する(S321)。
参照番号が0の場合は、対応する部分文字列は空なので、展開ルーチンを終了する。
参照番号が0以外の場合は、対応する部分文字列が圧縮辞書に登録されている。そこで、条件判断部114は、状態遷移記憶部112が記憶している状態履歴を参照する。状態履歴の表において、「参照番号」行、「現在の状態」列を見て、過去にその参照番号の部分文字列を検索したときの状態履歴が記憶されているかを見る(S322)。
記憶されている場合には、遷移先算出部116が、状態履歴から遷移先状態を取得し(S323)、状態記憶部111が記憶したDFAの現在の状態を、遷移先状態に更新する(S324)。
次に、検索成功判別部117が、状態履歴から受理位置を取得し、受理位置がある場合には、ヒット位置を算出して出力する(S325)。
条件判断部114が、状態履歴が記憶されていないと判断した場合(S322)、文字取得部109(文字列復元部の一例)が圧縮辞書から前方参照番号を取得する(S41)。
圧縮ブロック取得部108は、前方参照番号を条件判断部114に渡して、展開ルーチンを再帰的に実行する(S42)。
次に、文字取得部109が圧縮辞書から接尾文字を取得する(S43)。
文字取得部109は接尾文字をDFAに入力し、状態遷移機械110が遷移先状態を算出して、状態記憶部111が記憶したDFAの現在の状態を、遷移先状態に更新する(S44)。
検索成功判別部117は、現在の状態が受理状態か判別し、受理状態ならヒット位置を算出して出力する(S45)。
最後に、状態遷移記憶部112は、「参照番号」行、「最初の状態」列に、状態履歴として、現在の状態及び受理位置を記憶し(S48)、展開ルーチンは終了する。
展開ルーチンが終了したら、圧縮ブロック取得部108は、次の圧縮ブロックを圧縮テキスト記憶部103から取得する(S33)。
これは偶数番目の圧縮ブロックなので、文字を表すビット列の符号972である。
文字取得部109は、この圧縮ブロックに対応する文字(接尾文字)を、DFAに入力し、状態遷移機械110が遷移先状態を算出して、状態記憶部111が記憶したDFAの現在の状態を、遷移先状態に更新する(S34)。
検索成功判別部117は、現在の状態が受理状態か判別し、受理状態ならヒット位置を算出して出力する(S35)。
現在位置カウンタ115が記憶した現在位置に、2つの圧縮ブロックに対応する部分文字列の長さを加えて、現在位置を更新する(S36)。
圧縮辞書記憶部113は、参照番号と接尾文字を圧縮辞書に登録する(S37)。
状態遷移記憶部112は、新たに圧縮辞書に登録した部分文字列に対応する参照番号を取得し、状態履歴の「参照番号」行、「最初の状態」列に、状態履歴として、現在の状態及び受理位置を記憶する(S38)。
以上の処理を圧縮ブロックがなくなるまで繰り返す(S18)。
以上説明した動作を、図6及び図17に示した具体例を使って説明する。
初期化処理(S10)により、各記憶部が記憶内容を初期化する。
状態遷移表記憶部106は、図6に示す状態遷移表200を記憶する。状態遷移表200は、検索条件入力部102が入力した検索条件(正規表現を含む)に基づいて、状態遷移表生成部105が生成したものである。状態遷移表200に対応するDFAにおいて、初期状態は状態番号1に対応する状態であり、受理状態は状態番号4に対応する状態である。これも、状態遷移表記憶部106が記憶している。なお、DFAの初期状態は必ず1つであるが、受理状態は複数あってもよい。
状態記憶部111は初期状態(状態番号=1)を記憶する。
状態遷移記憶部112は、記憶する状態履歴を空にする。
圧縮辞書記憶部113は、記憶する圧縮辞書を空にする。
現在位置カウンタ115は、現在位置として0を記憶する。
メインループにおいて、圧縮ブロック取得部108が、圧縮テキスト記憶部103が記憶した圧縮ブロック列300から、最初の圧縮ブロックを取得する(S31)。最初の圧縮ブロックは参照番号を意味し、参照番号は「0」である。
状態遷移記憶部は、状態記憶部111が記憶しているDFAの現在の状態(=1)を、最初の状態として記憶しておく。
次に、圧縮ブロック取得部108は、条件判断部114に参照番号「0」を渡し、展開ルーチンを呼び出す(S32)。再帰的な呼出しと区別するため、メインループからの呼出しはネストレベル1と呼ぶことにする。
展開ルーチンにおいて、条件判断部114は参照番号が0か否かを判断する(S321)。この場合、参照番号は0なので、展開ルーチン(ネストレベル1)は終了する。
メインループに戻り、圧縮ブロック取得部108は、次の圧縮ブロックを取得する(S33)。偶数番目の圧縮ブロックなので、文字を意味する圧縮ブロックであり、その文字(接尾文字)は「a」である。
文字取得部109は、文字「a」をDFAに入力し、状態遷移機械110は、状態遷移表記憶部106が記憶した状態遷移表200を参照して遷移先状態(=2)を算出し、状態記憶部111が記憶したDFAの現在の状態を、「2」に更新する(S34)。
検索成功判別部117は、現在の状態(=2)が受理状態(=4)でないと判断し、何もしない(S35)。
現在位置カウンタ115は、現在位置に1加え、現在位置は「1」となる。
圧縮辞書記憶部113は、参照番号「0」と接尾文字「a」を圧縮辞書に登録する。圧縮辞書記憶部113の圧縮辞書は空だったので、登録した部分文字列に対応する参照番号(登録番号)は「1」である。
状態遷移記憶部112は、参照番号「1」と最初の状態「1」に対応する欄に、現在の状態「2」(遷移先状態)と受理位置(ないので「0」)を記憶する(S38)。
次の圧縮ブロック(参照番号「1」)を取得する(S18、S31)。最初の状態は「2」である。
参照番号「1」を渡して、展開ルーチン(ネストレベル1)を呼び出す(S32)。参照番号が0以外なので(S321)、状態履歴をチェックする(S322)。
状態履歴の、参照番号「1」最初の状態「2」の欄は空欄なので(S322)、圧縮辞書の参照番号「1」の欄を参照し、前方参照番号「0」を得る(S41)。
前方参照番号「0」を渡して、展開ルーチンを再帰的に呼び出す(S42)。ネストレベル1からの呼出しなので、ネストレベル2と呼ぶことにする。
ネストレベル2の展開ルーチンにおいて、参照番号が0なので(S321)、何もせずに帰ってくる。
ネストレベル1に戻り、圧縮辞書の参照番号「1」の欄を参照し、接尾文字「a」を得る(S43)。
接尾文字「a」をDFAに入力し、DFAの状態は「2」になる(S44)。受理状態ではないので、出力はしない(S45)。
状態履歴の参照番号「1」最初の状態「2」の欄に、遷移先状態「2」受理位置「0」を記憶して(S48)、ネストレベル1の展開ルーチンは終了する。
メインループに戻り、次の圧縮ブロック(接尾文字「b」)を取得する(S33)。
接尾文字「b」をDFAに入力し、DFAの状態は「3」になる(S34)。受理状態ではないので、何も出力せず(S35)、現在位置が「3」になる(S36)。
圧縮辞書には、参照番号「1」と接尾文字「b」が登録される。登録番号は「2」である。
状態履歴には、参照番号「2」最初の状態「2」の欄に、遷移先状態「3」受理位置「0」を記憶する。
次の圧縮ブロック(参照番号「2」)を取得する(S18、S31)。最初の状態は「3」である。
参照番号「2」を渡して、展開ルーチン(ネストレベル1)を呼び出す(S32)。参照番号が0以外なので(S321)、状態履歴をチェックする(S322)。
状態履歴の、参照番号「2」最初の状態「3」の欄は空欄なので(S322)、圧縮辞書の参照番号「2」の欄を参照し、前方参照番号「1」を得る(S41)。
前方参照番号「1」を渡して、展開ルーチン(ネストレベル2)を再帰的に呼び出す(S42)。
ネストレベル2の展開ルーチンにおいて、参照番号が0以外なので(S321)、状態履歴をチェックする(S322)。
状態履歴の、参照番号「1」最初の状態「3」の欄は空欄なので(S322)、圧縮辞書の参照番号「1」の欄を参照し、前方参照番号「0」を得る(S41)。
前方参照番号「0」を渡して、展開ルーチン(ネストレベル3)を再帰的に呼び出す(S42)。
ネストレベル3の展開ルーチンにおいて、参照番号が0なので(S321)、何もせずに帰ってくる。
ネストレベル2に戻り、圧縮辞書の参照番号「1」の欄を参照し、接尾文字「a」を得る(S43)。
接尾文字「a」をDFAに入力し、DFAの状態は「2」になる(S44)。受理状態ではないので、出力はしない(S45)。
状態履歴の参照番号「1」最初の状態「3」の欄に、遷移先状態「2」受理位置「0」を記憶して(S48)、ネストレベル2の展開ルーチンは終了する。
ネストレベル1に戻り、圧縮辞書の参照番号「2」の欄を参照し、接尾文字「b」を得る(S43)。
接尾文字「b」をDFAに入力し、DFAの状態は「3」になる(S44)。受理状態ではないので、出力はしない(S45)。
状態履歴の参照番号「2」最初の状態「3」の欄に、遷移先状態「3」受理位置「0」を記憶して(S48)、ネストレベル1の展開ルーチンは終了する。
メインループに戻り、次の圧縮ブロック(接尾文字「c」)を取得する(S33)。
接尾文字「c」をDFAに入力し、DFAの状態は「4」になる(S34)。受理状態なので、ヒット位置「6」を出力し(S35)、現在位置が「6」になる(S36)。
圧縮辞書には、参照番号「2」と接尾文字「c」が登録される。登録番号は「3」である。
状態履歴には、参照番号「3」最初の状態「3」の欄に、遷移先状態「4」受理位置「3」を記憶する。
以下、同様に繰り返し、次から6つの圧縮ブロック(参照番号「0」接尾文字「d」参照番号「0」接尾文字「e」参照番号「0」接尾文字「c」)についての処理が終わったところで、圧縮辞書及び状態履歴は、図17に示す内容となっている。また、現在位置カウンタ115が記憶する現在位置は「9」、状態記憶部111が記憶するDFAの現在の状態は「3」になっている。
次の圧縮ブロック(参照番号「3」)を取得する(S31)。最初の状態は「3」である。
参照番号「3」を渡して、展開ルーチン(ネストレベル1)を呼び出す(S32)。参照番号が0以外なので(S321)、状態履歴をチェックする(S322)。
状態履歴の、参照番号「3」最初の状態「3」の欄には状態履歴が記憶されているので(S322)、状態履歴から遷移先状態「4」を取得する(S323)。
状態記憶部111が記憶したDFAの現在の状態を「4」に更新する(S324)。
状態履歴から受理位置「3」を取得し(S325)、ヒット位置「12」を出力して(S326)、ネストレベル1の展開ルーチンは終了する。
メインループに戻り、次の圧縮ブロック(接尾文字「d」)を取得する(S33)。
接尾文字「d」をDFAに入力し、DFAの状態は「5」になる(S34)。受理状態ではないので、何も出力せず(S35)、現在位置が「13」になる(S36)。
圧縮辞書には、参照番号「3」と接尾文字「d」が登録される。登録番号は「7」である。
状態履歴には、参照番号「7」最初の状態「3」の欄に、遷移先状態「5」受理位置「3」を記憶する。
以下、圧縮ブロックが尽きるまで繰り返す(S18)。
このように、LZ78方式で圧縮されたテキストを検索する場合において、圧縮テキストを読み込みながら圧縮辞書を構築していきつつ、そのときのDFAの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
更に、LZ78方式においては、新しく辞書に登録する部分文字列は、それまでに登録した部分文字列に1文字加えたものである。したがって、一つの参照番号について検索を実行すると、それに含まれる前方文字列についても同時に検索をしていることになる。したがって、再帰的な呼出しによって、これらを状態履歴に記憶すれば、状態履歴が記憶されている場合が多くなり、同じ状態遷移を繰り返す必要がない。これにより、検索が高速に行えるという効果を奏する。
なお、この実施の形態では、再帰的な呼出しを利用することに上述した効果を得ているが、LZ78方式の圧縮テキストを検索する場合に、再帰的な呼出しが必ず必要となるわけではなく、実施の形態1等で説明した方式でもよい。
圧縮辞書記憶部113が記憶する圧縮辞書の構造も、実施の形態1等で説明したように、参照番号と部分文字列とを記憶するものであってもよい。
状態遷移記憶部112が記憶する状態履歴の構造も、実施の形態1等で説明したような構造であってもよい。
実施の形態7.
実施の形態7を図3、図6、図8、図19、図20を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZ78方式で圧縮されたテキストを検索する別の場合について説明する。
図19は、LZ78形式による圧縮テキストの構造を示す図である。LZ78形式では、図4のような固定の圧縮辞書303を持たない。LZ78形式の圧縮テキストは圧縮ブロック列300のみから構成される。各圧縮ブロック1202は、文字列が最も長く一致する圧縮辞書1203の参照番号と、次の不一致文字の情報を持つ。圧縮辞書1203は、文字列1205と、文字列を参照するための参照番号1204から構成され、圧縮テキスト伸張の過程で随時エントリが追加されていく。図19の例に示したような圧縮ブロック列を伸張する場合、圧縮ブロック1206は、圧縮辞書1203の参照番号=9、最初の不一致文字=「a」なので、圧縮辞書1203の9番目のエントリの文字列に最初の不一致文字を加えた文字列「abcdea」と置き換えられる。さらに、この文字列「abcdea」が圧縮辞書1203の末尾に新たなエントリとして追加される。以後、圧縮ブロックの参照している圧縮辞書の文字列を、参照文字列と呼ぶこととする。
これまでに、LZ78形式の圧縮辞書の参照を高速化するために、木構造やハッシュなどを用いた様々な方法が提案されているが、この実施の形態の圧縮テキスト検索装置では、その実現方式は問わない。
この実施の形態による状態遷移記憶部は、図6に示したものと同様である。
図20は、この実施の形態の圧縮テキスト検索装置における検索処理の流れ図である。初期状態として、すでに検索条件入力部102が入力した検索条件から状態遷移表生成部105によって生成された状態遷移表を、状態遷移表記憶部106が記憶しているものとする。また、状態記憶部111には初期状態がセットされているものとする。圧縮辞書記憶部113と、状態遷移記憶部112の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを0に初期化する。
まず、ステップS1101で圧縮ブロック取得部108によって、圧縮ブロック列の先頭から順に圧縮ブロックを1個取得する。ステップS1102で、状態記憶部111の現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。一致する場合は(YES)、ステップS1103で状態遷移履歴の末尾の状態と、圧縮ブロックの不一致文字から次の状態を取得し、状態記憶部111にセットする。次にステップS1104で、状態遷移履歴に受理位置があるか判定する。受理位置があった場合は(YES)、ステップS1105でヒット位置を計算して出力し、ステップS1106に進む。ここで、ヒット位置=元テキスト長+受理位置となる。現在の状態が受理状態である場合もヒット位置として、元テキスト長+参照文字列長を出力する。ステップS1104で受理位置が無かった場合は(NO)、そのままステップS1106へ進む。ステップS1106では、圧縮辞書と状態遷移履歴を更新する。
圧縮辞書に対しては、参照文字列に不一致文字を追加したものを、圧縮辞書の新たなエントリとして追加する。状態遷移履歴に対しては、圧縮辞書が参照する状態遷移履歴に現在の状態を加えたものを、新たなエントリとして追加する。
ステップS1107では、圧縮ブロック列の終端に達しているか判定し、達していない場合は(NO)、ステップS1101で次の圧縮ブロックを取得する。ステップS1107で圧縮ブロック列の終端に達していた場合は(YES)、検索処理を終了する。図20には明記していないが、ここで元テキスト長に、参照文字列長を加える。
ステップS1102で、状態記憶部111が記憶した現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致しなかった場合は(NO)、ステップS1108に進み、参照文字列に不一致文字を加えた文字列に対して、状態遷移履歴を求める。ステップS1108で状態遷移履歴を求め終えたら、ステップS1107へ進む。圧縮ブロックの参照番号が0である場合、すなわち圧縮辞書に参照文字列が無い場合でも、ステップS1102からステップS1108へと進む。
図8は、ステップS1108の処理の流れの一例を示す図である。図8については、実施の形態1において説明したので、ここでは説明を省略する。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、高々2回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZ78形式で圧縮された圧縮テキストを高速に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZ78形式の圧縮辞書を記憶する。
LZ78形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで1回の状態遷移で状態を遷移させさせる。さらに、不一致文字により状態を遷移させる。
参照文字列と不一致文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
実施の形態8.
実施の形態8を図21〜図23を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZW方式で圧縮されたテキストを検索する場合について説明する。
図21は、この実施の形態において、圧縮テキスト記憶部103及び圧縮辞書記憶部113(辞書記憶部の一例)が記憶する記憶内容の一例を示す図である。
圧縮テキスト記憶部103は、圧縮ブロック列300を記憶している。圧縮ブロック列300は、元の文字列500「aababcdecabcdebabcdecc」に、図50の規則を適用して置換したものである。
圧縮辞書記憶部113(辞書記憶部の一例)は、圧縮辞書(置換辞書の一例)を記憶する。圧縮辞書には、出現する可能性のある文字から構成される1文字の部分文字列すべてが最初に登録される。この例では、「a」「b」「c」「d」「e」の5種類の文字しか出現しないものとして説明する。したがって、圧縮辞書は、最初、参照番号1〜5に「a」「b」「c」「d」「e」の5つの部分文字列が登録される。
参照番号6以降は、検索が進むにつれて、登録されるものである。
圧縮辞書記憶部113は圧縮辞書として、実施の形態6で説明した「参照番号」「前方参照番号」「接尾文字」に加え、「接頭文字」を記憶する。接頭文字は、その部分文字列の最初の1文字を示している。辞書更新時に、すぐに接尾文字を求められるように記憶しているものであり、なくてもよい。
図22は、この実施の形態において、状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図である。
状態遷移記憶部112は、状態履歴を記憶する。検索の始めにおいて、状態履歴は空であり、検索が進むにつれて状態履歴が登録されていく。
状態遷移記憶部112は状態履歴として、実施の形態6で説明したのと同様、「参照番号」「最初の状態」により参照可能な形で、「状態遷移履歴」と「受理位置」を記憶する。
状態遷移履歴は、最初の状態と最後の状態(遷移先状態)だけでなく、途中の状態もすべて記憶したものである。しかし、実施の形態6で説明したように、遷移先状態を記憶することとしてもよい。
その場合であっても、最初の状態の次の状態(2番目の状態)は記憶しておくほうが好ましい。状態履歴を更新する際に2番目の状態が必要になるので、DFAに入力せずともこれを取得できるからである。
また、ここでは、状態遷移履歴と受理位置をリスト形式で記憶しているので、現在の状態と一致する最初の状態から始まる状態履歴が記憶されているかを条件判断部114が判断する際、リスト内を検索する必要がある。このような構成とすると、実施の形態6で説明したような表形式で記憶する場合に比べて処理に時間がかかるが、DFAの状態の数が多い場合には、状態遷移記憶部112が状態履歴を記憶するのに必要とする記憶領域を節約できる。したがって、CPUの処理能力、ハードディスクの記憶容量等を勘案して、どちらの形式で記憶するかを決定すればよい。
図23は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
LZW方式は、LZ78方式と符号化の規則が異なる。そこで、制御の流れも、それに対応する部分が異なっている。以下、異なる部分のみ説明する。
初期化処理(S10)において、圧縮辞書記憶部113は、出現する可能性のある文字から構成される1文字の部分文字列すべてを登録する。参照番号は、例えば、文字コードと同じ番号を用いてもよい。
S18において、圧縮ブロックが残っていなければ、検索処理を終了する。
S51において、次の圧縮ブロック(参照番号を示す符号971)を取得する。これは、圧縮辞書記憶部113が記憶した圧縮辞書を更新するために、次の1文字を知る必要があるからである。
S52において、圧縮辞書記憶部113が記憶した圧縮辞書を参照して、次の圧縮ブロックの先頭の文字(接頭文字)を取得する。圧縮辞書に接頭文字を記憶しているので、次の圧縮ブロックを伸長しなくても、辞書を更新できる。
S38において、新しく辞書に登録した参照番号について、状態履歴を記憶する。この際、DFAにもう1文字入力したあとの状態を、遷移先状態として記憶する必要がある。
そこで、状態遷移記憶部112は、次の参照番号について記憶した状態遷移履歴から、2番目の状態を取得する。
あるいは、状態遷移表記憶部106が記憶した状態遷移表を参照して、2番目の状態を取得してもよい。
あるいは、DFAにもう1文字入力したあとで、状態履歴を記憶するよう構成してもよい。
展開ルーチンの処理については、実施の形態6において図18を用いて説明したものと同一なので、ここでは説明を省略する。
このように、LZW方式で圧縮されたテキストを検索する場合において、圧縮テキストを読み込みながら圧縮辞書を構築していきつつ、そのときのDFAの状態をともに記憶することにより、過去に検索したときの状態遷移を利用することができ、同じ状態遷移をもう一度繰り返す必要がなくなる。これにより、検索が高速に行えるという効果を奏する。
更に、LZW方式においては、新しく辞書に登録する部分文字列は、それまでに登録した部分文字列に1文字加えたものである。したがって、一つの参照番号について検索を実行すると、それに含まれる前方文字列についても同時に検索をしていることになる。したがって、再帰的な呼出しによって、これらを状態履歴に記憶すれば、状態履歴が記憶されている場合が多くなり、同じ状態遷移を繰り返す必要がない。これにより、検索が高速に行えるという効果を奏する。
埋込辞書参照型の圧縮方式には、この他にも様々なものがある。例えば、上述したLZ78方式あるいはLZW方式の符号列を、さらにハフマン符号化(静的あるいは動的)によって置換し、更に全体のビット長を短くしたもの等がある。
ここで説明した実施の形態は、それらの圧縮方式によって圧縮されたテキストにも適用できる。
実施の形態9.
実施の形態9を図20、図24を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、LZW方式で圧縮されたテキストを検索する別の場合について説明する。
図24は、LZW形式による圧縮テキストの構造を示す図である。LZW形式は、LZ78形式から派生した形式であり、LZ78形式同様に圧縮テキストは圧縮ブロック列300のみから構成される。LZW形式では、圧縮辞書に1バイト文字のエントリを予め(暗に)持つことを特徴としている。各圧縮ブロック1302は、文字列が最も長く一致する圧縮辞書の参照番号の情報のみを持つ。圧縮辞書の構造は、その1バイト文字のエントリを持つこと以外は、実施の形態7において図19を用いて説明したものと同様である。
これまでに、LZW形式の圧縮辞書の参照を高速化するために、木構造やハッシュなどを用いた様々な方法が提案されているが、この実施の形態の圧縮テキスト検索装置では、その実現方式は問わない。
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態7の図20に示したものとほぼ同様であるので、図20を援用して検索処理の流れを説明する。 初期状態として、すでに検索条件入力部102が入力した検索条件から状態遷移表生成部105が状態遷移表を生成し、状態遷移表記憶部106が記憶しているものとする。また、状態記憶部111には初期状態がセットされているものとする。圧縮辞書記憶部113と、状態遷移記憶部112の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを0に初期化する。
なお、圧縮辞書記憶部113は、エントリ番号0〜255に対する参照を受けたとき、そのエントリ番号と同じ文字コードを持つ1バイト文字を返すものとする。これにより、1バイト文字をあらかじめ圧縮辞書に登録しておく必要がない。
実施の形態7の図20との差異は、ステップS1102とステップS1106である。まず、ステップS1101で圧縮ブロック取得部108によって、圧縮ブロック列の先頭から順に圧縮ブロックを1個取得する。ステップS1102で、状態記憶部111の現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。一致する場合は(YES)、ステップS1103で状態遷移履歴の末尾の状態を、状態記憶部111にセットする。次にステップS1104で、状態遷移履歴に受理位置があるか判定する。受理位置があった場合は(YES)、ステップS1105でヒット位置を計算して出力し、ステップS1106に進む。ここで、ヒット位置=現在の元テキスト長+受理位置をとする。ステップS1104で受理位置が無かった場合は(NO)、そのままステップS1106へ進む。
ステップS1106では、圧縮ブロックの参照文字列に次の圧縮ブロックの参照文字列の先頭の文字を追加したものを、圧縮辞書に新たなエントリとして追加する。状態遷移履歴には、圧縮ブロックの参照する状態遷移履歴に、現在の状態を、新たなエントリとして追加する。さらに圧縮ブロックの参照文字列の先頭の文字から得られる次の状態を、そのエントリに追加する。次の圧縮ブロックが無い場合は、ステップS1106では何もしない。
ステップS1107では、圧縮ブロック列の終端に達しているか判定し、達していない場合は(NO)、ステップS1101で次の圧縮ブロックを取得する。ステップS1107で圧縮ブロック列の終端に達していた場合は(YES)、検索処理を終了する。図20には明記していないが、ここで圧縮前のテキスト長に、圧縮辞書の文字列長を加える。このようにすることで、現在圧縮前のテキストの何文字目まで検索したことになるかを知ることができる。
ステップS1102で、状態記憶部111の現在の状態と、圧縮ブロックの参照する状態遷移履歴の先頭の状態が一致しなかった場合は(NO)、ステップS1108に進み、圧縮ブロックの参照文字列に対して、状態遷移履歴を求める。ステップS1108で状態遷移履歴を求め終えたら、ステップS1107へ進む。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、2回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZW形式で圧縮された圧縮テキストを高速に検索することができる。
この実施の形態と同様にして、LZ78形式から派生した圧縮形式によって圧縮された圧縮テキストをこの実施の形態の圧縮テキスト検索装置によって高速に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZW形式の圧縮辞書を記憶する。
LZW形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで1回の状態遷移で状態を遷移させる。次の圧縮ブロックの参照文字列の先頭の文字によって状態を遷移させる。
参照文字列と次の圧縮ブロックの参照文字列の先頭の文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
実施の形態10.
実施の形態10を図7、図25〜図27を用いて説明する。
いままでの実施の形態においては、検索装置においてDFAに入力する文字のビット長と、圧縮技術において置換する部分文字列を構成する文字のビット長が一致するものと仮定していた。
しかし、使用するコードによっては、文字を表現するビット列のビット長が異なる場合がある。
例えば、ASCIIコードを用いる場合、文字を表現するビット列のビット長は8ビット(1バイト)である。
これに対し、シフトJISコードを用いる場合、文字を表現するビット列のビット長は16ビット(2バイト)である。
更にいえば、シフトJISコードはASCIIコードと混在させることができるので、同じ文字列の中に8ビットのビット列によって表される文字と16ビットのビット列によって表される文字とが混在する場合もある。
しかし、圧縮技術においては、それぞれの文字を表すビット列の長さが何ビットであるかは重要な問題ではない。
結果として得られる符号列全体のビット長が、元の文字列全体のビット長より短くなっていればよいのであって、その文字列が何を意味しているかを理解する必要はないからである。
そこで、圧縮技術においては通常、すべての文字列は8ビットのビット長を持つ文字から構成されているものとして扱っている。
これに対して、検索装置においては、文字を表現したビット列のビット長よりも、文字数のほうが重要である。
例えば、ある文字列を画面に表示する場合、使用者はその文字列を構成する文字が、コンピュータ内部で何ビットのビット列によって表現されているかを意識する必要はない。
したがって、検索装置は通常、検索条件に合致する検索文字列が「何文字目にあった」と画面に表示する。
また、正規表現で指定する検索条件においては、「任意の1文字」といった指定の仕方が可能である。この場合、その1文字が、コンピュータ内部において何ビットのビット列で表現されているかは無関係である。
したがって、検索装置においてDFAに入力する文字は、必ずしも8ビットのビット長を持つビット列であるとは限らない。
図25は、圧縮技術において取り扱う文字を表現したビット列のビット長と、検索装置において取り扱う文字を表現したビット列のビット長とが異なっている場合について説明するための説明図である。
元の文字列500は、シフトJISコードを用いる場合、コンピュータの内部では、内部表現550のビット列で表現されている。なお、図25ではわかりやすいよう、内部表現のビット列を8ビットごとに区切って16進数で表している。
符号列600は、これを圧縮技術によって圧縮したものである。上述したように、圧縮技術においては、文字を表現するビット列のビット長にかかわらず、8ビットを1文字として置換を行う。したがって、符号に置換された部分文字列が、元の文字列の文字の区切りとは違うところで区切られる場合がある。
これを検索装置が検索する場合、例えば、最初の符号を復元してDFAに入力しようとすると、「あ」「い」までは入力できるが、最後の8ビットが余ってしまい、DFAに入力することができない。
そこで、この実施の形態は、未完文字復元部121とバイトデータ記憶部122(未完文字記憶部の一例)を設けることにより、この課題を解決するものである。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
図26は、この実施の形態における圧縮テキスト検索装置100のブロック構成の一例を示すブロック図である。
未完文字復元部121は、圧縮ブロック(符号の一例)から復元した部分文字列に、DFAに入力できない文字(未完文字)が含まれているかを判断し、未完文字がある場合には、バイトデータ記憶部122に記憶させる。
他の部分は、実施の形態1において図3を用いて説明したものと同一なので、ここでは説明を省略する。
未完文字は、次の部分文字列の先頭の文字(他の未完文字)と結合することによって、DFAに入力できる文字となる。
図27は、この実施の形態において、圧縮テキスト記憶部103、圧縮辞書記憶部113(辞書記憶部の一例)、状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図である。
圧縮テキスト記憶部103は、圧縮ブロック列300を記憶している。圧縮ブロック列300は、元の文字列500を辞書参照型圧縮方式により置換して圧縮してしたものである。
状態遷移記憶部112は、状態履歴を記憶する。検索開始時には、状態履歴は空である。検索が進むにつれて、埋まっていく。
状態遷移記憶部112は状態履歴として、状態遷移履歴、受理位置、未完文字、末尾の未完文字を記憶する。
「状態遷移履歴」は、その部分文字列をDFAに入力する前(前の部分文字列の末尾に未完文字がある場合も含む)の状態(最初の状態)から、その部分文字列をDFAに入力した後(その部分文字列の末尾に未完文字がある場合には、未完文字の手前まで入力した後)の状態(遷移先状態)までの、DFAの状態遷移の履歴である。なお、途中経過は記憶せず、最初の状態と遷移先状態だけを記憶してもよい。
「未完文字」は、その部分文字列を展開する前に、バイトデータ記憶部122が記憶していた未完文字である。これを、部分文字列の先頭にある未完文字と結合することによって、DFAに入力できる文字となる。
「末尾の未完文字」は、その部分文字列の最後に未完文字がある場合の未完文字を示す。
圧縮辞書記憶部113は、圧縮に用いた辞書と同じ辞書を記憶している。これは、圧縮テキスト記憶部103が記憶していたものから取得してもよいし、圧縮ブロック列の中に埋め込まれた情報を抽出したものであってもよい。
圧縮ブロックによって置換される部分文字列には、ここに示すように、末尾にDFAに入力できない文字(未完文字)を有するもの(例えば、参照番号1)、先頭にDFAに入力できない文字(他の未完文字)を有するもの(例えば、参照番号2)、両方に有するもの(例えば、参照番号3)などがある。
状態遷移表記憶部106は、検索条件入力部102が入力した検索条件(検索パターン)に基づいて、状態遷移表生成部105が生成した状態遷移表を記憶している。
例えば、検索条件入力部102が、正規表現「(あい|えおう)[うお]え*」を検索条件として入力する(ここで「[うお]」は「(う|お)」の簡略表記である)。この正規表現は、「あいう」「あいお」「あいうお」「あいおお」「えおうう」「えおうお」「えおううお」「えおうおお」・・・などを意味する。図27の状態遷移表は、この正規表現に基づいて、状態遷移表生成部105が生成するものである。
図7は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
この実施の形態における制御の流れは、実施の形態1において図7を用いて説明した流れとほぼ同一である。ここでは、相違する点だけを説明する。
S12において、条件判断部114は、状態記憶部111が記憶した現在のDFAの状態と、状態遷移記憶部112が記憶した圧縮ブロックに対応する状態遷移履歴(以後、圧縮ブロックの状態遷移履歴という)の先頭の状態とが一致するかを判定するとともに、バイトデータ記憶部122が記憶した未完文字と、状態遷移履歴の未完文字とが一致するかも判定する。条件判断部114は、両方が一致した場合のみ一致と判断し、S62以降の処理に移る。
S13において、遷移先算出部116は、状態遷移履歴から取得した遷移先状態に、状態記憶部111が記憶したDFAの状態を更新するとともに、バイトデータ記憶部122が記憶した未完文字を、状態遷移履歴から取得した末尾の未完文字に更新する。
S16において、文字取得部109が取得した文字が未完文字である場合には、未完文字復元部121がそれを判断し、バイトデータ記憶部122に未完文字を記憶させる。
これ以外の部分における処理は、実施の形態1において図7を用いて説明したものと同一なので、ここでは説明を省略する。
このように、未完文字がある場合にはそれを一時的に記憶しておき、DFAの状態と未完文字が両方とも一致するかを判断する。一致する場合には、これを展開してDFAに入力しても全く同じ状態遷移をすることになるので、これを展開せず、過去の履歴を参照して、DFAの状態遷移を1回で済ませる。
これにより、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合でも、検索が高速になるという効果を奏する。
なお、ここでは、辞書参照型圧縮方式によって圧縮された圧縮テキストを検索する場合について説明したが、実施の形態2〜実施の形態9で説明した構成と組み合わせることにより、他の圧縮方式によって圧縮された圧縮テキストを検索することも可能である。
実施の形態11.
実施の形態11を図7、図28を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態10で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合の別の方式について説明する。
図28は、この実施の形態において、圧縮テキスト記憶部103、圧縮辞書記憶部113(辞書記憶部の一例)、状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図である。
状態遷移記憶部112は、状態履歴を記憶する。検索開始時には、状態履歴は空である。検索が進むにつれて、埋まっていく。
状態遷移記憶部112は状態履歴として、状態遷移履歴、受理位置、先頭の未完文字、末尾の未完文字を記憶する。
「状態遷移履歴」は、その部分文字列をDFAに入力する前(その部分文字列の先頭に未完文字がある場合には、そこまで入力した後)の状態(最初の状態)から、その部分文字列をDFAに入力した後(その部分文字列の末尾に未完文字がある場合には、未完文字の手前まで入力した後)の状態(遷移先状態)までの、DFAの状態遷移の履歴である。なお、途中経過は記憶せず、最初の状態と遷移先状態だけを記憶してもよい。
「先頭の未完文字」は、その部分文字列の先頭に未完文字がある場合の未完文字を示す。バイトデータ記憶部122が記憶していた未完文字を、これと結合することによって、DFAに入力できる文字となる。
「末尾の未完文字」は、その部分文字列の最後に未完文字がある場合の未完文字を示す。
他の部分については、実施の形態10において図27を使って説明したものと同一であるので、ここでは説明を省略する。
図7は、この実施の形態における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図である。
この実施の形態における制御の流れは、実施の形態1において図7を用いて説明した流れとほぼ同一である。ここでは、相違する点だけを説明する。
S11において、圧縮ブロック取得部108(符号取得部の一例)が圧縮ブロック(符号)を取得する。バイトデータ記憶部122が未完文字を記憶している場合には、未完文字復元部121が、部分文字列の先頭にある未完文字(他の未完文字)と結合して、DFAに入力できる文字を取得し、これをDFAに入力して、状態遷移処理を行う。
これにより、S12の処理をする段階では未完文字がなくなるので、S12においては、未完文字が一致するかを判別する必要がなく、状態の一致のみを判別すればよい。
S13において、遷移先算出部116は、状態遷移履歴から取得した遷移先状態に、状態記憶部111が記憶したDFAの状態を更新するとともに、バイトデータ記憶部122が記憶した未完文字を、状態遷移履歴から取得した末尾の未完文字に更新する。
S16において、文字取得部109が取得した文字が未完文字である場合には、未完文字復元部121がそれを判断し、バイトデータ記憶部122に未完文字を記憶させる。
これ以外の部分における処理は、実施の形態1において図7を用いて説明したものと同一なので、ここでは説明を省略する。
このように、未完文字がある場合にはそれを一時的に記憶しておき、次の圧縮ブロックの先頭にある未完文字と結合してDFAに入力する。未完文字がなくなってから、DFAの状態が一致するかを判断するので、未完文字の存在を無視することができる。
これにより、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合でも、検索が高速になるという効果を奏する。
なお、ここでは、辞書参照型圧縮方式によって圧縮された圧縮テキストを検索する場合について説明したが、実施の形態2〜実施の形態9で説明した構成と組み合わせることにより、他の圧縮方式によって圧縮された圧縮テキストを検索することも可能である。
実施の形態12.
実施の形態12を図29〜図33を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態10で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合の更に別の方式について説明する。
この圧縮テキスト検索装置は、入力されたマルチバイトコード文字を含む圧縮テキスト中に検索条件に適合する文字列が存在するか否かを判定し、存在する場合はその文字列の出現位置を、存在しない場合は何も出力しない検索装置である。
マルチバイトコード文字を含むテキストでは、テキスト中に1バイトコードの文字と、2バイト以上のコードの文字が混在して存在する。ここでは、文字のコードを「(82A0)」のように()で囲んだ16進数値で表記するものとする。これ以降、主にシフトJISコードを例に説明する。文字コード(82A0)は、シフトJISコードの「あ」である。また、2バイト以上のコードの文字の、1文字に満たない部分コードをバイトデータ(未完文字の一例)と呼ぶこととする。例えば、「あ」のバイトデータは、(82)や(A0)である。
図29は、この実施の形態による圧縮テキストの構造を示す図である。図29は、それぞれ実施の形態1において図4を用いて説明したものと対応している。
一般的に辞書式圧縮は、1バイト単位で処理されるため、マルチバイトコード文字を含むテキストを圧縮した場合、2バイト以上からなる文字が圧縮辞書の2つ以上のエントリに分かれて登録されてしまうことがある。
図29のような圧縮テキスト<1、2、1、3、4、1、3>を伸張する場合、圧縮ブロック列300から1つずつ圧縮ブロック1702を取得し、その参照情報を元に圧縮ブロック1702を圧縮辞書の文字列1705と置き換える。
例えば、最初の圧縮ブロック1702は、圧縮辞書の1番目のエントリを参照しているため、最初の圧縮ブロックは、1番目のエントリの文字列「あいうえ(82)」と置き換えることができる。同様に2番目の圧縮ブロックは、「(A8)うい」と置き換えることができる。ここで、文字コード(82A8)は、シフトJISコードで「お」を表わしているため、1番目と2番目の圧縮ブロックからは、文字列「あいうえおうい」が得られる。同様に全ての圧縮ブロックについて繰り返すことで、圧縮ブロック列300から伸張されたテキスト「あいうえおういあいうえいおうあえあいうえあえ」を得ることができる((82A0)=「あ」、(82A2)=「い」)。
図30は、この実施の形態において、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図である。状態遷移記憶部112は、参照番号1801、状態遷移履歴1802、受理位置1803の情報を持つ。参照番号1801は、圧縮辞書の参照番号304と1対1に対応している。状態遷移履歴1802は、対応する圧縮辞書の文字列による状態遷移機械の状態遷移の履歴を記憶したものであり、先頭が圧縮辞書の文字列を読む直前の状態、末尾が圧縮辞書の文字列を全て読んだ直後の状態をさす。状態は、1バイトのデータではなく1文字に対して1回遷移する。例えば、1番目の状態遷移履歴の場合、状態[1]から開始して、文字列「あいうえ(82)」を1文字読む毎に状態が[2]−[3]−[4]−[5]と遷移する。最後の「(82)」は、バイトデータであるため状態を遷移させることができない。
このように、実施の形態1では、状態遷移の履歴の長さは、圧縮ブロックの参照文字列の文字列長+1であったが、この実施の形態のマルチバイトコード文字を含むテキストを検索する圧縮テキスト検索装置では、参照文字列の文字列長+1となるとは限らず、参照文字列の文字数+1となる。受理位置1803は、圧縮ブロックの参照文字列の何バイト目で、状態遷移機械が受理状態に到達したかを表わしている。この受理位置は、文字単位でカウントしても良い。このとき、1文字に満たない1バイトデータがある場合でも、それを1文字とカウントしても良いし、しなくても良い。
図31は、状態遷移表記憶部106が記憶する状態遷移表の一例を示す図である。
図31の状態遷移表1901の左端の列は、現在の状態を表わしている。また、1行目は次に入力された文字を表わしている。検索条件に含まれる正規表現を受理する状態遷移機械の状態遷移表は、照合が開始されるまでに生成される。
図32は、この実施の形態の圧縮テキスト検索装置における検索処理の流れ図である。初期状態として、検索条件入力部102が入力した検索条件から、状態遷移表生成部105が状態遷移表を生成し、状態遷移表記憶部106が記憶しているものとする。また、圧縮テキスト記憶部103が記憶した圧縮テキストから圧縮辞書についての情報を抽出し、圧縮辞書記憶部113が記憶しているものとする。また、状態記憶部111には初期状態がセットされているものとする。状態遷移記憶部112の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを0に初期化する。
まず、ステップS1501で圧縮ブロック取得部108によって、圧縮ブロック列の先頭から順に圧縮ブロックを1個取得する。ステップS1502で、バイトデータ記憶部122にバイトデータがあるか判定する。バイトデータがある場合は(YES)、ステップS1503に進む。
テキストが全て文字の割り付けられている文字コードからなり、バイトデータ記憶部122にバイトデータがある場合、圧縮ブロックの参照文字列の先頭にも、バイトデータがある。そこで、ステップS1503で、バイトデータ記憶部のバイトデータを上位バイト、参照文字列の最初のバイトデータを下位バイトとする1文字と、状態記憶部111の現在の状態を元に、状態遷移機械110によって次の状態を取得する。取得した次の状態は、状態記憶部111にセットする。同時にバイトデータ記憶部122を空にする。
ステップS1502で、バイトデータが無い場合は(NO)、そのままステップS1504へと進む。
ステップS1504で、状態記憶部111の現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。一致する場合は(YES)、ステップS1505で状態遷移履歴の末尾の状態を、状態記憶部111にセットする。
次にステップS1506で、状態遷移履歴に受理位置があるか判定する。受理位置があった場合は(YES)、ステップS1507でヒット位置を計算して出力する。ここで、ヒット位置=現在の元テキスト長+受理位置となる。ステップS1506で受理位置が無かった場合は(NO)、そのままステップS1508へ進む。
ステップS1508では、圧縮ブロックの参照文字列の末尾に、バイトデータがあるか判定する。ステップS1508でバイトデータがある場合は(YES)、ステップS1509で、そのバイトデータをバイトデータ記憶部122にセットする。ステップS1508で、バイトデータが無い場合は(NO)、そのままステップS1510へと進む。
ステップS1510では、圧縮ブロック列の終端に達しているか判定し、達していない場合は(NO)、ステップS1501で次の圧縮ブロックを取得する。ステップS1510で圧縮ブロック列の終端に達していた場合は(YES)、検索処理を終了する。
図32には明記していないが、ここで元テキスト長に、圧縮辞書の文字列長を加える。
ここでは、ヒット位置をテキストの先頭からのバイト数として出力するようにしたが、文字数として出力しても良い。その場合は、元テキスト長をカウントする代わりに、元テキストの文字数をカウントするようにし、状態遷移履歴の受理位置も文字数で記録するようにすると良い。
ステップS1504で、状態記憶部111が記憶した現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致しなかった場合は(NO)、ステップS1511に進み、圧縮ブロックの参照文字列に対して、状態遷移履歴を求める。
ステップS1502で、参照文字列の先頭がバイトデータであった場合は、そのバイトデータの次の文字から始まる文字列に対して、状態遷移履歴を求める。
ステップS1511で状態遷移履歴を求め終えたら、ステップS1510へ進む。
図33は、図32の検索処理の流れにおけるステップS1511の処理の流れ図である。ここでは、状態遷移履歴の一時的な記憶領域Hを用意し、初期状態として空であるものとする。
まず、ステップS1601で、現在の状態を記憶領域Hの状態遷移履歴の先頭に追加する。ステップS1602で、文字取得部109によって圧縮ブロックの参照文字列の先頭から順に1文字ずつ取得する。
ステップS1603で、ステップS1601で取得した文字と、状態記憶部111が記憶した現在の状態を入力として、状態遷移機械110から次の状態を取得し、状態記憶部111にセットする。
ステップS1604では、ステップS1603で取得した状態を、記憶領域Hの状態遷移履歴に追加する。
ステップS1605では、状態記憶部111の状態が受理状態か判定する。受理状態であった場合は(YES)、ステップS1606でヒット位置を出力し、ステップS1607に進む。ここで、ヒット位置は元テキスト長(バイト)+圧縮ブロックの参照文字列の先頭からのバイト数となる。このとき、同時に記憶領域Hの状態遷移履歴の受理位置に、参照文字列の先頭からのバイト数をセットする。ステップS1605で受理状態では無かった場合は(NO)、そのままステップS1607に進む。
ステップS1607では、文字列の終端に達しているか判定し、達していない場合には(NO)、ステップS1608へ進む。
ステップS1608では、次の文字がバイトデータであるか判定し、バイトデータであった場合は(YES)、そのまま処理を終了する。バイトデータではない場合は(NO)、ステップS1602で次の文字を取得する。
ステップS1607で、文字列の終端まで処理していた場合は(YES)、処理を終了する。
処理を終了する時に、記憶領域Hの状態遷移履歴の履歴と受理位置を、圧縮ブロックの参照する状態遷移履歴に反映する。
上記の図33の処理の流れでは、処理の終了時点で状態遷移履歴を反映するとしたが、常に更新しなくても良い。
すなわち、最初に取得した状態遷移履歴から更新しないようにしても良いし、状態遷移履歴の先頭の状態がある特定の状態のときのみ、履歴を更新するようにしても良い。
図33の処理開始時に、文字列の先頭がバイトデータであった場合は、そのまま処理を終了してよい。
この実施の形態では、ステップS1504で、状態記憶部111が記憶した現在の状態と、状態遷移記憶部の圧縮ブロックに対応する状態遷移履歴の先頭の状態が一致するか判定するようにしたが、図33(図32のステップS1511)のステップS1603で次の状態を取得したあと、状態遷移履歴の状態と比較し、一致した場合はステップS1511の処理を終了し、ステップS1505に処理が移るように構成しても良い。
図26〜図33を用いて、この実施の形態による圧縮テキスト検索装置の処理の例を示す。初期状態として、検索条件入力部102が正規表現を含んだ検索条件を入力し、入力した検索条件に基づいて、状態遷移表生成部105がその正規表現を受理するDFAの状態遷移表1901を生成し、状態遷移表記憶部106が記憶している。受理状態は状態[4]のみとする。また、状態記憶部111には、初期状態[1]が記憶されているものとする。状態遷移記憶部112の状態遷移履歴は空であるとする。バイトデータ記憶部122も空である。今、圧縮テキスト記憶部103が記憶している圧縮テキストから、圧縮ブロック列300と圧縮辞書1703を得る。圧縮辞書は圧縮辞書記憶部113に記憶される。なお、ここで使用する文字はすべて2バイト文字であるとする。
まず、ステップS1501で圧縮ブロック列300から最初の圧縮ブロックを取得する。
次にステップS1502で、バイトデータ記憶部122にバイトデータがないので、ステップS1504に進む。
ステップS1504では、状態記憶部111が記憶している現在の状態[1]に対して、圧縮ブロックの参照する状態遷移履歴は空なので、状態は一致しない。よって、ステップS1511に移行する。
図33のステップS1601では、現在の状態を、状態遷移記憶部の1番目の状態遷移履歴の先頭にセットする。
ステップS1602では、圧縮ブロックが参照している圧縮辞書の文字列「あいうえ(82)」の最初の1文字「あ」を取得する。
次にステップS1603では、現在の状態[1]と文字「あ」を元に、状態遷移機械110によって次の状態[2]を取得する。取得した状態[2]を状態記憶部111にセットして、次のステップS1604に進む。
ステップS1604では、現在の状態を、1番目の状態遷移履歴に追加する。ここで、状態遷移記憶部112が記憶する1番目の状態遷移履歴は「1−2」となる。
ステップS1605では、現在の状態が受理状態であるか判定し、受理状態ではないのでステップS1607へ進む。
ステップS1607では、圧縮辞書の文字列の終端に達したか判定し、達していないのでステップS1608へ進み、次の文字がバイトデータでもないので、ステップS1602で次の文字「い」を取得する。
2文字目「い」に対しても同様に処理を行い、ステップS1608に達した時点で、現在の状態は[3]、状態遷移履歴は「1−2−3」となる。
次に、ステップ201で次の文字「う」を取得する。状態[3]で文字「う」を取得した場合、状態遷移表1901より次の状態[4]を得る。よって、ステップS1604の実行直後では、現在の状態[4]、状態遷移履歴「1−2−3−4」となる。
ステップS1605で現在の状態が受理状態か判定し、受理状態であるのでステップS1606に進む。現在2バイト文字を3文字目まで取得したところなので、ヒット位置として2バイト×3=6出力する。同時に、1番目の状態遷移履歴の受理位置に6を追加する。
同様に処理を繰り返して、4文字目の「え」のステップS1608で、文字がバイトデータか判定する。シフトJISコードの場合、文字の1バイト目でそれが1バイト文字であるか2バイト文字であるかは判別可能である。次の文字(82)はバイトデータであるため処理を終了する。この時点で、テキストの先頭から9バイトまでの処理が終わり、現在の状態は[5]、1番目の状態遷移履歴は「1−2−3−4−5」となっている。
次に処理は図13のステップS1508へと進む。ステップS1508では、末尾の文字がバイトデータ(82)であるので、ステップS1509で(82)をバイトデータ記憶部122にセットする。そしてステップS1510へと進み、圧縮ブロック列の終端に達していないため、ステップS1501で次の圧縮ブロックを取得する。この時点で、元テキスト長は9バイトである。
ステップS1502で、バイトデータ記憶部122にバイトデータ(82)があるので、ステップS1503へ進む。
ステップS1503で、バイトデータ記憶部122のバイトデータ(82)を上位バイト、参照文字列の先頭のバイトデータ(A8)を下位バイトとする文字「お」(=(82A8))と、現在の状態[5]から、状態遷移機械110によって次の状態[6]を取得し、状態記憶部111にセットする。そしてバイトデータ記憶部122を空にする。
ステップS1504以降は同様に処理を行って、ステップS1510に達した時点でテキストの14バイト目まで処理が終わり、現在の状態は[1]、1番目の状態遷移履歴は「1−2−3−4−5」、2番目の状態遷移履歴は「6−3−1」である。
ステップS1501で3番目の圧縮ブロックを取得する。3番目の圧縮ブロックの参照先は<1>である。
ステップS1502で、バイトデータ記憶部122にバイトデータがないため、ステップS1504へと進む。
ステップS1504で、現在の状態[1]と、1番目の状態遷移履歴の先頭の状態[1]を比較し、一致しているのでステップS1505へと進む。
ステップS1505では、状態遷移履歴の末尾の状態[5]を、状態記憶部111が現在の状態として記憶する。
ステップS1506で、1番目の状態遷移履歴には受理状態があるため、ステップS1507でヒット位置を計算し出力する。3番目の圧縮ブロックを取得する直前までに処理したテキストは14バイト、また状態遷移履歴の受理位置は6なので、14+6=20がヒット位置となる。
ステップS1508で参照文字列の末尾にバイトデータがないのでステップS1510へ進む。
ステップS1510で、圧縮ブロックの終端ではないので、ステップS1501に進む。
以降同様に処理を行い、圧縮ブロック列の終端まで処理を終えた時点で検索処理を終了する。
以上のように、この実施の形態によれば、状態記憶部の現在の状態と、取得した圧縮ブロックに対応する状態遷移履歴の先頭の状態が一致しなかった場合には、状態遷移を処理するのに対して、圧縮ブロックが参照している圧縮辞書の文字列長に比例したステップ数を要する。一方で、現在の状態と状態遷移履歴の先頭の状態が一致した場合には、高々2回の状態遷移で処理することができる。現在の状態と文字によって状態遷移先が一意に決定される状態遷移機械では、現在の状態が初期状態である場合が多い。そのため、圧縮率が高いほど、すなわち長さが長い文字列が繰り返し出現しているようなテキストほど、状態遷移に要するステップ数を削減することができる。
正規表現に適合する文字列がテキスト中に存在するかの照合自体は、従来から利用されている、正規表現を受理する状態遷移が一意に決定される状態遷移機械を使用している。
このように、この実施の形態の圧縮テキスト検索装置では、正規表現を含んだ検索条件によって、マルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
この実施の形態では、例としてシフトJISのテキストについて説明したが、他のマルチバイトコード文字のテキストでも同様に検索することができる。例えば日本語EUC(Extended UNIX Code)(UNIXは登録商標)は、シフトJIS同様に1バイト目で1〜3バイト文字のいずれであるか判定することが可能であり、バイトデータが1バイトか2バイトかを注意すればよい。また、JISは、1バイト文字であるか2バイト文字であるかを判定するための、情報を持つ。その情報をバイトデータ記憶部122などにバイトデータとともに記憶しておくなどとするとよい。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
辞書式圧縮方式によって圧縮されたマルチバイトコード文字を含むテキストを、伸張することなく、正規表現によって検索する検索装置である。
検索には、状態遷移が一意に決定できる状態遷移機械を使用する。
検索時には、圧縮ブロックが参照する辞書中の文字列毎に、状態遷移機械の状態遷移の履歴を記憶しておき、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、履歴の末尾の状態まで状態遷移を一気に遷移させる。
1文字に満たないバイトデータを記憶する記憶部を備え、辞書中の文字列の末尾に1文字に満たないバイトデータが含まれる場合には、そのバイトデータを記憶しおき、次の圧縮ブロックの先頭からバイトデータを取得した時点で、状態遷移を処理する。
実施の形態13.
実施の形態13を図34、図35を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態10で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、LZ77方式で圧縮されたテキストを検索する場合について説明する。
図34は、この実施の形態による、圧縮辞書記憶部113と状態遷移記憶部112の記憶する情報を図示したものである。圧縮辞書記憶部113は、スライド窓2103を記憶する。状態遷移記憶部112は、スライド窓に対応した状態遷移履歴2104と、受理位置2105を記憶している。また、状態遷移履歴2104は、スライド窓長+1文字分の状態遷移を記憶している。受理位置2105は、状態遷移履歴2104の中で、受理状態の位置を記憶している。
この実施の形態では、圧縮辞書記憶部113のスライド窓2103がバイトデータ記憶部の役割を兼ねる。
図35は、この実施の形態の圧縮テキスト検索装置における検索処理の流れ図である。初期状態として、検索条件入力部102が入力した検索条件から状態遷移表生成部105が状態遷移表を生成し、状態遷移表記憶部106が記憶しているものとする。また、状態記憶部111には初期状態がセットされているものとする。圧縮辞書記憶部113と、状態遷移記憶部112の状態遷移履歴と受理位置は空であるとする。また、元テキスト長をカウントするためのカウンタを0に初期化する。
最初に、ステップS2001で、圧縮ブロック列の先頭から順に圧縮ブロックを1個ずつ取得する。
ステップS2002で、圧縮ブロックの参照文字列の先頭がバイトデータか判定する。バイトデータの場合で、圧縮辞書記憶部の末尾にバイトデータが存在する場合は、その末尾のバイトデータを上位バイト、参照文字列の先頭のバイトデータを下位バイトとする1文字と、現在の状態を元に状態遷移機械110によって次の状態を取得し、現在の状態と状態遷移履歴2104の末尾にセットする。圧縮辞書記憶部の末尾にバイトデータが無い場合は、ステップS2008に進んでよい。
ステップS2004で、現在の状態と、圧縮ブロックが参照する状態遷移履歴の先頭の状態が一致するか判定する。参照文字列の先頭がバイトデータであった場合は、その次の文字の状態と比較する。先頭の状態が一致した場合は(YES)、ステップ2005で、スライド窓の(参照文字列の位置+参照文字列長)の位置の文字の状態を現在の状態にセットする。ステップS2006で、参照文字列の位置から(参照文字列の位置+参照文字列長)の位置の間に受理状態があるか判定する。受理状態がある場合は(YES)、ステップS2007でヒット位置を計算して出力し、ステップS2008へ進む。受理状態が無い場合は(NO)、何もせずにステップS2008へ進む。
ステップS2008では、スライド窓と状態遷移履歴を更新する。すなわち、スライド窓中の文字列を、(参照文字列長+1)バイト分前へシフトし、末尾に参照文字列の位置から参照文字列長分の文字列と、最初の不一致文字を追加する。同様に、状態遷移履歴も同様に、(参照文字列長+1)バイト分前へシフトし、末尾に参照文字列の先頭の文字から参照文字列分の後ろの文字までの状態遷移履歴を追加する。状態遷移履歴は、さらに、参照文字列の末尾と不一致文字が共にバイトデータで、合わせて1文字となる場合には、状態遷移機械110によって、次の状態を取得し、状態記憶部111と、状態遷移履歴の末尾にセットする必要がある。
ステップS2009では、圧縮ブロック列の終端に達しているか判定し、達していない場合は(NO)、ステップS2001で次の圧縮ブロック列を取得する。達していた場合は(YES)、検索処理を終了する。
ステップS2004で、現在の状態と、状態遷移履歴の圧縮ブロックの参照文字列の先頭の文字の状態が一致しない場合は(NO)、ステップS2010で参照文字列に最初の不一致文字を加えた文字列に対して状態遷移の履歴を求める。すなわち、図33の処理の流れと同様に、参照文字列に最初の不一致文字を加えた文字列の先頭から順に1文字ずつ取得しながら、状態遷移機械によって次の状態を取得する。ステップS2010の処理が終了したら、ステップS2008でスライド窓と状態遷移履歴を更新する。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列の文字数分の回数要する状態遷移の処理を、高々3回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZ77形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZ77形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長+1の長さの状態遷移履歴を記憶する。
スライド窓の末尾をバイトデータ記憶部として利用する。
LZ77形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで状態を1回の状態遷移で遷移させ、さらに参照文字列の末尾と不一致文字とで合わせて1文字となる場合にはその文字により状態を遷移させる。
実施の形態14.
実施の形態14を図35を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態10で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、LZSS方式で圧縮されたテキストを検索する場合について説明する。
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態13で図35を用いて説明したものと同様である。まず、圧縮ブロックの先頭のビットが1であった場合、すなわち圧縮辞書に参照文字列がある場合を考える。実施の形態13との主要な差異は、圧縮ブロックに不一致文字が無いことである。すなわち、ステップS2008やステップS2009、ステップS2010の処理で不一致文字を考慮しないこと以外は、実施の形態7と同様に検索することができる。
次に、圧縮ブロックの先頭のビットが0であった場合を考える。ここで、圧縮ブロックの不一致文字は常に1バイトである。このときは、ステップS2002以降の処理として、次の3通りがある。まず、不一致文字が1バイト文字であった場合である。この場合は、現在の状態と、不一致文字から次の状態を取得し、ステップS2005で状態記憶部111にセットし、ステップS2008の処理を実行する。不一致文字がバイトデータで、スライド窓の末尾にもバイトデータがある場合は、ステップS2003、ステップS2008の処理を実行する。不一致文字がバイトデータで、スライド窓の末尾にバイトデータが無い場合は、ステップS2008の処理を実行するだけでよい。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長に比例したステップ数要する状態遷移の処理を、高々2回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZSS形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
ここで示したLZSS形式以外にも、LZB形式やLZBW形式など、LZ77形式から派生した圧縮形式で圧縮されたテキストを、この実施の形態の圧縮テキスト検索装置によって同様に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZSS形式のスライド窓を記憶する。
状態遷移記憶部に、スライド窓長+1の長さの状態遷移履歴を記憶する。
スライド窓の末尾をバイトデータ記憶部として利用する。
LZSS形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで1回の状態遷移で状態を遷移させる。
実施の形態15.
実施の形態15を図32を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態10で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、LZ78方式で圧縮されたテキストを検索する場合について説明する。
この実施の形態による状態遷移記憶部は、図30に示したものと同様である。
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態12で説明したものとほぼ同様であるので、図32を援用して検索処理の流れを説明する。実施の形態12と異なる点のみを記述する。
LZ78形式で圧縮されたテキストを検索する場合には、ステップS1508の直前かステップS1510の直前で、圧縮辞書と状態遷移履歴にエントリを追加する必要がある。まず、圧縮ブロックの参照文字列に不一致文字を加えたものを、圧縮辞書の新たなエントリとして追加する。
不一致文字がバイトデータで、かつ参照文字列の末尾がバイトデータで無い場合や、不一致文字と参照文字列の末尾が共にバイトデータで、かつ合わせても1文字に満たない場合は、圧縮ブロックが参照する状態遷移履歴を、そのまま状態遷移記憶部112の新たなエントリとして追加する。
そして、そのバイトデータをバイトデータ記憶部122に追加する。不一致文字と参照文字列の末尾が共にバイトデータで合わせて1文字になる場合や、不一致文字が1バイト文字である場合は、その文字と現在の状態から次の状態を取得し、その取得した状態を状態記憶部と、状態遷移履歴の末尾にセットする。さらにその状態が受理状態であれば、ヒット位置を出力し、受理位置にも追加する。
ステップS1504で、現在の状態と圧縮ブロックの参照する状態遷移履歴の先頭の状態が一致しなかった場合は、状態遷移記憶部の新しいエントリには、ステップS1511で取得した状態遷移履歴を追加する。
ステップS1511では、参照文字列に不一致文字を加えた文字について、状態遷移履歴を求める。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列の文字数分の回数要する状態遷移の処理を、高々3回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZ78形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZ78形式の圧縮辞書を記憶する。
LZ78形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで1回の状態遷移で状態を遷移させさせる。さらに参照文字列の末尾と不一致文字とで合わせて1文字となる場合にはその文字により状態を遷移させる。
参照文字列と不一致文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
実施の形態16.
実施の形態16を図35を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態10で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、検索装置が扱う文字を表すビット列のビット長が、圧縮テキストの圧縮方式で想定している文字を表すビット列のビット長と異なる場合において、LZW方式で圧縮されたテキストを検索する場合について説明する。
この実施の形態の圧縮テキスト検索装置における検索処理の流れは、実施の形態15とほぼ同様であるので、図35を援用して検索処理の流れを説明する。実施の形態15の検索処理との差異は、圧縮ブロックに不一致文字が含まれないことである。この実施の形態の圧縮テキスト検索装置では、次の圧縮ブロックの先頭の文字を、実施の形態15の不一致文字の代わりに利用する。
以上のように、この実施の形態によれば、圧縮ブロック列を1個取得した後、現在の状態と、状態遷移履歴の参照位置の状態とを比較し、状態が一致した場合は、本来参照文字列長分の回数要する状態遷移の処理を、高々3回の状態遷移で処理することができ、処理ステップを削減することができる。
また、正規表現とテキストとの照合処理自体は、その正規表現を受理する、状態遷移機械を利用する。これにより、正規表現を含んだ検索条件によって、LZW形式で圧縮されたマルチバイトコード文字を含む圧縮テキストを高速に検索することができる。
同様にして、LZ78形式から派生した圧縮形式によって圧縮されたマルチバイトコード文字を含む圧縮テキストを、この実施の形態の圧縮テキスト検索装置によって高速に検索することができる。
ここで説明した圧縮テキスト検索装置は、以下の特徴を持つ。
圧縮辞書記憶部にLZW形式の圧縮辞書を記憶する。
LZW形式の圧縮ブロックを読み込み、現在の状態が圧縮ブロックが参照する状態遷移の履歴の先頭の状態と一致した場合に、参照文字列の末尾の文字まで1回の状態遷移で状態を遷移させさせる。さらに参照文字列の末尾と次の圧縮ブロックの参照文字列の先頭の文字とで合わせて1文字となる場合にはその文字により状態を遷移させる。
参照文字列と次の圧縮ブロックの参照文字列の先頭の文字からなる文字列を圧縮辞書の新たなエントリとして追加し、上記の状態遷移を状態遷移記憶部の新たなエントリとして追加する。
実施の形態17.
実施の形態17を図36を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、状態遷移記憶部112(履歴記憶部の一例)が記憶する状態履歴の内容の別の例について説明する。
図36は、この実施の形態による圧縮テキスト検索装置の、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図である。この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部112を、1つの圧縮辞書のエントリに対して複数の状態遷移履歴を記憶するように構成したものである。
この実施の形態の圧縮テキスト検索装置の状態遷移記憶部の1つのエントリは、エントリの参照番号2201と、状態遷移履歴2202、受理位置2203の情報を記憶する。参照番号1は、圧縮辞書の参照番号と1対1に対応する識別子である。
状態遷移履歴は、対応する圧縮辞書の文字列による状態遷移機械の、状態遷移の履歴を記憶したものであり、先頭が圧縮辞書の文字列を読む直前の状態、末尾が圧縮辞書の文字列を全て読んだ直後の状態をさす。
受理位置2203は、状態遷移履歴のどこで、状態遷移機械が受理状態に到達したかを表わしている。
この実施の形態の圧縮テキスト検索装置では、1つの状態遷移記憶部のエントリに、0以上の状態遷移履歴2202と受理位置2203の組を記憶する。状態遷移履歴2202と受理位置2203の組をレコードと呼ぶこととする。
この実施の形態の圧縮テキスト検索装置は、例えば、実施の形態1で説明した図7のステップS207で求めた状態遷移履歴と受理位置を、圧縮ブロックが参照する状態遷移記憶部のエントリの、新たなレコードとして追加する。
1つの圧縮ブロックに対して、状態履歴を1つしか記憶しない場合には、状態記憶部111が記憶した現在の状態と、状態遷移記憶部112の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致した時のみ、圧縮ブロックの参照文字列に対する状態遷移の回数を削減することができる。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、状態記憶部の現在の状態と、状態遷移記憶部の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致しているか判定する時、複数の状態遷移の履歴を記憶することができるため、状態が一致する確率を高めることができる。よって、より状態遷移の回数を削減することができる確率が高くなり、より検索処理を高速化することができる。
ここで説明した圧縮テキスト検索装置は、圧縮辞書の1つのエントリに対して、複数の状態遷移の履歴を記憶することを特徴とする。
実施の形態18.
実施の形態18を図37を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、状態遷移記憶部112(履歴記憶部の一例)が記憶する状態履歴の内容の別の例について説明する。
図37は、この実施の形態による圧縮テキスト検索装置の、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図である。この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部112を、スライド窓に対して複数の状態遷移履歴を記憶するように構成したものである。
この実施の形態の圧縮テキスト検索装置の状態遷移記憶部は、状態を(スライド窓の長さ+1)個分記憶する状態遷移履歴2304と受理位置2305の組から構成されるレコードを複数組備える。
この実施の形態の圧縮テキスト検索装置の検索処理の流れを説明する。
1つの圧縮ブロックに対して、状態履歴を1つしか記憶しない場合には、状態記憶部111が記憶した現在の状態と、状態遷移記憶部112の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致した時のみ、圧縮ブロックの参照文字列に対する状態遷移の回数を削減することができる。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、状態記憶部の現在の状態と、状態遷移記憶部の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致しているか判定する時、複数の状態遷移の履歴を記憶することができるため、状態が一致する確率を高めることができる。よって、より状態遷移の回数を削減することができる確率が高くなり、より検索処理を高速化することができる。
ここで説明した圧縮テキスト検索装置は、辞書中の1つの文字列に対して、LZ77形式およびLZSS形式から派生した圧縮形式のスライド窓に対して、複数の状態遷移の履歴を記憶することを特徴とする。
実施の形態19.
実施の形態19を図38を用いて説明する。
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態では、状態遷移記憶部112(履歴記憶部の一例)が記憶する状態履歴の内容の別の例について説明する。
図38は、この実施の形態による圧縮テキスト検索装置の、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図である。この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部112を、状態遷移の履歴の先頭と末尾の状態のみを記憶するように構成したものである。
この実施の形態の圧縮テキスト検索装置の状態遷移記憶部は、参照番号2401、状態遷移履歴の先頭の状態2402、状態遷移履歴の末尾の状態2403、受理位置2404を記憶する。この実施の形態の圧縮テキスト検索装置は、例えば、実施の形態1で説明した図7のステップS207で求めた状態遷移履歴の先頭と末尾の状態、受理位置のみを、状態遷移記憶部にセットする。
状態遷移記憶部112が状態遷移履歴を全部記憶する場合には、圧縮辞書のエントリの数と圧縮辞書の文字列の長さに応じて、記憶領域を必要とする。そのため、圧縮辞書のエントリの数や、圧縮辞書の文字列の長さが大きくなるとメモリなどの記憶容量を圧迫することがある。
この実施の形態の圧縮テキスト検索装置では、状態遷移の先頭の状態と末尾の状態、そして受理位置のみが分ればよい。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、状態遷移記憶部が必要とする記憶領域の大きさは、圧縮辞書の文字列の長さには依存せず、圧縮辞書のエントリの数の定数倍で抑えることができる。
ここで説明した圧縮テキスト検索装置は、辞書中の文字列に対して状態遷移の履歴を記憶する際に、履歴の先頭の状態と、末尾の状態のみを記憶することを特徴とする。
実施の形態20.
この実施の形態における圧縮テキスト検索装置100(文字列検索装置の一例)の外観、ハードウェア構成、ブロック構成は、実施の形態1で説明したものと同一なので、ここでは説明を省略する。
この実施の形態の圧縮テキスト検索装置は、状態遷移記憶部112を、圧縮ブロックの参照文字列の長さが、予め決められた長さ以上のときのみ、状態遷移の履歴をセットするようにしたものである。
例えば、図4を例にすると、参照文字列の長さが5以上の場合のみ、状態遷移履歴を記憶するとした場合、1番目の状態遷移のみを記憶する。
この実施の形態の圧縮テキスト検索装置は、状態記憶部111が記憶した現在の状態と、状態遷移記憶部112の圧縮ブロックが参照している状態遷移履歴の先頭の状態とが一致した場合に、圧縮ブロックの参照文字列に対する状態遷移を1ステップで処理することができる。このとき、削減できる処理のステップ数は、圧縮ブロックが参照している文字列の長さが長いほど大きくなる。すなわち、圧縮ブロックの参照文字列が短い場合には、処理のステップ数の削減効果は小さい。
この実施の形態の圧縮テキスト検索装置は、上記のように構成することで、圧縮辞書の文字列が短いエントリに対応した状態遷移履歴を記憶しなくて良いため、状態遷移記憶部の必要とする記憶領域を削減することができる。
ここで説明した圧縮テキスト検索装置は、辞書中の文字列に対して状態遷移の履歴を記憶する際に、予め定められた長さ以上の文字列に対してのみ、状態遷移の履歴を記憶することを特徴とする。
実施の形態17乃至実施の形態20で説明した状態遷移記憶部112が記憶する状態履歴の構成は、複数組み合わせて構成しても良い。
実施の形態1における圧縮テキスト検索装置100(文字列検索装置の一例)の外観の一例を示す図。 実施の形態1における圧縮テキスト検索装置のハードウェア構成の一例を示す図。 実施の形態1における圧縮テキスト検索装置100のブロック構成の一例を示すブロック図。 実施の形態1において、圧縮テキスト記憶部103が記憶した圧縮テキストの一例を示す図。 実施の形態1において、状態遷移記憶部112が記憶する状態履歴の構造を示す図。 実施の形態1において、状態遷移表記憶部106が記憶する状態遷移表200の一例を示す図。 実施の形態1における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図。 図7のS16における処理の詳細の一例を示すフローチャート図。 実施の形態2において、圧縮テキスト記憶部103及び状態遷移記憶部112が記憶する記憶内容の一例を示す図。 実施の形態2における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図。 LZ77形式による圧縮テキストの構造を示す図。 実施の形態3における、圧縮辞書記憶部113(辞書記憶部の一例)と状態遷移記憶部112(履歴記憶部の一例)の記憶する情報を示す図。 実施の形態3の圧縮テキスト検索装置100における検索処理の流れ図。 実施の形態4において、圧縮テキスト記憶部103及び状態遷移記憶部112の記憶内容の一例を示す図。 実施の形態4における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図。 LZSS形式による圧縮テキストの構造を示す図。 実施の形態6において、圧縮テキスト記憶部103及び圧縮辞書記憶部113(辞書記憶部の一例)及び状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図。 実施の形態6における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図。 LZ78形式による圧縮テキストの構造を示す図。 実施の形態7の圧縮テキスト検索装置における検索処理の流れ図。 実施の形態8において、圧縮テキスト記憶部103及び圧縮辞書記憶部113(辞書記憶部の一例)が記憶する記憶内容の一例を示す図。 実施の形態8において、状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図。 実施の形態8における圧縮テキスト検索装置100の検索処理の制御の流れの一例を示すフローチャート図。 LZW形式による圧縮テキストの構造を示す図。 圧縮技術において取り扱う文字を表現したビット列のビット長と、検索装置において取り扱う文字を表現したビット列のビット長とが異なっている場合について説明するための説明図。 実施の形態10における圧縮テキスト検索装置100のブロック構成の一例を示すブロック図。 実施の形態10において、圧縮テキスト記憶部103、圧縮辞書記憶部113(辞書記憶部の一例)、状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図。 実施の形態11において、圧縮テキスト記憶部103、圧縮辞書記憶部113(辞書記憶部の一例)、状態遷移記憶部112(履歴記憶部の一例)が記憶する記憶内容の一例を示す図。 実施の形態12による圧縮テキストの構造を示す図。 実施の形態12において、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図。 状態遷移表記憶部106が記憶する状態遷移表の一例を示す図。 実施の形態12の圧縮テキスト検索装置における検索処理の流れ図。 図32の検索処理の流れにおけるステップS1511の処理の流れ図。 実施の形態13による、圧縮辞書記憶部113と状態遷移記憶部112の記憶する情報を示す図。 実施の形態13の圧縮テキスト検索装置における検索処理の流れ図。 実施の形態17による圧縮テキスト検索装置の、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図。 実施の形態18による圧縮テキスト検索装置の、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図。 実施の形態19による圧縮テキスト検索装置の、状態遷移記憶部112が記憶する状態履歴の構造を示す構成図。 DFAの動作における状態の遷移の一例を示す概念図。 DFAの状態の遷移についての説明図。 オートマトン実行部がDFAを実行するために記憶する状態遷移表の一例を示す図。 オートマトン実行部の処理の流れの一例を示すフローチャート図。 DFAの一例を示す概念図。 LZSS方式における符号化の一例を示す図。 従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図。 LZ77方式における符号化の一例を示す図。 辞書参照型圧縮方式における符号化の一例を示す図。 LZ78方式における符号化の一例を示す図。 従来例において、符号列から元の文字列を復元する場合の制御の流れの一例を示すフローチャート図。 LZW方式における符号化の一例を示す図。
符号の説明
100 圧縮テキスト検索装置、102 検索条件入力部、103 圧縮テキスト記憶部、104 照合結果出力部、105 状態遷移表生成部、106 状態遷移表記憶部、107 照合部、108 圧縮ブロック取得部、109 文字取得部、110 状態遷移機械、111 状態記憶部、112 状態遷移記憶部、113 圧縮辞書記憶部、114 条件判断部、115 現在位置カウンタ、116 遷移先算出部、117 検索成功判別部、121 未完文字復元部、122 バイトデータ記憶部、200 状態遷移表、300 圧縮ブロック列、500 元の文字列、600 符号列、650 置換辞書、901 CRT表示装置、902 K/B、903 マウス、904 FDD、905 CDD、906 プリンタ装置、907 スキャナ装置、910 システムユニット、911 CPU、912 バス、913 ROM、914 RAM、915 通信ボード、920 磁気ディスク装置、921 OS、922 ウィンドウシステム、923 プログラム群、924 ファイル群、931 電話器、932 FAX機、940 インターネット、941 ゲートウェイ、942 LAN。

Claims (16)

  1. 状態を保持し、文字を入力し、上記保持した状態と上記入力した文字とに基づいて遷移先状態を算出し、上記保持した状態を上記算出した遷移先状態に更新するオートマトンであって、所定の文字列を構成する文字を入力した場合に、保持している状態が所定の状態となるか否かを判別することにより、所定の検索パターンに対応する検索文字列が上記文字列に含まれるか否かを判別できるよう構成したオートマトンを実行することによって、
    上記文字列に含まれる部分文字列を上記部分文字列に対応する所定の符号に置換した符号列を取得して、上記文字列から上記検索文字列を検索する文字列検索装置において、
    上記オートマトンを実行するオートマトン実行部と、
    上記オートマトンが保持した状態を状態履歴として記憶する履歴記憶部と、
    上記符号列を構成する符号を取得する符号取得部と、
    上記オートマトンが保持している現在の状態と、上記履歴記憶部が記憶した状態履歴と、上記符号取得部が取得した符号とに基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する1以上の文字のうちいずれかの文字について、上記文字以降の文字を以前に上記オートマトンが入力したことがあり、かつ、上記文字以降の文字を以前に上記オートマトンが入力する前に保持していた状態と、上記オートマトンが保持している現在の状態とが一致するか否かを判断する条件判断部と、
    上記条件判断部が一致すると判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて遷移先状態を算出し、上記オートマトンが保持している現在の状態を、算出した遷移先状態に更新する遷移先算出部と、
    上記条件判断部が一致すると判断しなかった場合に、上記符号取得部が取得した符号に対応する部分文字列を取得し、上記部分文字列を構成する文字を上記オートマトンに入力する文字列復元部とを有することを特徴とする文字列検索装置。
  2. 上記文字列検索装置は、上記オートマトンに入力する文字のビット長とは異なるビット長を有する文字から構成される部分文字列を上記部分文字列に対応する符号で置換した符号列を取得する文字列検索装置であって、更に、
    未完文字を記憶する未完文字記憶部を有し、
    上記文字列復元部は、
    上記復元した部分文字列に、上記ビット長の不一致により上記オートマトンに入力できない文字があるか否かを判断し、あると判断した場合に、上記未完文字として上記未完文字記憶部に記憶させることを特徴とする請求項に記載の文字列検索装置。
  3. 上記条件判断部は、
    上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較し、上記取得した未完文字と上記未完文字記憶部が現在記憶している未完文字とを比較し、両者ともに一致するか、少なくともいずれかが一致しないかを判断し、
    上記遷移先算出部は、
    上記条件判断部が両者ともに一致すると判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力した後に上記オートマトンが更新した状態を、上記履歴記憶部が記憶した状態履歴から取得して遷移先状態とし、上記オートマトンが保持している現在の状態を上記遷移先状態に更新し、
    上記履歴記憶部は、
    上記条件判断部が両者ともに一致すると判断しなかった場合に、上記符号取得部が取得した符号と、上記文字列復元部が復元した部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態及び上記未完文字記憶部が記憶した未完文字とを対応づけて状態履歴として記憶することを特徴とする請求項に記載の文字列検索装置。
  4. 上記文字列検索装置は、更に、
    上記未完文字記憶部が未完文字を記憶している場合に、上記符号取得部が次に取得した符号に対応する部分文字列のうち、上記未完文字と結合して上記オートマトンに入力できる文字となる部分を他の未完文字として復元し、上記未完文字と、上記他の未完文字とを結合した文字を上記オートマトンに入力する未完文字復元部を有することを特徴とする請求項に記載の文字列検索装置。
  5. 上記条件判断部は、
    上記未完文字記憶部が未完文字を記憶していない場合に、上記符号取得部が次に取得した符号について、上記符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較して一致するか否かを判断し、
    上記未完文字記憶部が未完文字を記憶している場合に、上記符号取得部が次に取得した符号について、上記符号に対応する部分文字列を構成する文字のうち上記未完文字復元部が復元した他の未完文字を除く部分を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持した状態とを比較して一致するか否かを判断し、
    上記遷移先算出部は、
    上記条件判断部が一致すると判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力した後に上記オートマトンが更新した状態を、上記履歴記憶部が記憶した状態履歴から取得して遷移先状態とし、上記オートマトンが記憶した状態を上記遷移先状態に更新し、
    上記履歴記憶部は、
    上記条件判断部が一致すると判断しなかった場合に、上記符号取得部が取得した符号と、上記文字列復元部が復元した部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態及び上記未完文字記憶部が記憶した未完文字とを対応づけて状態履歴として記憶することを特徴とする請求項に記載の文字列検索装置。
  6. 上記条件判断部は、
    上記未完文字記憶部が未完文字を記憶していない場合に、上記符号取得部が次に取得した符号について、上記符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較して一致するか否かを判断し、
    上記未完文字記憶部が未完文字を記憶している場合に、上記符号取得部が次に取得した符号について、上記符号に対応する部分文字列を構成する文字のうち上記未完文字復元部が復元した他の未完文字を除いた部分を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較して一致するか否かを判断し、
    上記遷移先算出部は、
    上記条件判断部が一致すると判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力した後に上記オートマトンが更新した状態を取得して遷移先状態とし、上記オートマトンが保持している現在の状態を上記遷移先状態に更新し、
    上記履歴記憶部は、
    上記条件判断部が一致すると判断しなかった場合に、上記オートマトンが保持している現在の状態及び上記未完文字記憶部が現在記憶している未完文字を状態履歴として記憶し、
    上記条件判断部が一致すると判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力したときに上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記状態履歴から取得して、状態履歴として記憶することを特徴とする請求項に記載の文字列検索装置。
  7. 上記条件判断部は、
    上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較し、上記取得した未完文字と上記未完文字記憶部が現在記憶している未完文字とを比較し、両者ともに一致するか、少なくともいずれかが一致しないかを判断し、
    上記遷移先算出部は、
    上記条件判断部が両者ともに一致すると判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力した後に上記オートマトンが更新した状態を取得して遷移先状態とし、上記オートマトンが保持している現在の状態を上記遷移先状態に更新し、
    上記履歴記憶部は、
    上記条件判断部が両者ともに一致すると判断しなかった場合に、上記オートマトンが保持している現在の状態及び上記未完文字記憶部が現在記憶している未完文字を状態履歴として記憶し、
    上記条件判断部が両者ともに一致すると判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態及び上記未完文字記憶部が記憶していた未完文字を、記憶した状態履歴から取得し、取得した状態及び未完文字を状態履歴として記憶することを特徴とする請求項に記載の文字列検索装置。
  8. 上記文字列検索装置は、上記文字列に含まれる部分文字列と上記文字列に含まれる他の部分文字列とが一致する場合に上記部分文字列を上記他の部分文字列へのポインタの情報を含む符号に置換した符号列を取得する文字列検索装置であって、
    上記文字列復元部は、
    上記符号取得部が取得した符号が上記他の部分文字列へのポインタの情報を含むと判断した場合に、上記他の部分文字列を上記符号に対応する部分文字列として取得し、
    上記符号取得部が取得した符号が上記他の部分文字列へのポインタの情報を含まないと判断した場合に、上記符号に対応する文字を上記符号に対応する文字列として復元し、復元した文字列を取得することを特徴とする請求項1乃至請求項のいずれかに記載の文字列検索装置。
  9. 上記条件判断部は、
    上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較して一致するか否かを判断し、
    上記遷移先算出部は、
    上記条件判断部が一致すると判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力した後に上記オートマトンが更新した状態を取得して遷移先状態とし、上記オートマトンが保持している現在の状態を上記遷移先状態に更新し、
    上記履歴記憶部は、
    上記条件判断部が一致すると判断しなかった場合に、上記オートマトンが保持している現在の状態を状態履歴として記憶し、
    上記条件判断部が一致すると判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、記憶した状態履歴から取得し、取得した状態を状態履歴として記憶することを特徴とする請求項1乃至請求項のいずれかに記載の文字列検索装置。
  10. 上記条件判断部は、上記オートマトンが保持している現在の状態と、上記履歴記憶部が記憶した状態履歴と、上記符号取得部が取得した符号とに基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する1以上の文字のうち先頭の文字について、上記文字以降の文字を以前に上記オートマトンが入力したことがあり、かつ、上記文字以降の文字を以前に上記オートマトンが入力する前に保持していた状態と、上記オートマトンが保持している現在の状態とが一致するか否かを判断し、
    上記文字列復元部は、上記条件判断部が一致すると判断しなかった場合に、上記符号取得部が取得した符号に対応する部分文字列を復元し、復元した部分文字列を取得することを特徴とする請求項1乃至請求項5のいずれかに記載の文字列検索装置。
  11. 上記文字列検索装置は、更に、
    部分文字列と上記部分文字列に対応する符号との対応関係を置換辞書として記憶する辞書記憶部を有し、
    上記文字列復元部は、
    上記辞書記憶部が記憶した置換辞書に基づいて、上記符号に対応する部分文字列を復元することを特徴とする請求項10に記載の文字列検索装置。
  12. 上記条件判断部は、
    上記符号取得部が取得した符号について、上記符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力する前に上記オートマトンが保持していた状態を、上記履歴記憶部が記憶した状態履歴から取得し、上記取得した状態と上記オートマトンが保持している現在の状態とを比較して一致するか否かを判断し、
    上記遷移先算出部は、
    上記条件判断部が一致すると判断した場合に、上記符号取得部が取得した符号に対応する部分文字列を構成する文字を以前に上記オートマトンに入力した後に上記オートマトンが更新した状態を、上記履歴記憶部が記憶した状態履歴から取得して遷移先状態とし、上記オートマトンが保持している現在の状態を上記遷移先状態に更新し、
    上記履歴記憶部は、
    上記条件判断部が一致すると判断しなかった場合に、上記符号取得部が取得した符号と、上記文字列復元部が復元した部分文字列を構成する文字を上記オートマトンに入力した後に上記オートマトンが更新した状態とを対応づけて状態履歴として記憶することを特徴とする請求項1乃至請求項5及び請求項10及び請求項11のいずれかに記載の文字列検索装置。
  13. 上記オートマトン実行部は、
    上記遷移先状態を一意に算出することができるオートマトンを実行することを特徴とする請求項1乃至請求項12のいずれかに記載の文字列検索装置。
  14. 上記オートマトン実行部は、
    文字の連結及び選択及び繰り返しのうち少なくともいずれかを表現した検索パターンに対応する検索文字列を検索できるよう構成したオートマトンを実行することを特徴とする請求項1乃至請求項13のいずれかに記載の文字列検索装置。
  15. コンピュータが実行することにより、上記コンピュータが請求項1乃至請求項14のいずれかに記載の文字列検索装置として機能することを特徴とするコンピュータプログラム。
  16. 状態を保持し、文字を入力し、上記保持した状態と上記入力した文字とに基づいて遷移先状態を算出し、上記保持した状態を上記算出した遷移先状態に更新するオートマトンであって、所定の文字列を構成する文字を入力した場合に、保持している状態が所定の状態となるか否かを判別することにより、所定の検索パターンに対応する検索文字列が上記文字列に含まれるか否かを判別できるよう構成したオートマトンを実行することによって、
    オートマトン実行部と履歴記憶部と符号取得部と条件判断部と遷移先算出部と文字列復元部とを有する文字列検索装置が、上記文字列に含まれる部分文字列を上記部分文字列に対応する所定の符号に置換した符号列を取得して、上記文字列から上記検索文字列を検索する文字列検索方法において、
    上記オートマトン実行部が、上記オートマトンを実行し、
    上記履歴記憶部が、上記オートマトンが保持した状態を状態履歴として記憶し、
    上記符号取得部が、上記符号列を構成する符号を取得し、
    上記条件判断部が、上記オートマトンが保持している現在の状態と、上記履歴記憶部が記憶した状態履歴と、上記符号取得部が取得した符号とに基づいて、上記符号取得部が取得した符号に対応する部分文字列を構成する1以上の文字のうちいずれかの文字について、上記文字以降の文字を以前に上記オートマトンが入力したことがあり、かつ、上記文字以降の文字を以前に上記オートマトンが入力する前に保持していた状態と、上記オートマトンが保持している現在の状態とが一致するか否かを判断し、
    上記遷移先算出部が、上記条件判断部が一致すると判断した場合に、上記履歴記憶部が記憶した状態履歴に基づいて遷移先状態を算出し、上記オートマトンが保持している現在の状態を、算出した遷移先状態に更新し、
    上記文字列復元部が、上記条件判断部が一致すると判断しなかった場合に、上記符号取得部が取得した符号に対応する部分文字列を取得し、上記部分文字列を構成する文字を上記オートマトンに入力することを特徴とする文字列検索方法。
JP2005124860A 2005-04-22 2005-04-22 文字列検索装置及びコンピュータプログラム及び文字列検索方法 Active JP4726046B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2005124860A JP4726046B2 (ja) 2005-04-22 2005-04-22 文字列検索装置及びコンピュータプログラム及び文字列検索方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005124860A JP4726046B2 (ja) 2005-04-22 2005-04-22 文字列検索装置及びコンピュータプログラム及び文字列検索方法

Publications (2)

Publication Number Publication Date
JP2006302082A JP2006302082A (ja) 2006-11-02
JP4726046B2 true JP4726046B2 (ja) 2011-07-20

Family

ID=37470276

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005124860A Active JP4726046B2 (ja) 2005-04-22 2005-04-22 文字列検索装置及びコンピュータプログラム及び文字列検索方法

Country Status (1)

Country Link
JP (1) JP4726046B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101382787B1 (ko) * 2013-03-21 2014-04-08 경기대학교 산학협력단 메모리 효율적인 결정적 유한 오토마타 구현을 위한 상태 감소 방법
US9337862B2 (en) * 2014-06-09 2016-05-10 Tidal Systems, Inc. VLSI efficient Huffman encoding apparatus and method
JP7383273B2 (ja) * 2018-10-02 2023-11-20 大学共同利用機関法人情報・システム研究機構 情報処理装置、情報処理回路、情報処理システム及び情報処理方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000090091A (ja) * 1998-09-08 2000-03-31 Fuji Xerox Co Ltd データ処理装置、文書処理装置、データ処理プログラムを記録したコンピュータ読み取り可能な記録媒体及び文書処理プログラムを記録したコンピュータ読み取り可能な記録媒体
JP2003242179A (ja) * 2002-02-05 2003-08-29 Internatl Business Mach Corp <Ibm> 文字列照合方法、これを用いた文書処理装置及びプログラム

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3455981B2 (ja) * 1992-12-07 2003-10-14 株式会社日立製作所 文字コード変換方法および装置
JPH10260980A (ja) * 1997-03-19 1998-09-29 Hitachi Ltd 圧縮検索方式

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000090091A (ja) * 1998-09-08 2000-03-31 Fuji Xerox Co Ltd データ処理装置、文書処理装置、データ処理プログラムを記録したコンピュータ読み取り可能な記録媒体及び文書処理プログラムを記録したコンピュータ読み取り可能な記録媒体
JP2003242179A (ja) * 2002-02-05 2003-08-29 Internatl Business Mach Corp <Ibm> 文字列照合方法、これを用いた文書処理装置及びプログラム

Also Published As

Publication number Publication date
JP2006302082A (ja) 2006-11-02

Similar Documents

Publication Publication Date Title
JP3273119B2 (ja) データ圧縮・伸長装置
JP3234104B2 (ja) 圧縮データをサーチする方法及びシステム
EP0490964B1 (en) Improved data compression apparatus
EP0293161B1 (en) Character processing system with spelling check function
AU702207B2 (en) Method of and apparatus for compressing and decompressing data and data processing apparatus and network system using the same
JP2502469B2 (ja) 文字デ―タを圧縮し圧縮済みデ―タを展開するための静的辞書構造を提供する方法および手段
JP3278297B2 (ja) データ圧縮方法及びデータ復元方法並びにデータ圧縮装置及びデータ復元装置
US7880648B2 (en) Information processing apparatus, information processing method, and computer product
KR100490240B1 (ko) 데이타압축장치,데이타복원장치,데이타압축방법,데이타복원방법및프로그램기록매체
US20160321282A1 (en) Extracting method, information processing method, computer product, extracting apparatus, and information processing apparatus
US6982661B2 (en) Method of performing huffman decoding
JP4003854B2 (ja) データ圧縮装置及び復元装置並びにその方法
JP2531508B2 (ja) デ―タ列圧縮の方法
JPH07226846A (ja) 入力データストリームの処理方法及び圧縮フォーマットの生成方法
JPS6356726B2 (ja)
JP4726046B2 (ja) 文字列検索装置及びコンピュータプログラム及び文字列検索方法
JPH10261969A (ja) データ圧縮方法および装置
JP2536422B2 (ja) デ―タ圧縮装置及びデ―タ復元装置
JPH0936747A (ja) データ圧縮方法及びデータ圧縮装置
JP3350118B2 (ja) データ符号化方式及びデータ復元方式
JP5807592B2 (ja) 符号化方法、符号化装置及びコンピュータプログラム
JP3241787B2 (ja) データ圧縮方式
JP2590287B2 (ja) データ圧縮方法およびデータ圧縮装置
JPH05152971A (ja) データ圧縮・復元方法
JP3761451B2 (ja) 記号列を格納するデータ構造、記号列検索装置、記号列検索方法、プログラム、ならびに、情報記録媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20080214

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100414

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100427

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100602

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20100818

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20100818

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100928

AA92 Notification that decision to refuse application was cancelled

Free format text: JAPANESE INTERMEDIATE CODE: A971092

Effective date: 20101012

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20101026

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20101112

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20101112

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20101207

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110301

AA92 Notification that decision to refuse application was cancelled

Free format text: JAPANESE INTERMEDIATE CODE: A971092

Effective date: 20110315

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110405

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110407

R150 Certificate of patent or registration of utility model

Ref document number: 4726046

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140422

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250