(57)【特許請求の範囲】
【請求項１】
テキストデータ内の文字列から順に文字を選択する文字選択手段と、
前記テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照し、前記ルートのノードから前記判断位置を開始し、前記判断位置のノードに対して前記文字選択手段で選択された文字に対応する子のノードが存在する場合、該子のノードに前記判断位置を移動し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達していない場合、前記ルートのノードに対する前記選択された文字に対応する子のノードに前記判断位置を移動し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達している場合、前記判断位置のノードに対して、新たな識別子を付与した、前記選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに前記判断位置を移動するノード追加手段と、
前記文節木記憶手段を参照し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードの付与された前記選択された文字の出現回数をカウントアップする頻度カウント手段と、
を有することを特徴とするテキスト処理装置。
【請求項２】
前記文節木記憶手段を参照し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードに付与された識別子を出力する識別子出力手段をさらに有することを特徴とする請求項１記載のテキスト処理装置。
【請求項３】
前記識別子出力手段は、前記テキストデータ内の文字列の最後の文字が選択されたことにより前記判断位置が移動されると、移動後の前記判断位置のノードに付与された識別子を出力することを特徴とする請求項２記載のテキスト処理装置。
【請求項４】
前記ノード追加手段は、子のノードの追加を、前記文節木のノードの数が所定数に達するまで行うことを特徴とする請求項１乃至３のいずれかに記載のテキスト処理装置。
【請求項５】
前記選択された文字の総量に応じて前記閾値を変更する閾値変更手段をさらに有することを特徴とする請求項１乃至４のいずれかに記載のテキスト処理装置。
【請求項６】
コンピュータが、
テキストデータ内の文字列から順に文字を選択し、
前記テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照し、
前記ルートのノードから前記判断位置を開始し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在する場合、該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達していない場合、前記ルートのノードに対する前記選択された文字に対応する子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達している場合、前記判断位置のノードに対して、新たな識別子を付与した、前記選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードの付与された前記選択された文字の出現回数をカウントアップする、
ことを特徴とするテキスト処理方法。
【請求項７】
コンピュータに、
テキストデータ内の文字列から順に文字を選択し、
前記テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照し、
前記ルートのノードから前記判断位置を開始し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在する場合、該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達していない場合、前記ルートのノードに対する前記選択された文字に対応する子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達している場合、前記判断位置のノードに対して、新たな識別子を付与した、前記選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードの付与された前記選択された文字の出現回数をカウントアップする、
処理を実行させることを特徴とするテキスト処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はテキストデータを処理するテキスト処理装置、テキスト処理方法、およびテキスト処理プログラムに関する。
【背景技術】
【０００２】
コンピュータシステムにおいて、テキストデータを処理対象とした情報処理を行う場合がある。例えば、テキストデータを対象とした情報検索が行われる。
近年、情報通信技術の用途の拡大に伴い、処理されるテキストデータの量が増加傾向にある。そこで、テキストデータを処理対象とした情報処理を効率化するためのさまざまな技術が考えられている。例えば、小容量のメモリを用いて、高速にデータソート処理を行うデータソート処理方法が考えられている。また、指定された項目に沿ったデータ集合の分割を効率よく行うことができるデータ集合分割方法も考えられている。
【０００３】
ところで、テキストデータを検索する場合、蓄積されたテキストデータの中から、検索キーワードに合致する文字列を効率的よく検出することで、処理の高速化が図れる。例えば、圧縮パターン照合技術がある。圧縮パターン照合では、テキストデータを圧縮して保存しておき、圧縮されたテキストを解凍せずにパターン照合が行われる。
【０００４】
圧縮パターン照合では、テキストデータを圧縮したまま検索できるように、入力されたテキストの中に含まれる部分文字列を、その部分文字列を一意に特定可能な符号に符号化する。テキストデータに含まれる部分文字列を符号化することで、元のテキストデータよりもデータ量を減少させることができる。
【０００５】
テキストの中の特定の文字列を符号化する際、出現頻度が高い部分文字列、または長い部分文字列を符号化すれば圧縮率が向上する。このような圧縮率の向上技術としてＳＴＶＦ（Suffix Tree based Variable-length-to-Fixed-length code）符号化技術が考えられている。
【０００６】
ＳＴＶＦ符号化技術では、頻度情報に基づいて刈り込んだ接尾辞木を文節木として、ＶＦ（Variable-length-to-Fixed-length code）符号化が行われる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００７−１１７８４号公報
【特許文献２】特開２００７−１１５４８号公報
【非特許文献】
【０００８】
【非特許文献１】Takuya Kida, "Suffix Tree Based VF-Coding for Compressed Pattern Matching" Hokkaido University, TCS Research Reports, TCS-TR-A-08-36, Division of Computer Science, 18 November 2008
【非特許文献２】Takuya Kida, "Suffix Tree Based VF-Coding for Compressed Pattern Matching," dcc, Proceedings of the 2009 Data Compression Conference, 16-18 March 2009, pp.449
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、ＳＴＶＦ符号化による文節木の作成には時間がかかるという問題がある。すなわち、ＳＴＶＦ符号化における接尾辞木の作成には、テキストデータ全体を解析することになるため処理に時間がかかる。しかも、接尾辞木の作成は、テキストデータの量が多いほど時間が多くかかる。
【００１０】
本発明はこのような点に鑑みてなされたものであり、テキストデータの高圧縮率での符号化に利用可能な文節木を効率的に作成することができるテキスト処理装置、テキスト処理方法、およびテキスト処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題を解決するために、文字選択手段、ノード追加手段、および頻度カウント手段、を有するテキスト処理装置が提供される。文字選択手段は、テキストデータ内の文字列から順に文字を選択する。ノード追加手段は、テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対してテキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照する。そしてノード追加手段は、ルートのノードから判断位置を開始し、判断位置のノードに対して文字選択手段で選択された文字に対応する子のノードが存在する場合、該子のノードに判断位置を移動する。またノード追加手段は、判断位置のノードに対して選択された文字に対応する子のノードが存在せず、かつ判断位置のノードに付与された選択された文字の出現回数が所定の閾値に達していない場合、ルートのノードに対する選択された文字に対応する子のノードに判断位置を移動する。さらにノード追加手段は、判断位置のノードに対して選択された文字に対応する子のノードが存在せず、かつ判断位置のノードに付与された選択された文字の出現回数が所定の閾値に達している場合、判断位置のノードに対して、新たな識別子を付与した、選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに判断位置を移動する。頻度カウント手段は、文節木記憶手段を参照し、判断位置のノードに対して選択された文字に対応するノードが存在しない場合、判断位置のノードの付与された選択された文字の出現回数をカウントアップする。
【００１２】
また、上記テキスト処理装置が実行する処理と同様の処理をコンピュータが実行するテキスト処理方法が提供される。さらに、上記テキスト処理装置が実行する処理と同様の処理をコンピュータに実行させるテキスト処理プログラムが提供される。
【発明の効果】
【００１３】
上記テキスト処理装置、テキスト処理方法、およびテキスト処理プログラムによれば、テキストデータの高圧縮率での符号化に利用可能な文節木を効率的に作成することができる。
【図面の簡単な説明】
【００１４】
【図１】実施の形態の概要を示す図である。
【図２】システム構成の一例を示す図である。
【図３】本実施の形態に用いるサーバのハードウェアの一構成例を示す図である。
【図４】要約トライのノード構造体の一例を示す図である。
【図５】要約トライの例を示す図である。
【図６】サーバの機能を示すブロック図である。
【図７】テキスト符号化部の詳細機能を示すブロック図である。
【図８】テキスト符号化処理の手順を示すフローチャートである。
【図９】要約トライ作成およびテキスト圧縮処理の手順を示すフローチャートである。
【図１０】要約トライ作成およびテキスト圧縮処理の手順を示すフローチャートである。
【図１１】初期状態の要約トライと圧縮済テキストの例を示す図である。
【図１２】１文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１３】２文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１４】３文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１５】４文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１６】５文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１７】６文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１８】７文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図１９】８文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図２０】９文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図２１】１０文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。
【図２２】位置「ｉ」の値が文字数「ｎ」より大きくなった後の要約トライと圧縮済テキストの例を示す図である。
【図２３】第３の実施の形態に係るサーバの機能を示す図である。
【図２４】第３の実施の形態に係るテキスト符号化部の詳細機能を示すブロック図である。
【図２５】第３の実施の形態に係るテキスト符号化処理の手順を示すフローチャートである。
【図２６】圧縮処理の詳細手順を示すフローチャートである。
【図２７】第４の実施の形態に係るテキスト符号化部の機能を示すブロック図である。
【図２８】閾値テーブル記憶部のデータ構造の一例を示す図である。
【図２９】第４の実施の形態に係るテキスト符号化処理の手順を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下、本実施の形態について図面を参照して説明する。
〔第１の実施の形態〕
図１は、実施の形態の概要を示す図である。テキスト処理装置１は、文字選択手段１ａ、ノード追加手段１ｂ、頻度カウント手段１ｃ、識別子出力手段１ｄを有する。
【００１６】
また、文節木記憶手段２は、文節木２ａを記憶する。文節木２ａは、テキストデータ３に出現し得る文字に対応する複数のノードがルート（根）のノードの子として木構造で予め関連付けられている。また文節木２ａは、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能である。さらに文節木２ａの各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与されている。
【００１７】
図１の例では、各ノードを丸印で表し、ノードを示す丸印の中に、該当ノードの識別子が示されている。また、文節木２ａは、ノード間を接続する矢印により、木構造におけるノード間の関係を示している。繋げられた２つのノードのうち、ルートのノードに近い方のノードが親のノード、ルートのノードから遠い方のノードが子のノードである。ノードを接続する矢印の横に、子のノードに対応する文字が示されている。
【００１８】
ルートのノードには、例えば初期状態から、テキストデータ３に含まれ得る各文字に対応する子のノードが設けられる。図１の例では、テキストデータ３に「ａ，ｂ，ｃ，ｄ」の４つの文字を含まれ得るものとし、識別子「０」のルートのノードには、識別子「１」〜「４」の４つの子のノードが設けられている。
【００１９】
文字選択手段１ａは、テキストデータ３内の文字列から順に文字を選択する。図１の例では、テキストデータ３に「ａｂｃａｂｃｄａｂｃ」という文字列が含まれている。例えば文字選択手段１ａは、「ａｂｃａｂｃｄａｂｃ」の左から順に文字を１文字ずつ選択する。
【００２０】
ノード追加手段１ｂは、文節木記憶手段２を参照する。そしてノード追加手段１ｂは、ルートのノードから判断位置を開始する。ノード追加手段１ｂは、判断位置のノードに対して文字選択手段１ａで選択された文字に対応する子のノードが存在する場合、該子のノードに判断位置を移動する。
【００２１】
またノード追加手段１ｂは、判断位置のノードに対して選択された文字に対応する子のノードが存在しない場合、判断位置のノードに付与された選択された文字の出現回数が所定の閾値に達しているか否かを判断する。判断位置のノードに付与された選択された文字の出現回数が所定の閾値に達していない場合、ノード追加手段１ｂは、ルートのノードに対する選択された文字に対応する子のノードに判断位置を移動する。他方、判断位置のノードに付与された選択された文字の出現回数が所定の閾値に達している場合、ノード追加手段１ｂは、判断位置のノードに対して、新たな識別子を付与した、選択された文字に対応する子のノードを追加する。このときノード追加手段１ｂは、追加した子のノードに判断位置を移動する。
【００２２】
例えば、ノード追加手段１ｂは、子のノードの追加を、文節木２ａのノードの数が所定数に達するまで行う。換言すると、ノード追加手段１ｂは、ノードの数が所定数を超えると、子のノードの追加を行わないようにすることができる。
【００２３】
なお、文節木２ａに追加されたノードは、ルートのノードから該当ノードまで辿ったときの経路上の各ノードに対応する文字の配列で示される部分文字列（文節）に対応する。すなわち、追加したノードの識別子が、そのノードに対応する文字列を表す符号となる。
【００２４】
頻度カウント手段１ｃは、文節木記憶手段２を参照する。そして頻度カウント手段１ｃは、判断位置のノードに対して選択された文字に対応するノードが存在しない場合、判断位置のノードの付与された選択された文字の出現回数をカウントアップする。例えば、頻度カウント手段１ｃは、判断位置のノードに付与された選択された文字の出現回数を「１」だけ増加させる。なお頻度カウント手段１ｃは、判断位置のノードに対して選択された文字に対応するノードが存在する場合についても、判断位置のノードの付与された選択された文字の出現回数をカウントアップするようにしてもよい。
【００２５】
また頻度カウント手段１ｃは、判断位置のノードに対して選択された文字に対応するノードが存在しない場合、ノード追加手段１ｂによる処理に先立って、出現回数をカウントアップすることができる。この場合、ノード追加手段１ｂは、カウントアップ後の出現回数について、閾値に達しているか否かを判断する。
【００２６】
識別子出力手段１ｄは、文節木記憶手段２を参照する。そして識別子出力手段１ｄは、判断位置のノードに対して選択された文字に対応する子のノードが存在しない場合、判断位置のノードに付与された識別子を出力する。また識別子出力手段１ｄは、テキストデータ３内の文字列の最後の文字が選択されたことにより判断位置が移動されると、移動後の判断位置のノードに付与された識別子も出力するようにしてもよい。ここで、識別子出力手段１ｄで出力された各識別子が、テキストデータ３内の部分文字列ごとの符号となる。そして、テキストデータ３内のすべての文字列に対応して識別子出力手段１ｄから出力された識別子の列が、テキストデータ３を符号化した符号語列４となる。識別子出力手段１ｄは、例えば、符号語列４を記憶装置に格納することができる。また、識別子出力手段１ｄは、符号語列４を、生成された符号から順次、ネットワークを介して送出することもできる。
【００２７】
このようなテキスト処理装置１によれば、文字選択手段１ａによりテキストデータ３内の文字列から順に選択される。すると、頻度カウント手段１ｃにより、判断位置のノードに付与された選択された文字の出現回数がカウントアップされる。
【００２８】
そして、判断位置のノードに対して選択された文字に対応する子のノードが存在する場合、ノード追加手段１ｂにより、判断位置が、判断位置のノードの選択された文字に対応する子のノードに変更される。これにより、選択された文字に対応する子のノードが存在する限り、文節木のルートから葉に向かって判断位置のノードが遷移する。
【００２９】
また判断位置のノードに対して選択された文字に対応する子のノードが存在せず、かつ判断位置のノードに付与された選択された文字の出現回数が閾値に達した場合、ノード追加手段１ｂにより文節木２ａへのノードの追加が行われる。すなわち、ノード追加手段１ｂにより、判断位置のノードに対する選択された文字に対応する子のノードが、文節木２ａに追加される。この場合、ノード追加手段１ｂにより、判断位置が追加された子のノードに移動される。
【００３０】
また、判断位置のノードに対して選択された文字に対応する子のノードが存在せず、かつ判断位置のノードに付与された選択された文字の出現回数が閾値に達しない場合、ノード追加手段１ｂにより、判断位置が移動される。すなわち、ノード追加手段１ｂにより、文節木２ａのルートのノードに対する選択された文字に対応する子のノードに、判断位置が移動される。これにより、選択された文字に対応する子のノードが存在しなければ、以後、ルートのノードに戻って、選択した文字を先頭とする部分文字列による文節木との照合が行われる。
【００３１】
さらに、判断位置のノードに対して選択された文字に対応する子のノードが存在しない場合、識別子出力手段１ｄにより、判断位置のノードに付与された識別子が出力される。そのため、テキストデータ３内のすべての文字が選択されることで、識別子出力手段１ｄからは、テキストデータ３全体を符号化した符号語列４が出力される。これにより、文節木２ａの構築処理と並行してテキストデータ３を符号化することが可能となっている。
【００３２】
このように、テキストデータ３内の文字を選択していくことで、出現頻度が所定値以上の文字列に対応するノードで構成される文節木２ａが生成される。また文節木２ａを符号化辞書として利用して、テキストデータ３が符号化され、符号語列４が出力される。
【００３３】
生成される文節木２ａは、出現頻度が高い部分文字列に対応するノードで構成されるため、文節木２ａを用いた符号化により、高圧縮率での符号化が可能である。
さらに、テキスト処理装置１による文節木２ａの構築は、ＳＴＶＦ符号化と比較すると、テキストデータ３全体からの接尾辞木の構築処理が必要ないため、短時間で行うことができる。しかも、文節木２ａの構築と並行してテキストデータ３の符号化が可能であるため、テキストデータ３の符号化についても効率的に行うことができる。例えばテキスト処理装置１による符号化は、ＳＴＶＦ符号化技術より２０倍ほど高速に符号化が可能である（符号化に要する時間が２０分の１）。
【００３４】
また、テキスト処理装置１によるテキストデータ３の符号化は、ＳＴＶＦ符号化と異なり、逐次処理が可能である。すなわち、ＳＴＶＦ符号化を用いた場合、テキストデータ３に基づいて接尾辞木を構築後、その接尾辞木の刈り込み（頻度の高い文字列に対応するノードのみを残す処理）が行われ、文節木が生成される（１パス目の処理）。そして、ＳＴＶＦ符号化では、生成された文節木を用いて、テキストデータ３が符号化される（２パス目の処理）。このようにＳＴＶＦ符号化では、２パスのアルゴリズムであるため、１パス目の処理が完了するまで、テキストデータの符号化は開始できず、逐次処理が困難であった。
【００３５】
他方、テキスト処理装置１では、テキストデータ３の先頭から順番に文字を選択し、その文字から文節木２ａの構築とテキストデータ３の符号化を実行することができる。そして、テキストデータ３内の各文字は、１回ずつ処理対象として選択すればよい。そのため、１文字ずつの逐次処理が可能となる。逐次処理が可能であるため、例えば、ネットワーク上を転送されるテキストデータ３を、通信遅延を最小限に抑えて、テキストデータ３内の部分文字列を逐次的に符号化して、生成された符号を随時転送することができる。
【００３６】
なお、逐次処理よりも圧縮率の向上を優先する場合、文節木２ａを構築後、その文節木２ａを用いてテキストデータ３の先頭の文字から順に再度選択し、符号化処理を行ってもよい。これによりテキストデータ３の圧縮率を高めることができる。
【００３７】
また文節木２ａは、符号語列４の高速な圧縮パターン照合を実現するための有利な性質を備えている。圧縮パターン照合とは、圧縮されたテキストに対して、解凍せずにパターン照合を行う技術である。高速な圧縮パターン照合に有利な圧縮技術の性質としては、ＶＦ符号化、静的な符号化辞書、より高い圧縮率が挙げられる。文節木２ａが高い圧縮率を備えていることは、前述の通りである。また、テキスト処理装置１で生成される文節木２ａは、符号として用いる各ノードの識別子のビット数を固定長とすることで、ＶＦ符号化が可能となる。符号が固定長であれば、符号間の区切りが明確であり、照合すべき文字列と符号語列４とを照合する際の処理負荷が少なくて済む。また文節木２ａに対するノードが所定数に達した時点で文節木２ａへのノードの追加を終了することで、それ以後の文節木２ａは静的な符号化辞書として利用できる。
【００３８】
このように、テキスト処理装置１では、高速な圧縮パターン照合に適した文節木２ａが作成できる。
〔第２の実施の形態〕
第２の実施の形態は、圧縮パターン照合による検索を行うシステムに対して、第１の実施の形態に係るテキスト符号化技術を適用したものである。
【００３９】
図２は、システム構成の一例を示す図である。図２の例では、サーバ１００に対して複数のクライアント２０１，２０２がネットワーク１０を介して接続されている。サーバ１００は、クライアント２０１，２０２から入力されたテキスト文書を符号化により圧縮し、保持する。また、サーバ１００は、クライアント２０１，２０２からのテキスト検索の要求に応答して、圧縮して保持したテキスト文書から検索要求（検索クエリ）に合致する文字を検索する。さらにサーバ１００は、クライアント２０１，２０２からの解凍要求に応答して、圧縮したテキスト文書を元の状態に解凍する。
【００４０】
クライアント２０１，２０２は、ユーザが使用するコンピュータである。ユーザは、クライアント２０１，２０２を操作して、クライアント２０１，２０２からサーバ１００へテキスト文書を送信することができる。またユーザは、クライアント２０１，２０２を操作して、クライアント２０１，２０２からサーバ１００へ、検索要求や解凍要求を送信することができる。
【００４１】
図３は、本実施の形態に用いるサーバのハードウェアの一構成例を示す図である。サーバ１００は、ＣＰＵ（Central Processing Unit）１０１によって装置全体が制御されている。ＣＰＵ１０１には、バス１０８を介してＲＡＭ（Random Access Memory）１０２と複数の周辺機器が接続されている。
【００４２】
ＲＡＭ１０２は、サーバ１００の主記憶装置として使用される。ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に必要な各種データが格納される。
【００４３】
バス１０８に接続されている周辺機器としては、ハードディスクドライブ（ＨＤＤ:Hard Disk Drive）１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、および通信インタフェース１０７がある。
【００４４】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、サーバ１００の二次記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
【００４５】
グラフィック処理装置１０４には、モニタ１１が接続されている。グラフィック処理装置１０４は、ＣＰＵ１０１からの命令に従って、画像をモニタ１１の画面に表示させる。モニタ１１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００４６】
入力インタフェース１０５には、キーボード１２とマウス１３とが接続されている。入力インタフェース１０５は、キーボード１２やマウス１３から送られてくる信号をＣＰＵ１０１に送信する。なお、マウス１３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００４７】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク１４に記録されたデータの読み取りを行う。光ディスク１４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク１４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００４８】
通信インタフェース１０７は、ネットワーク１０に接続されている。通信インタフェース１０７は、ネットワーク１０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００４９】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。なお、図３にはサーバ１００のハードウェア構成を示したが、クライアント２０１，２０２も同様のハードウェア構成で実現することができる。
【００５０】
次に、要約トライのデータ構造について説明する。要約トライは、トライ木（Trie）と呼ばれる順序付き木構造を有する。要約トライは、ノード（節点）を表すノード構造体がポインタで繋がれている。
【００５１】
図４は、要約トライのノード構造体の一例を示す図である。ノード構造体２０には、ノードＩＤ２１、ラベル２２、子ノードのカウンタリスト２３、および子ノードへのポインタリスト２４が設けられている。
【００５２】
ノードＩＤ２１は、ノード構造体２０を識別するための識別子である。ノードＩＤ２１には、ノード構造体２０の作成順に、１ずつインクリメントされた１以上の整数が代入される。ノードＩＤ２１は、圧縮符号として使用される。
【００５３】
ラベル２２は、ノード構造体２０に対応する文字である。子ノードのノード構造体２０が、親ノードのノード構造体の配下に、対応する文字に応じた所定の配列で接続される場合、その配列上の順番により各ノード構造体に対応する文字が特定できる。この場合、ノード構造体２０がラベル２２を有していなくてもよい。
【００５４】
子ノードのカウンタリスト２３には、処理対象のテキストデータに存在し得る文字の種類に応じたカウンタが設けられている。例えばテキストデータに存在し得る文字がアルファベットであれば、アルファベットの文字数分のカウンタが用意される。また、テキストデータに所定のコード体系による１バイト文字が存在し得る場合、２５６個のカウンタが用意される。子ノードのカウンタリスト２３に含まれる各カウンタは、子ノードに対応付けられている。子ノードに対応するカウンタには、ルートノードからノード構造体２０のノードに到達するまでの各ノードの文字列の次に、その子ノードに対応する文字が出現した回数が設定される。なお、各カウンタの初期値は「０」である。
【００５５】
子ノードへのポインタリスト２４には、処理対象のテキストデータに存在し得る文字の種類に応じたポインタが設けられている。例えばテキストデータに存在し得る文字がアルファベットであれば、アルファベットの文字数分のポインタが用意される。また、テキストデータに所定のコード体系による１バイト文字が存在し得る場合、２５６個のポインタが用意される。子ノードへのポインタリスト２４に含まれる各ポインタは、子ノードに対応付けられている。子ノードに対応するポインタには、子ノードのノード構造体を一意に特定する情報が設定される。各ポインタの初期値は「ＮＵＬＬ」である。
【００５６】
このようなノード構造体のノードを繋げることで、順序付き木構造（トライ）である要約トライが作成される。
図５は、要約トライの例を示す図である。図５の例では、テキストデータに存在し得る文字を「ａ，ｂ，ｃ，ｄ」とし、これらの文字を含む集合Σ（Σ＝｛ａ，ｂ，ｃ，ｄ｝）を定義している。この場合、Σに含まれる要素数（｜Σ｜）は、「４」となる。
【００５７】
要約トライ３０は、複数のノード３１〜３７で構成されている。各ノード３１〜３７は、図４に示したようなノード構造体を有する。各ノード３１〜３７における子ノードのカウンタリストには、ａ，ｂ，ｃ，ｄそれぞれに対応するカウンタが設けられている。各ノード３１〜３７における子ノードへのポインタリストには、ａ，ｂ，ｃ，ｄそれぞれに対応するポインタが設けられている。
【００５８】
ノード３１はルートノードであり、ノードＩＤは「０」である。ルートノードであるノード３１のラベルには「ｒｏｏｔ」と設定されている。ノード３２は文字「ａ」に対応するノードであり、ラベルには「ａ」と設定されている。ノード３２のノードＩＤは「１」である。ノード３３は文字「ｂ」に対応するノードであり、ラベルには「ｂ」と設定されている。ノード３３のノードＩＤは「２」である。ノード３４は文字「ｃ」に対応するノードであり、ラベルには「ｃ」と設定されている。ノード３４のノードＩＤは「３」である。ノード３５は文字「ｄ」に対応するノードであり、ラベルには「ｄ」と設定されている。ノード３５のノードＩＤは「４」である。ノード３６は文字「ｂ」に対応するノードであり、ラベルには「ｂ」と設定されている。ノード３６のノードＩＤは「５」である。ノード３７は文字「ｃ」に対応するノードであり、ラベルには「ｃ」と設定されている。ノード３７のノードＩＤは「６」である。
【００５９】
ノード３１に設けられた子ノードのカウンタリスト内のカウンタの値は、すべて「０」である。また、ノード３１に設けられた子ノードへのポインタリストには、子ノードである４つのノード３２〜３５へのポインタが設定されている。
【００６０】
なお図５では、ポインタとそのポインタが指し示すノードとを、矢印で接続している。また「ＮＵＬＬ」ポインタを、図中「・」で示している。
ノード３２に設けられた子ノードのカウンタリスト内の各カウンタのうち、文字「ｂ」に対応するカウンタのみ「２」が設定され、その他のカウンタの値は「０」である。図５の例では、カウンタの値が「２」に達すると、該当カウンタに対応する文字の子ノードが作成されるものとする。そこで、ノード３２の子ノードとして、文字「ｂ」に対応するノード３６が作成されている。ノード３２の文字「ｂ」に対応するポインタは、ノード３６を指し示している。
【００６１】
ノード３３〜３５には、値が「２」に達したカウンタがないため、子ノードも作成されていない。ノード３６は、文字「ｃ」に対応するカウンタが「２」となり、文字「ｃ」に対応する子ノードとしてノード３７が作成されている。
【００６２】
このような要約トライ３０を用いて文字列の符号化が可能となる。例えば、「ａ，ｂ，ｃ」の文字列は、ルートのノード３１からノード３７までの経路に対応する。そこで、文字列「ａ，ｂ，ｃ」をノード３７のノードＩＤ「６」に符号化することができる。
【００６３】
第２の実施の形態では、テキストデータの文字を１文字ずつ読み込み、順次、要約トライ３０の作成と文字列の符号化を行う。このように、要約トライの作成と文字列の符号化のストリーム処理を可能とすることで、テキストデータ符号化処理の効率化が可能となる。
【００６４】
図６は、サーバの機能を示すブロック図である。サーバ１００は、符号化辞書記憶部１１０、圧縮済テキスト記憶部１２０、テキスト符号化部１３０、検索部１４０、および解凍部１５０を有する。なお図６の例では、クライアント２０１から未圧縮テキスト４０が入力され、クライアント２０２から検索クエリ４１または解凍要求４３が入力されるものとする。
【００６５】
符号化辞書記憶部１１０は、符号化辞書として使用する要約トライを記憶する。例えば、ＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が符号化辞書記憶部１１０として使用される。
【００６６】
圧縮済テキスト記憶部１２０は、符号化によりデータ量が圧縮されたテキストデータ（圧縮済テキスト）を記憶する。例えば、ＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が圧縮済テキスト記憶部１２０として使用される。
【００６７】
テキスト符号化部１３０は、クライアント２０１から入力された未圧縮テキスト４０内の文字列を符号化し、データ量を圧縮する。なおテキスト符号化部１３０は、文字列を符号化する際に、要約トライ形式の符号化辞書を作成する。テキスト符号化部１３０は、作成した要約トライを、符号化辞書記憶部１１０に格納する。またテキスト符号化部１３０は、データ量が圧縮された圧縮済テキストを、圧縮済テキスト記憶部１２０に格納する。
【００６８】
検索部１４０は、クライアント２０２から入力された検索クエリに応答し、圧縮済テキスト記憶部１２０内の圧縮済テキストを参照し、検索クエリで指定される文字列に合致する文字列の未圧縮テキスト４０上での位置を特定する。なお、圧縮済テキストに対する検索には、例えば可変長情報源を固定長に符号化するＶＦ符号化技術で符号化されたＶＦ符号のパターン照合技術を用いることができる。なお圧縮されたテキストに対するパターン照合では、圧縮されたテキストを解凍せずにパターン照合を行うことができる。例えばＳＩＧＭＡ検索アルゴリズム、ＫＭＰ（Knuth-Morris-Pratt）アルゴリズム、ＡＣ（Aho-Corasick）アルゴリズムなどを用いたパターン照合が可能である。検索部１４０は、検索結果４２をクライアント２０２に送信する。検索結果４２には、例えば、検索でヒットした文字列の未圧縮テキスト４０内での位置（何文字目から何文字目か）が示される。
【００６９】
解凍部１５０は、クライアント２０２から入力された解凍要求に応答し、圧縮済テキスト記憶部１２０内の圧縮済テキストを解凍する。そして解凍部１５０は、解凍した解凍済テキスト４４をクライアント２０２に送信する。
【００７０】
次にテキスト符号化部１３０の詳細について説明する。
図７は、テキスト符号化部の詳細機能を示すブロック図である。テキスト符号化部１３０は、頻度閾値記憶部１３１、最大符号数記憶部１３２、文字選択部１３３、ノード作成部１３４、頻度カウント部１３５、および符号出力部１３６を有する。
【００７１】
頻度閾値記憶部１３１は、文字列の出現頻度の閾値を記憶する。例えば、ＲＡＭ１０２やＨＤＤ１０３の記憶領域の一部が、頻度閾値記憶部１３１として使用される。出現頻度が閾値を超えた文字列については、対応するノードが作成される。
【００７２】
最大符号数記憶部１３２には、要約トライに含まれる符号の最大数を示す最大符号数を記憶する。例えば、ＲＡＭ１０２やＨＤＤ１０３の記憶領域の一部が、最大符号数記憶部１３２として使用される。要約トライの符号数が最大符号数に達すると、それ以降予約トライは更新されない。
【００７３】
文字選択部１３３は、入力された未圧縮テキスト４０内の先頭から、文字を１文字ずつ選択する。文字選択部１３３は、選択した文字をノード作成部１３４、頻度カウント部１３５、および符号出力部１３６に渡す。なお、文字選択部１３３は、入力された未圧縮テキスト４０を、例えばＲＡＭ１０２内に一時的に格納しておき、ＲＡＭ１０２内から１文字ずつ文字を選択することができる。
【００７４】
ノード作成部１３４は、文字選択部１３３から文字を取得するごとに、要約トライに対するノードの作成の要否を判断する。なお、ノード作成部１３４は、要約トライに含まれるノードのうち、判断位置となるノードを示す情報（ノードポインタ）を管理している。そして、ノード作成部１３４は、判断位置のノードのノード構造体と取得した文字とを比較することで、ノードの作成の要否を判断する。ノードの作成が必要と判断した場合、ノード作成部１３４は、新たなノード構造体を作成し、そのノード構造体を符号化辞書記憶部１１０に格納されている要約トライに追加する。
【００７５】
頻度カウント部１３５は、文字選択部１３３から文字を取得すると、要約トライ内の判断位置のノードに設けられているカウンタを更新する。例えば、文字選択部１３３から取得した文字までの符号化されていない部分文字列に対応するノードがまだ作成されていない場合、頻度カウント部１３５は、その文字に対応するカウンタの値をカウントアップする。
【００７６】
符号出力部１３６は、文字選択部１３３から文字を取得するごとに、符号化されていない部分文字列に対応する符号の出力の要否を判断する。そして符号出力部１３６は、符号を出力する場合、要約トライ内のノードのノードＩＤを符号として圧縮済テキスト記憶部１２０に格納する。例えば、判断位置となるノードが要約トライの葉であり、文字選択部１３３が選択した文字に対応するノードが、判断位置となるノードの子ノードとして新たに作成されない場合、符号出力部１３６は符号を出力する。この場合、符号出力部１３６は、文字選択部１３３から取得した文字の直前の文字までの符号化されていない部分文字列を、判断位置となるノードのノードＩＤに符号化する。そして符号出力部１３６は、符号を圧縮済テキスト記憶部１２０に格納する。
【００７７】
次に、テキスト符号化処理の手順について詳細に説明する。なお、テキスト符号化処理の入力は、未圧縮テキスト４０、閾値、および最大符号数である。
ここで未圧縮テキスト４０に含まれる文字数を「ｎ」（ｎは１以上の整数）とする。そして、未圧縮テキスト４０内の文字列を、配列を用いてＴ＝Ｔ［１］，・・・，Ｔ［ｎ］と定義する。
【００７８】
また、閾値の値は、頻度閾値記憶部１３１から読み出され、変数「α」に設定される。さらに、最大符号数の値は、最大符号数記憶部１３２から読み出され、変数「Ｋ」に設定される。
【００７９】
テキスト符号化処理の出力は、要約トライと圧縮済テキストである。ここで要約トライを「Ｄ」とする。要約トライ「Ｄ」の構造は、図５に示したように、複数のノード構造体をポインタで関連付けたものである。また圧縮済テキストを「Ｃ＝Ｃｏｍｐｒｅｓｓ（Ｔ）」とする。圧縮済テキスト「Ｃ」は、符号化により生成された符号が、生成順に並べられた情報である。
【００８０】
テキスト符号化処理では、要約トライ「Ｄ」中の判断位置のノードを示すノードポインタ「Ｐ」が用いられる。例えばノードポインタ「Ｐ」には、判断位置のノードのノードＩＤが設定される。
【００８１】
また、要約トライの現在の大きさを「ｋ」とする。要約トライ「Ｄ」の大きさ「ｋ」は、その要約トライ「Ｄ」に含まれる符号数である。なお図５の例のように、要約トライのルートノードのノードＩＤを「０」とし、その他のノードに対して「１」から順にノードＩＤを付与した場合、要約トライ「Ｄ」に含まれる符号数はノードＩＤの最大値と等しくなる。
【００８２】
テキストデータ中の現在の処理対象の文字の位置を「ｉ」とする。位置ｉは、０以上の整数を採ることができる。文字の位置は、テキスト中の先頭からの該当文字の順番で表される。配列「Ｔ」のインデックスに、処理対象の文字の順番を示す位置「ｉ」を設定することで、処理対象の文字が抽出できる。
【００８３】
図８は、テキスト符号化処理の手順を示すフローチャートである。以下、図８に示す処理をステップ番号に沿って説明する。
［ステップＳ１１］テキスト符号化部１３０内の各要素は、それぞれ情報の初期化を行う。例えば文字選択部１３３は、文字の位置「ｉ」の値を「０」に初期化する。
【００８４】
ノード作成部１３４は、符号化辞書記憶部１１０内の要約トライ「Ｄ」を初期化する。初期化された要約トライ「Ｄ」は、すべてのアルファベットがカウント「０」で登録された状態を表している。例えばノード作成部１３４は、ルートノードのノード構造体を作成し、ルートノードのノード構造体の配下に、集合Σに含まれる各要素に対応する子ノードのノード構造体を繋げる。この際、ノード作成部１３４は、各ノードに含まれるカウンタの値はすべて「０」とする。またノード作成部１３４は、ルートノード以外の各ノードのポインタの値は「ＮＵＬＬ」とする。初期状態の符号数は集合Σ内の要素数であり、その要素数が、要約トライの大きさ「ｋ」に設定される。
【００８５】
さらにノード作成部１３４は、ノードポインタ「Ｐ」を初期化する。ノードポインタ「Ｐ」の初期値では、要約トライ「Ｄ」のルートノードが指し示され、「Ｐ＝ｒｏｏｔ（Ｄ）」と表される。
【００８６】
符号出力部１３６は、圧縮済テキスト記憶部１２０内の圧縮済テキストを初期化する。初期化された圧縮済テキストには、空文字列が設定され、「Ｃ＝ε」と表される。εは空文字列を意味する。
【００８７】
［ステップＳ１２］文字選択部１３３は、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、未圧縮テキスト４０内の１文字目が処理対象となる。
［ステップＳ１３］ノード作成部１３４は、位置「ｉ」の値が、文字数「ｎ」より大きいか否かを判断する。位置「ｉ」の値が文字数「ｎ」より大きければ、処理がステップＳ２０に進められる。位置「ｉ」の値が文字数「ｎ」以下であれば、処理がステップＳ１４に進められる。
【００８８】
［ステップＳ１４］位置「ｉ」の値が文字数「ｎ」以下であれば、ノード作成部１３４、頻度カウント部１３５、および符号出力部１３６が連携し、要約トライ作成およびテキスト圧縮処理を実行する。この処理の詳細は後述する（図９参照）。
【００８９】
［ステップＳ１５］文字選択部１３３は、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、未圧縮テキスト４０内の次の文字が処理対象となる。
［ステップＳ１６］ノード作成部１３４は、要約トライ「Ｄ」の大きさ「ｋ」が、最大符号数「Ｋ」未満か否かを判断する。要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」未満であれば、処理がステップＳ１３に進められる。要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」以上であれば、処理がステップＳ１７に進められる。
【００９０】
［ステップＳ１７］ノード作成部１３４は、位置「ｉ」の値が、文字数「ｎ」より大きいか否かを判断する。位置「ｉ」の値が文字数「ｎ」より大きければ、処理がステップＳ２０に進められる。位置「ｉ」の値が文字数「ｎ」以下であれば、処理がステップＳ１８に進められる。
【００９１】
［ステップＳ１８］位置「ｉ」の値が文字数「ｎ」以下であれば、符号出力部１３６は、テキスト圧縮処理を実行する。この処理の詳細は後述する（図１０参照）。
［ステップＳ１９］文字選択部１３３は、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、未圧縮テキスト４０内の次の文字が処理対象となる。その後、処理がステップＳ１７に進められる。
【００９２】
［ステップＳ２０］位置「ｉ」の値が文字数「ｎ」より大きくなると、符号出力部１３６は、ノードポインタ「Ｐ」が示すノードの符号を、圧縮済テキスト「Ｃ」の末尾に書き出す。その後、処理が終了する。
【００９３】
次に、要約トライ作成およびテキスト圧縮処理（ステップＳ１４）の詳細について説明する。
図９は、要約トライ作成およびテキスト圧縮処理の手順を示すフローチャートである。以下、図９に示す処理をステップ番号に沿って説明する。
【００９４】
［ステップＳ２１］ノード作成部１３４は、ノードポインタ「Ｐ」で示されるノードの子ノードの中に、処理対象の文字「Ｔ［ｉ］」に対応する子ノードが存在するか否かを判断する。具体的には、ノード作成部１３４は、文字選択部１３３からＴ［ｉ］に対応する文字を取得する。次にノード作成部１３４は、ノードポインタ「Ｐ」で示されるノードのノード構造体を参照し、取得した文字に対応するポインタの内容を確認する。該当ポインタが「ＮＵＬＬ」以外の有効な値であれば、取得した文字に対応する子ノードが存在する。
【００９５】
子ノードが存在する場合、処理がステップＳ２２に進められる。子ノードが存在しない場合、処理がステップＳ２３に進められる。
［ステップＳ２２］子ノードが存在する場合、ノード作成部１３４は、現在のノードポインタ「Ｐ」で指定されているノードの文字「Ｔ［ｉ］」に対応する子ノードを、新たにノードポインタ「Ｐ」の指定先とする。その後、要約トライ作成およびテキスト圧縮処理が終了し、図８のステップＳ１５に処理が進められる。
【００９６】
［ステップＳ２３］子ノードが存在しない場合、頻度カウント部１３５は、現在のノードポインタ「Ｐ」で指定されているノード内の、取得した文字に対応するカウンタの値を１増加させる。ノードポインタ「Ｐ」で示されるノードにおける文字「Ｔ［ｉ］」の出現頻度を表すカウンタの値は、「ｃｏｕｎｔ（Ｐ，Ｔ［ｉ］）」と表記できる。
【００９７】
［ステップＳ２４］ノード作成部１３４は、現在のノードポインタ「Ｐ」で指定されているノード内の、取得した文字に対応するカウンタ（ｃｏｕｎｔ（Ｐ，Ｔ［ｉ］））の値が、閾値「α」と等しいか否かを判断する。カウンタの値が閾値「α」と等しい場合、処理がステップＳ２５に進められる。等しくなければ、処理がステップＳ２８に進められる。
【００９８】
［ステップＳ２５］カウンタの値が閾値「α」と等しい場合、ノード作成部１３４は、現在のノードポインタ「Ｐ」で指定されているノードの配下に、文字「Ｔ［ｉ］」に対応する子ノードを作成する。具体的には、ノード作成部１３４は、新たなノードＩＤを付与したノード構造体を生成する。例えばノード作成部１３４は、最後に作成したノードのノードＩＤを記憶しておき、そのノードＩＤに１を加算した値を、作成したノードのノードＩＤとする。作成されたノードのラベルは、文字「Ｔ［ｉ］」である。また作成されたノード構造体内の各カウンタおよび各ポインタには初期値が設定される。そしてノード作成部１３４は、現在のノードポインタ「Ｐ」で指定されているノードにおける文字「Ｔ［ｉ］」に対応するポインタに、新たに作成したノードを指し示す値を設定する。
【００９９】
［ステップＳ２６］ノード作成部１３４は、ノードポインタ「Ｐ」の指定先を、ステップＳ２５で新たに作成した子ノードとする。
［ステップＳ２７］ノード作成部１３４は、要約トライ「Ｄ」の大きさ「ｋ」の値をインクリメントする。その後、要約トライ作成およびテキスト圧縮処理が終了し、図８のステップＳ１５に処理が進められる。
【０１００】
［ステップＳ２８］ステップＳ２４でカウンタの値が閾値「α」と等しくないと判断された場合、符号出力部１３６は、ノードポインタ「Ｐ」で指定されたノードの符号を、圧縮済テキスト「Ｃ」の末尾に書き出す。
【０１０１】
［ステップＳ２９］ノード作成部１３４は、ノードポインタ「Ｐ」の指定先を、ルートノードの子ノードのうちの、文字「Ｔ［ｉ］」に対応するルートノードの子ノードとする。その後、要約トライ作成およびテキスト圧縮処理が終了し、図８のステップＳ１５に処理が進められる。
【０１０２】
次に、テキスト圧縮処理（ステップＳ１８）の詳細について説明する。
図１０は、要約トライ作成およびテキスト圧縮処理の手順を示すフローチャートである。以下、図１０に示す処理をステップ番号に沿って説明する。
【０１０３】
［ステップＳ３１］符号出力部１３６は、ノードポインタ「Ｐ」で示されるノードの子ノードの中に、処理対象の文字「Ｔ［ｉ］」に対応する子ノードが存在するか否かを判断する。子ノードが存在する場合、処理がステップＳ３２に進められる。子ノードが存在しない場合、処理がステップＳ３３に進められる。
【０１０４】
［ステップＳ３２］子ノードが存在する場合、符号出力部１３６は、現在のノードポインタ「Ｐ」で指定されているノードの文字「Ｔ［ｉ］」に対応する子ノードを、新たにノードポインタ「Ｐ」の指定先とする。その後、テキスト圧縮処理が終了し、図８のステップＳ１９に処理が進められる。
【０１０５】
［ステップＳ３３］子ノードが存在しない場合、符号出力部１３６は、ノードポインタ「Ｐ」で指定されたノードの符号を、圧縮済テキスト「Ｃ」の末尾に書き出す。
［ステップＳ３４］符号出力部１３６は、ノードポインタ「Ｐ」の指定先を、ルートノードの子ノードのうちの、文字「Ｔ［ｉ］」に対応する子ノードとする。その後、要約トライ作成およびテキスト圧縮処理が終了し、図８のステップＳ１９に処理が進められる。
【０１０６】
このようにして、要約トライ「Ｄ」と圧縮済テキスト「Ｃ」とが作成される。ここで、カウンタの値が閾値「α」に達した場合にのみ要約トライ「Ｄ」に対して子ノードを追加するため、出現頻度の高い文字列に対応するノードのみ作成することができる。
【０１０７】
しかも要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」以上となると、要約トライ「Ｄ」は更新されずテキスト圧縮処理による圧縮済テキスト「Ｃ」の作成のみが継続される。すなわち、要約トライ「Ｄ」の大きさが最大符号数を超えたら、要約トライ「Ｄ」のノードカウンタが閾値「α」を超えても、新たなノードは作られない。これにより、要約トライ「Ｄ」の大きさは所定値以下に抑制される。
【０１０８】
次に、具体的な要約トライと圧縮済テキストとの生成例について説明する。
図１１は、初期状態の要約トライと圧縮済テキストの例を示す図である。図１１の例では、未圧縮テキスト４０に含まれ得る文字が「ａ，ｂ，ｃ，ｄ」の４文字であるものとする。すなわち、集合Σ＝｛ａ，ｂ，ｃ，ｄ｝であり、アルファベットサイズ（｜Σ｜）＝４である。入力された未圧縮テキスト４０内の文字列を”ａｂｃａｂｃｄａｂｃ”とする。すなわち、配列Ｔ＝”ａｂｃａｂｃｄａｂｃ”となる。また、閾値「α＝２」、最大符号数「Ｋ＝２５６」であるものとする。最大符号数が「２５６（２の８乗）」であるということは、符号が１バイトの固定長であることを示す。
【０１０９】
初期化フェーズにおいて、初期状態の要約トライ５０が作成される。作成された要約トライ５０は、５つのノード５１〜５５を有する。ノード５１は、ルートノードである。ノード５２〜５５は、それぞれ文字「ａ，ｂ，ｃ，ｄ」に対応するノード５１の子ノードである。ノード５１には、子ノードであるノード５２〜５５それぞれへのポインタが設定されている。
【０１１０】
初期状態では、各ノード５１〜５５内のカウンタの値はすべて「０」である。また初期状態では、ノードポインタ「Ｐ」はノード５１を指し示している（Ｐ＝ｒｏｏｔ（Ｄ））。なお図１１の例では、ノードポインタ「Ｐ」で指し示されるノードに、「Ｐ」の文字が書かれた旗の図形を付与している。
【０１１１】
圧縮済テキスト６０には、初期化処理により空文字列（ε）が設定される。また処理対象の文字の位置「ｉ」には、「０」が設定される。
図１１に示した状態から位置「ｉ」がインクリメントされ、ｉ＝１とされる。そして、未圧縮テキスト４０内の先頭の文字「ａ」が処理対象として選択される。
【０１１２】
図１２は、１文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。初期状態においてノードポインタ「Ｐ」で指定されていたルートのノード５１には、すべての文字に対応する子ノードが存在する。そこで、１文字目の文字「ａ」に応じて、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ａ」に対応するノード５２に変更される。この際、圧縮済テキスト６０への符号の書き出しは行われない。
【０１１３】
図１２に示した状態から位置「ｉ」がインクリメントされ、ｉ＝２とされる。そして、未圧縮テキスト４０内の２文字目の文字「ｂ」が処理対象として選択される。
図１３は、２文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５２には、文字「ｂ」に対応する子ノードが存在しない。そこで、ノード５２内の文字「ｂ」に対応するカウンタが「１」にカウントアップされている（ｃｏｕｎｔ（１，ｂ）＝１）。このとき、ｃｏｕｎｔ（１，ｂ）＜αである。そこで、圧縮済テキスト６０」の末尾に、ノード５２に対応する符号「１」が書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１」となる。そして、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ｂ」に対応するノード５３に変更される。
【０１１４】
図１３に示した状態から位置「ｉ」がインクリメントされ、ｉ＝３とされる。そして、未圧縮テキスト４０内の３文字目の文字「ｃ」が処理対象として選択される。
図１４は、３文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５３には、文字「ｃ」に対応する子ノードが存在しない。そこで、ノード５３内の文字「ｃ」に対応するカウンタが「１」にカウントアップされている（ｃｏｕｎｔ（２，ｃ）＝１）。このとき、ｃｏｕｎｔ（２，ｃ）＜αである。そこで、圧縮済テキスト６０の末尾に、ノード５３に対応する符号「２」が書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１２」となる。そして、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ｃ」に対応するノード５４に変更される。
【０１１５】
図１４に示した状態から位置「ｉ」がインクリメントされ、ｉ＝４とされる。そして、未圧縮テキスト４０内の４文字目の文字「ａ」が処理対象として選択される。
図１５は、４文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５４には、文字「ａ」に対応する子ノードが存在しない。そこで、ノード５４内の文字「ａ」に対応するカウンタが「１」にカウントアップされている（ｃｏｕｎｔ（３，ａ）＝１）。このとき、ｃｏｕｎｔ（３，ａ）＜αである。そこで、圧縮済テキスト６０の末尾に、ノード５４に対応する符号「３」が書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１２３」となる。そして、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ａ」に対応するノード５２に変更される。
【０１１６】
図１５に示した状態から位置「ｉ」がインクリメントされ、ｉ＝５とされる。そして、未圧縮テキスト４０内の５文字目の文字「ｂ」が処理対象として選択される。
図１６は、５文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５２には、文字「ｂ」に対応する子ノードが存在しない。そこで、ノード５２内の文字「ｂ」に対応するカウンタが「２」にカウントアップされている（ｃｏｕｎｔ（１，ｂ）＝２）。このとき、ｃｏｕｎｔ（１，ｂ）＝αである。そこで、ノード５２の文字「ｂ」に対応する子ノードとしてノード５６が作成される。この際、ノード５２の文字「ｂ」に対応するポインタには、ノード５６を示す値が設定される。新たに作成されたノード５６には、ノードＩＤ「５」が付与され、ラベル「ｂ」が設定される。ノード５６内のカウンタとポインタとには、初期値が設定される。そして、ノードポインタ「Ｐ」の指定先が、新たに作成したノード５６に変更される。この際、圧縮済テキスト６０への符号の書き出しは行われない。
【０１１７】
図１６に示した状態から位置「ｉ」がインクリメントされ、ｉ＝６とされる。そして、未圧縮テキスト４０内の６文字目の文字「ｃ」が処理対象として選択される。
図１７は、６文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５６には、文字「ｃ」に対応する子ノードが存在しない。そこで、ノード５６内の文字「ｃ」に対応するカウンタが「１」にカウントアップされている（ｃｏｕｎｔ（５，ｃ）＝１）。このとき、ｃｏｕｎｔ（５，ｃ）＜αである。そこで、圧縮済テキスト６０の末尾に、ノード５６に対応する符号「５」が書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１２３５」となる。そして、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ｃ」に対応するノード５４に変更される。
【０１１８】
図１７に示した状態から位置「ｉ」がインクリメントされ、ｉ＝７とされる。そして、未圧縮テキスト４０内の７文字目の文字「ｄ」が処理対象として選択される。
図１８は、７文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。図１７の状態のままではノード５４には、文字「ｄ」に対応する子ノードが存在しない。そこで、ノード５４内の文字「ｄ」に対応するカウンタが「１」にカウントアップされている（ｃｏｕｎｔ（３，ｄ）＝１）。このとき、ｃｏｕｎｔ（３，ｄ）＜αである。そこで、圧縮済テキスト６０の末尾に、ノード５４に対応する符号「３」が書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１２３５３」となる。そして、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ｄ」に対応するノード５５に変更される。
【０１１９】
図１８に示した状態から位置「ｉ」がインクリメントされ、ｉ＝８とされる。そして、未圧縮テキスト４０内の８文字目の文字「ａ」が処理対象として選択される。
図１９は、８文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５５には、文字「ａ」に対応する子ノードが存在しない。そこで、ノード５５内の文字「ａ」に対応するカウンタが「１」にカウントアップされている（ｃｏｕｎｔ（４，ａ）＝１）。このとき、ｃｏｕｎｔ（４，ａ）＜αである。そこで、圧縮済テキスト６０の末尾に、ノード５５に対応する符号「４」が書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１２３５３４」となる。そして、ノードポインタ「Ｐ」の指定先が、ノード５１の子ノードのうちの「ａ」に対応するノード５２に変更される。
【０１２０】
図１９に示した状態から位置「ｉ」がインクリメントされ、ｉ＝９とされる。そして、未圧縮テキスト４０内の９文字目の文字「ｂ」が処理対象として選択される。
図２０は、９文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。ノード５２には、文字「ｂ」に対応する子ノードが存在する。そこで、９文字目の文字「ｂ」に応じて、ノードポインタ「Ｐ」の指定先が、ノード５２の子ノードのうちの「ｂ」に対応するノード５６に変更される。この際、圧縮済テキスト６０への符号の書き出しは行われない。
【０１２１】
図２０に示した状態から位置「ｉ」がインクリメントされ、ｉ＝１０とされる。そして、未圧縮テキスト４０内の１０文字目の文字「ｃ」が処理対象として選択される。
図２１は、１０文字目を処理した後の要約トライと圧縮済テキストの例を示す図である。図２０の状態のままではノード５６には、文字「ｃ」に対応する子ノードが存在しない。そこで、ノード５６内の文字「ｃ」に対応するカウンタが「２」にカウントアップされている（ｃｏｕｎｔ（５，ｃ）＝２）。このとき、ｃｏｕｎｔ（５，ｃ）＝αである。そこで、ノード５２の文字「ｃ」に対応する子ノードとしてノード５７が作成される。この際、ノード５６の文字「ｃ」に対応するポインタには、ノード５７を示す値が設定される。新たに作成されたノード５７には、ノードＩＤ「６」が付与され、ラベル「ｃ」が設定される。ノード５７内のカウンタとポインタとには、初期値が設定される。そして、ノードポインタ「Ｐ」の指定先が、新たに作成したノード５７に変更される。この際、圧縮済テキスト６０への符号の書き出しは行われない。
【０１２２】
図２１に示した状態から位置「ｉ」がインクリメントされ、ｉ＝１１とされる。テキストには１１文字目は存在しない。そのため位置「ｉ」の値が文字数「ｎ」より大きくなる。
【０１２３】
図２２は、位置「ｉ」の値が文字数「ｎ」より大きくなった後の要約トライと圧縮済テキストの例を示す図である。位置「ｉ」の値が文字数「ｎ」より大きくなると、要約トライ５０の構築処理は終了する。そして、ノードポインタ「Ｐ」で示されるノード５７の符号が圧縮済テキスト６０に書き出される。その結果、圧縮済テキスト６０は「Ｃ＝１２３５３４６」となる。
【０１２４】
このようにして、未圧縮テキストデータに基づいて、要約トライ５０と圧縮済テキスト６０とが作成される。第２の実施の形態に示したテキスト符号化技術を用いると、ＳＴＶＦのような接尾辞木の作成が不要となる。接尾辞木は、すべてのテキストデータを読み込んで作成されるため、構築に時間がかかる。そのため第２の実施の形態に示したテキスト符号化技術は、接尾辞木を作成せずに済むことにより、ＳＴＶＦより２０倍ほど高速に符号化を行うことができる。
【０１２５】
しかも、第２の実施の形態に示したテキスト符号化技術では、テキスト内の文字を先頭から１文字ずつ読み込んで、逐次処理（ストリーム処理）が可能である。逐次処理ができれば、例えば、コンピュータ間の通信における送信データの符号化に利用できる。すなわち、ＳＴＶＦのようにすべてのテキストデータから接尾辞木を構築し、その接尾辞木から文節木を作成後にテキストデータの符号化を行う場合、送信データの全体を読み込むまで、符号化されたデータを作成できない。そのため、ストリーム処理が困難となる。一方、第２の実施の形態に示したテキスト符号化技術では、送信データの先頭から順に符号化することができ、符号化したデータを順次送信できる。これにより、符号化による通信遅延を最小限に抑えることができる。
【０１２６】
〔第３の実施の形態〕
第３の実施の形態は、複数の未圧縮テキストを圧縮し、文字検索の対象とすることができるようにしたものである。
【０１２７】
図２３は、第３の実施の形態に係るサーバの機能を示す図である。第３の実施の形態にかかるサーバ１００ａは、符号化辞書記憶部１１０ａ、圧縮済テキスト記憶部１２０ａ、テキスト符号化部１３０ａ、検索部１４０ａ、および解凍部１５０ａを有する。
【０１２８】
符号化辞書記憶部１１０ａと圧縮済テキスト記憶部１２０ａとは、それぞれ図６に示した第２の実施の形態の同名の要素と同じ機能を有する。
テキスト符号化部１３０ａは、図６に示した第２の実施の形態のテキスト符号化部１３０が有する機能に加え、複数の未圧縮テキスト７１，７２，７３を区別するための制御記号を圧縮済テキスト８０に挿入する機能を有する。制御記号としては、要約トライで割り当てる符号と重複しない記号を用いる。例えば、図２３の例では、圧縮済テキスト８０内に、未圧縮テキスト７１〜７３の区切りを示す制御記号として「＄」が挿入されている。
【０１２９】
検索部１４０ａは、図６に示した第２の実施の形態の検索部１４０が有する機能に加え、検索結果内に、ヒットした文字列を含む未圧縮テキストを示す情報を含める機能を有する。例えば、圧縮済テキスト８０内での順番によって、ヒットした文字列を含む未圧縮テキストが示される。例えば、検索部１４０ａは、検索でヒットした文字列の位置よりも前にある制御記号「＄」の数を数え、その数に１を加算した番号を、該当文字列を含む未圧縮テキストの順番として、検索結果４２に含める。
【０１３０】
解凍部１５０ａは、図６に示した第２の実施の形態の解凍部１５０が有する機能に加え、未圧縮テキストの順番を指定した解凍要求４３を受け取った場合、圧縮済テキスト８０内の指定された順番の符号語列を解凍する機能を有する。例えば解凍部１５０ａは、圧縮済テキスト８０を、制御記号を境界として分割し、複数の符号語列を生成する。そして解凍部１５０ａは、圧縮済テキスト８０の先頭からの符号語列の順番を数え、要求された順番の符号語列を解凍し、解凍済テキスト４４とする。
【０１３１】
図２４は、第３の実施の形態に係るテキスト符号化部の詳細機能を示すブロック図である。テキスト符号化部１３０ａは、頻度閾値記憶部１３１ａ、最大符号数記憶部１３２ａ、文字選択部１３３ａ、ノード作成部１３４ａ、頻度カウント部１３５ａ、符号出力部１３６ａ、および制御記号出力部１３７を有する。頻度閾値記憶部１３１ａ、最大符号数記憶部１３２ａ、文字選択部１３３ａ、ノード作成部１３４ａ、頻度カウント部１３５ａ、および符号出力部１３６ａは、図７に示した第２の実施の形態における同名の要素と同じ機能を有している。
【０１３２】
制御記号出力部１３７は、符号出力部１３６ａが圧縮済テキスト記憶部１２０ａに対して、１つの未圧縮テキストから生成した最後の符号（図８のステップＳ２０で格納される符号）を出力したことを検出する。そして、制御記号出力部１３７は、１つの未圧縮テキストの末尾（最後の符号の後）に制御記号「＄」を格納する。
【０１３３】
次に、テキスト符号化処理の手順について詳細に説明する。なお、テキスト符号化処理の入力は、テキスト数Ｍ個（Ｍは１以上の整数）の未圧縮テキスト７１，７２，７３、閾値、および最大符号数である。ここでＭ個の未圧縮テキスト７１，７２，７３，・・・それぞれに含まれるテキストデータ列を、Ｔ１，・・・，ＴＭとする。また、現在処理対象としている未圧縮テキストを識別するテキスト番号を「ｍ」（ｍは１以上の整数）とする。また、テキスト間の境界を示す制御記号を「＄」とする。その他の記号の意味は第２の実施の形態と同様である。
【０１３４】
図２５は、第３の実施の形態に係るテキスト符号化処理の手順を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。
［ステップＳ４１］サーバ１００ａ内の各要素は、それぞれ情報の初期化を行う。例えば文字選択部１３３ａは、文字の位置「ｉ」の値を「０」に初期化する。また文字選択部１３３ａは、テキスト番号「ｍ」の値を「１」に初期化する。
【０１３５】
ノード作成部１３４ａは、符号化辞書記憶部１１０ａ内の要約トライ「Ｄ」を初期化する。さらにノード作成部１３４ａは、ノードポインタ「Ｐ」を初期化する。符号出力部１３６ａは、圧縮済テキスト記憶部１２０ａ内の圧縮済テキストを初期化する。初期化された圧縮済テキストには、空文字列が設定され、「Ｃ＝ε」と表される。εは空文字列を意味する。
【０１３６】
［ステップＳ４２］文字選択部１３３ａは、テキスト番号「ｍ」がテキスト数「Ｍ」とより大きいか否かを判断する。テキスト番号がテキスト数より大きい場合、処理が終了する。テキスト番号がテキスト数以下であれば、処理がステップＳ４３に進められる。
【０１３７】
［ステップＳ４３］文字選択部１３３ａは、「ｍ」番目のテキストデータ「Ｔｍ」を取得する。
［ステップＳ４４］文字選択部１３３ａは、位置「ｉ」の値に「１」を設定する（ｉ＝１）。これにより、「ｍ」番目のテキストデータ「Ｔｍ」の先頭の文字が処理対象となる。
【０１３８】
［ステップＳ４５］文字選択部１３３ａは、テキストデータ「Ｔｍ」の長さ（文字数）を、文字数「ｎ」に代入する。
［ステップＳ４６］文字選択部１３３ａ、ノード作成部１３４ａ、頻度カウント部１３５ａ、および符号出力部１３６の連携した処理により、圧縮処理が行われる。この処理の詳細は後述する（図２６参照）。
【０１３９】
［ステップＳ４７］制御記号出力部１３７は、制御記号「＄」を圧縮済テキスト「Ｃ」の末尾に書き出す。
［ステップＳ４８］ノード作成部１３４ａは、ノードポインタ「Ｐ」を初期化する（Ｐ＝ｒｏｏｔ（Ｄ））。
【０１４０】
［ステップＳ４９］文字選択部１３３ａは、テキスト番号「ｍ」に１を加算する。その後、処理がステップＳ４２に進められる。
図２６は、圧縮処理の詳細手順を示すフローチャートである。以下、図２６に示す処理をステップ番号に沿って説明する。
【０１４１】
［ステップＳ５１］ノード作成部１３４ａは、位置「ｉ」の値が、文字数「ｎ」より大きいか否かを判断する。位置「ｉ」の値が文字数「ｎ」より大きければ、処理がステップＳ５８に進められる。位置「ｉ」の値が文字数「ｎ」以下であれば、処理がステップＳ５２に進められる。
【０１４２】
［ステップＳ５２］位置「ｉ」の値が文字数「ｎ」以下であれば、ノード作成部１３４ａ、頻度カウント部１３５ａ、および符号出力部１３６ａが連携し、要約トライ作成およびテキスト圧縮処理を実行する。この処理の詳細は、図９に示した第２の実施の形態における要約トライ作成およびテキスト圧縮処理と同様である。
【０１４３】
［ステップＳ５３］文字選択部１３３ａは、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、テキスト番号「ｍ」の未圧縮テキスト内の次の文字が処理対象となる。
【０１４４】
［ステップＳ５４］ノード作成部１３４ａは、要約トライ「Ｄ」の大きさ「ｋ」が、最大符号数「Ｋ」未満か否かを判断する。要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」未満であれば、処理がステップＳ５１に進められる。要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」以上であれば、処理がステップＳ５５に進められる。
【０１４５】
［ステップＳ５５］ノード作成部１３４ａは、位置「ｉ」の値が、文字数「ｎ」より大きいか否かを判断する。位置「ｉ」の値が文字数「ｎ」より大きければ、処理がステップＳ５８に進められる。位置「ｉ」の値が文字数「ｎ」以下であれば、処理がステップＳ５６に進められる。
【０１４６】
［ステップＳ５６］位置「ｉ」の値が文字数「ｎ」以下であれば、符号出力部１３６ａは、テキスト圧縮処理を実行する。この処理の詳細は、図１０に示した第２の実施の形態におけるテキスト圧縮処理と同様である。
【０１４７】
［ステップＳ５７］文字選択部１３３ａは、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、テキスト番号「ｍ」の未圧縮テキスト内の次の文字が処理対象となる。その後、処理がステップＳ５５に進められる。
【０１４８】
［ステップＳ５８］位置「ｉ」の値が文字数「ｎ」より大きくなると、符号出力部１３６は、ノードポインタ「Ｐ」が示すノードの符号を、圧縮済テキスト「Ｃ」の末尾に書き出す。その後、圧縮処理が終了し、処理が図２５のステップＳ４７に進められる。
【０１４９】
このようにして、符号化された個々のテキストデータの間に制御記号を挿入することができる。この制御記号により、圧縮済テキスト内の符号語列を、符号の生成元となった未圧縮テキストごとに分割することができる。そして、圧縮済テキスト内の分割された符号語列の順番により、各符号語列の生成元となった未圧縮テキストを判別できる。
【０１５０】
〔第４の実施の形態〕
第４の実施の形態は、要約トライに含まれるノードの閾値「α」を動的に変更可能としたものである。要約トライを用いた符号化では、閾値「α」のとり方によって圧縮率が大きく異なる。閾値「α」が大きすぎると、要約トライがなかなか成長せず、長い文字列に符号を割り当てることができない。逆に閾値「α」が小さすぎると、要約トライが早く成長しすぎ、後方のデータを読む前に最大サイズを超えてしまう。そこで第４の実施の形態では、閾値テーブルを用いて、最初のうちは閾値「α」の値を小さく保ち、読み込むデータ量が増えるのに伴い閾値「α」を徐々に大きくしていく。
【０１５１】
図２７は、第４の実施の形態に係るテキスト符号化部の機能を示すブロック図である。テキスト符号化部１３０ｂは、未圧縮テキスト４０を符号化し、要約トライと圧縮済テキストとを生成する。要約トライは、符号化辞書として符号化辞書記憶部１１０ｂに格納される。圧縮済テキストは、圧縮済テキスト記憶部１２０ｂに格納される。符号化辞書記憶部１１０ｂは、要約トライ形式の符号化辞書を記憶する。圧縮済テキスト記憶部１２０ｂは、圧縮済テキストを記憶する。
【０１５２】
テキスト符号化部１３０ｂは、頻度閾値記憶部１３１ｂ、最大符号数記憶部１３２ｂ、文字選択部１３３ｂ、ノード作成部１３４ｂ、頻度カウント部１３５ｂ、符号出力部１３６ｂ、閾値テーブル記憶部１３８、および閾値設定部１３９を有する。頻度閾値記憶部１３１ｂ、最大符号数記憶部１３２ｂ、文字選択部１３３ｂ、ノード作成部１３４ｂ、頻度カウント部１３５ｂ、および符号出力部１３６ｂは、図７に示した第２の実施の形態における同名の要素と同じ機能を有している。
【０１５３】
閾値テーブル記憶部１３８は、符号化された文字数と閾値との対応関係を示す閾値テーブルを記憶する。例えば、ＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が、閾値テーブル記憶部１３８として使用される。
【０１５４】
閾値設定部１３９は、文字選択部１３３ｂが選択してノード作成部１３４ｂに渡した文字数に応じて、頻度閾値記憶部１３１ｂ内の閾値を設定する。その際、閾値設定部１３９は、閾値テーブル記憶部１３８を参照し、設定する閾値を決定する。
【０１５５】
図２８は、閾値テーブル記憶部のデータ構造の一例を示す図である。閾値テーブル記憶部１３８には、閾値テーブル１３８ａが格納されている。閾値テーブル１３８ａには、文字数と閾値との欄が設けられている。閾値テーブル１３８ａ内の横方向に並べられた情報が互いに関連付けられている。
【０１５６】
文字数の欄には、符号化された文字の数を示す数値の範囲が設定されている。図２８の例では、文字のデータ量を示すバイト数によって、文字数が示されている。例えば１バイト文字であれば、バイト数の数値が、そのまま文字数となる。また２バイト文字であれば、バイト数の数値の半分の値が、文字数となる。
【０１５７】
閾値の欄には、対応する文字数の範囲内の文字が符号化されたときの閾値が設定されている。例えば、符号化された文字のデータ量が１バイトから１Ｋバイト範囲内であれば、閾値「α」として１０が設定される。また符号化された文字のデータ量が１Ｋバイトから１００Ｋバイト範囲内であれば、閾値「α」として１００が設定される。なお、文字のデータ量が「１〜１Ｋ」と「１Ｋ〜１００Ｋ」の境界の値「１Ｋ」となった場合、例えば値が大きい方の閾値（この例では「１００」）が設定される。
【０１５８】
図２９は、第４の実施の形態に係るテキスト符号化処理の手順を示すフローチャートである。以下、図２９に示す処理をステップ番号に沿って説明する。
［ステップＳ６１］テキスト符号化部１３０ｂ内の各要素は、それぞれ情報の初期化を行う。例えば文字選択部１３３ｂは、文字の位置「ｉ」の値を「０」に初期化する。ノード作成部１３４ｂは、符号化辞書記憶部１１０ｂ内の要約トライ「Ｄ」を初期化する。さらにノード作成部１３４ｂは、ノードポインタ「Ｐ」を初期化する。符号出力部１３６ｂは、圧縮済テキスト記憶部１２０ｂ内の圧縮済テキストを初期化する。
【０１５９】
［ステップＳ６２］文字選択部１３３ｂは、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、未圧縮テキスト４０内の１文字目が処理対象となる。
［ステップＳ６３］ノード作成部１３４ｂは、位置「ｉ」の値が、文字数「ｎ」より大きいか否かを判断する。位置「ｉ」の値が文字数「ｎ」より大きければ、処理がステップＳ７１に進められる。位置「ｉ」の値が文字数「ｎ」以下であれば、処理がステップＳ６４に進められる。
【０１６０】
［ステップＳ６４］閾値設定部１３９は、閾値テーブル１３８ａと位置「ｉ」に基づいて閾値「α」を求める。例えば閾値設定部１３９は、未圧縮テキスト４０に含まれる文字が１バイト文字であれば、位置「ｉ」の値を、符号化した文字数に応じたバイト数として取得する。次に閾値設定部１３９は、取得したバイト数を含む範囲を、閾値テーブル１３８ａの文字数の欄から選択する。さらに閾値設定部１３９は、選択した範囲に対応する閾値を、閾値テーブル１３８ａから取得する。そして閾値設定部１３９は、取得した閾値を頻度閾値記憶部１３１ｂに格納する。
【０１６１】
［ステップＳ６５］位置「ｉ」の値が文字数「ｎ」以下であれば、ノード作成部１３４ｂ、頻度カウント部１３５ｂ、および符号出力部１３６ｂが連携し、要約トライ作成およびテキスト圧縮処理を実行する。この処理の詳細は、図９に示した第２の実施の形態の処理と同様である。
【０１６２】
［ステップＳ６６］文字選択部１３３ｂは、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、未圧縮テキスト４０内の次の文字が処理対象となる。
［ステップＳ６７］ノード作成部１３４ｂは、要約トライ「Ｄ」の大きさ「ｋ」が、最大符号数「Ｋ」未満か否かを判断する。要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」未満であれば、処理がステップＳ６３に進められる。要約トライ「Ｄ」の大きさ「ｋ」が最大符号数「Ｋ」以上であれば、処理がステップＳ６８に進められる。
【０１６３】
［ステップＳ６８］ノード作成部１３４ｂは、位置「ｉ」の値が、文字数「ｎ」より大きいか否かを判断する。位置「ｉ」の値が文字数「ｎ」より大きければ、処理がステップＳ７１に進められる。位置「ｉ」の値が文字数「ｎ」以下であれば、処理がステップＳ６９に進められる。
【０１６４】
［ステップＳ６９］位置「ｉ」の値が文字数「ｎ」以下であれば、符号出力部１３６ｂは、テキスト圧縮処理を実行する。この処理の詳細は、図１０に示した第２の実施の形態の処理と同様である。
【０１６５】
［ステップＳ７０］文字選択部１３３ｂは、位置「ｉ」の値をインクリメントする（ｉ＝ｉ＋１）。これにより、未圧縮テキスト４０内の次の文字が処理対象となる。その後、処理がステップＳ６８に進められる。
【０１６６】
［ステップＳ７１］位置「ｉ」の値が文字数「ｎ」より大きくなると、符号出力部１３６ｂは、ノードポインタ「Ｐ」が示すノードの符号を、圧縮済テキスト「Ｃ」の末尾に書き出す。その後、処理が終了する。
【０１６７】
このようにして、閾値「α」を動的に変更することができる。これにより、システムを運用していくうちに符号化された文字数が徐々に増加していっても、符号化された文字数に応じた適切な閾値「α」が設定される。例えば、閾値「α」の値を、符号化された文字数の増加に伴い徐々に大きくしていくことで、閾値「α」が大きすぎることにより、要約トライがなかなか成長しないような事態を抑止できる。また閾値「α」が小さすぎることにより、要約トライが早く成長しすぎ、後方のデータを読む前にノード数が最大符号数を超えてしまう事態の発生も抑止できる。
【０１６８】
〔その他の応用例〕
上記の処理機能は、コンピュータによって実現することができる。その場合、サーバが有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ／ＲＷなどがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disc）などがある。
【０１６９】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０１７０】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０１７１】
また、上記の処理機能の少なくとも一部を、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現することもできる。
【０１７２】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【０１７３】
以上の実施の形態に開示された技術には、以下の付記に示す技術が含まれる。
（付記１）  テキストデータ内の文字列から順に文字を選択する文字選択手段と、
前記テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照し、前記ルートのノードから前記判断位置を開始し、前記判断位置のノードに対して前記文字選択手段で選択された文字に対応する子のノードが存在する場合、該子のノードに前記判断位置を移動し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達していない場合、前記ルートのノードに対する前記選択された文字に対応する子のノードに前記判断位置を移動し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達している場合、前記判断位置のノードに対して、新たな識別子を付与した、前記選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに前記判断位置を移動するノード追加手段と、
前記文節木記憶手段を参照し、前記判断位置のノードに対して前記選択された文字に対応するノードが存在しない場合、前記判断位置のノードの付与された前記選択された文字の出現回数をカウントアップする頻度カウント手段と、
を有することを特徴とするテキスト処理装置。
【０１７４】
（付記２）  前記文節木記憶手段を参照し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードに付与された識別子を出力する識別子出力手段をさらに有することを特徴とする付記１記載のテキスト処理装置。
【０１７５】
（付記３）  前記識別子出力手段は、前記テキストデータ内の文字列の最後の文字が選択されたことにより前記判断位置が移動されると、移動後の前記判断位置のノードに付与された識別子を出力することを特徴とする付記２記載のテキスト処理装置。
【０１７６】
（付記４）  前記ノード追加手段は、子のノードの追加を、前記文節木のノードの数が所定数に達するまで行うことを特徴とする付記１乃至３のいずれかに記載のテキスト処理装置。
【０１７７】
（付記５）  前記選択された文字の総量に応じて前記閾値を変更する閾値変更手段をさらに有することを特徴とする付記１乃至４のいずれかに記載のテキスト処理装置。
（付記６）  前記閾値変更手段は、前記選択された文字の総量が増加するほど、前記閾値の値を大きくすることを特徴とする付記５記載のテキスト処理装置。
【０１７８】
（付記７）  移動後の前記判断位置のノードに付与された識別子を出力後、前記テキストデータ内の文字列に対応する符号の最後であることを示す制御記号を出力する制御記号出力手段をさらに有することを特徴とする付記３記載のテキスト処理装置。
【０１７９】
（付記８）  コンピュータが、
テキストデータ内の文字列から順に文字を選択し、
前記テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照し、
前記ルートのノードから前記判断位置を開始し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在する場合、該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達していない場合、前記ルートのノードに対する前記選択された文字に対応する子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達している場合、前記判断位置のノードに対して、新たな識別子を付与した、前記選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応するノードが存在しない場合、前記判断位置のノードの付与された前記選択された文字の出現回数をカウントアップする、
ことを特徴とするテキスト処理方法。
【０１８０】
（付記９）  前記コンピュータが、さらに、
前記文節木記憶手段を参照し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードに付与された識別子を出力することを特徴とする付記８記載のテキスト処理方法。
【０１８１】
（付記１０）  前記コンピュータが、さらに、
前記テキストデータ内の文字列の最後の文字が選択されたことにより前記判断位置が移動されると、移動後の前記判断位置のノードに付与された識別子を出力することを特徴とする付記９記載のテキスト処理方法。
【０１８２】
（付記１１）  子のノードの追加は、前記文節木のノードの数が所定数に達するまで行うことを特徴とする付記８乃至１０のいずれかに記載のテキスト処理方法。
（付記１２）  前記コンピュータが、さらに、
前記選択された文字の総量に応じて前記閾値を変更することを特徴とする付記８乃至１１のいずれかに記載のテキスト処理方法。
【０１８３】
（付記１３）  前記閾値を変更する際には、前記選択された文字の総量が増加するほど、前記閾値の値を大きくすることを特徴とする付記１２記載のテキスト処理方法。
（付記１４）  前記コンピュータが、さらに、
移動後の前記判断位置のノードに付与された識別子を出力後、前記テキストデータ内の文字列に対応する符号の最後であることを示す制御記号を出力することを特徴とする付記１０記載のテキスト処理方法。
【０１８４】
（付記１５）  コンピュータに、
テキストデータ内の文字列から順に文字を選択し、
前記テキストデータに出現し得る文字に対応する複数のノードがルートのノードの子として木構造で予め関連付けられ、各ノードに対して前記テキストデータに出現し得る文字に対応する子のノードを追加可能であり、各ノードに対応付けて、ノードの識別子と、各ノードが判断位置とされたときに次に出現した各文字の出現回数とが付与された文節木を記憶する文節木記憶手段を参照し、
前記ルートのノードから前記判断位置を開始し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在する場合、該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達していない場合、前記ルートのノードに対する前記選択された文字に対応する子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在せず、かつ前記判断位置のノードに付与された前記選択された文字の出現回数が所定の閾値に達している場合、前記判断位置のノードに対して、新たな識別子を付与した、前記選択された文字に対応する子のノードを追加すると共に、追加した該子のノードに前記判断位置を移動し、
前記判断位置のノードに対して前記選択された文字に対応するノードが存在しない場合、前記判断位置のノードの付与された前記選択された文字の出現回数をカウントアップする、
処理を実行させることを特徴とするテキスト処理プログラム。
【０１８５】
（付記１６）  前記コンピュータが、さらに、
前記文節木記憶手段を参照し、前記判断位置のノードに対して前記選択された文字に対応する子のノードが存在しない場合、前記判断位置のノードに付与された識別子を出力することを特徴とする付記１５記載のテキスト処理プログラム。
【０１８６】
（付記１７）  前記コンピュータが、さらに、
前記テキストデータ内の文字列の最後の文字が選択されたことにより前記判断位置が移動されると、移動後の前記判断位置のノードに付与された識別子を出力することを特徴とする付記１６記載のテキスト処理プログラム。
【０１８７】
（付記１８）  子節点の追加は、前記文節木のノードの数が所定数に達するまで行うことを特徴とする付記１５乃至１７のいずれかに記載のテキスト処理プログラム。
（付記１９）  前記コンピュータが、さらに、
前記選択された文字の総量に応じて前記閾値を変更することを特徴とする付記１５乃至１８のいずれかに記載のテキスト処理プログラム。
【０１８８】
（付記２０）  前記閾値を変更する際には、前記選択された文字の総量が増加するほど、前記閾値の値を大きくすることを特徴とする付記１９記載のテキスト処理プログラム。
（付記２１）  前記コンピュータが、さらに、
移動後の前記判断位置のノードに付与された識別子を出力後、前記テキストデータ内の文字列に対応する符号の最後であることを示す制御記号を出力することを特徴とする付記１７記載のテキスト処理プログラム。
【符号の説明】
【０１８９】
１  テキスト処理装置
１ａ  文字選択手段
１ｂ  ノード追加手段
１ｃ  頻度カウント手段
１ｄ  識別子出力手段
２  文節木記憶手段
２ａ  文節木
３  テキストデータ
４  符号語列
【図１】
0005544998.tif 000002
【図２】
0005544998.tif 000003
【図３】
0005544998.tif 000004
【図４】
0005544998.tif 000005
【図５】
0005544998.tif 000006
【図６】
0005544998.tif 000007
【図７】
0005544998.tif 000008
【図８】
0005544998.tif 000009
【図９】
0005544998.tif 000010
【図１０】
0005544998.tif 000011
【図１１】
0005544998.tif 000012
【図１２】
0005544998.tif 000013
【図１３】
0005544998.tif 000014
【図１４】
0005544998.tif 000015
【図１５】
0005544998.tif 000016
【図１６】
0005544998.tif 000017
【図１７】
0005544998.tif 000018
【図１８】
0005544998.tif 000019
【図１９】
0005544998.tif 000020
【図２０】
0005544998.tif 000021
【図２１】
0005544998.tif 000022
【図２２】
0005544998.tif 000023
【図２３】
0005544998.tif 000024
【図２４】
0005544998.tif 000025
【図２５】
0005544998.tif 000026
【図２６】
0005544998.tif 000027
【図２７】
0005544998.tif 000028
【図２８】
0005544998.tif 000029
【図２９】
0005544998.tif 000030