(57)【要約】【課題】スキャナ等で読み込まれた文書情報における文字認識誤りを考慮した文字列検索を実現する。【解決手段】文字格納部１０４は、第１の文字と、第１の文字に対応する誤認識文字等である第２の文字を格納し、派生文字列生成部１０５は、文字格納部１０４を参照して、検索文字列に含まれる第１の文字を第２の文字に置き換えた派生文字列を生成する。検索部１０７は、文書格納部１０３に格納された検索対象文書から、検索文字列及び派生文字列を検索し、出力部１１３は、検索文字列及び派生文字列の検索結果を出力する。【選択図】図１
2010225137.tif 000002
【特許請求の範囲】
【請求項１】
第１の文字と該第１の文字に対応する第２の文字を格納する文字格納手段を参照して、検索文字列に含まれる該第１の文字を該第２の文字に置き換えた派生文字列を生成する生成ステップと、
文書格納手段に格納された検索対象文書から、前記検索文字列及び前記派生文字列を検索する検索ステップと、
前記検索文字列及び前記派生文字列の検索結果を出力する出力ステップと
をコンピュータに実行させることを特徴とする検索プログラム。
【請求項２】
前記検索ステップは、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字に一致するとき、状態変数格納部に格納された状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索プログラムは、該検索文字列又は該派生文字列の末尾の文字に対応する第２の状態変数が活性化されたとき、該末尾の文字を含む入力文字列が該検索文字列又は該派生文字列のいずれであるかを検証する検証ステップを前記コンピュータにさらに実行させることを特徴とする請求項１記載の検索プログラム。
【請求項３】
前記検索ステップは、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字のいずれにも一致しないとき、前記状態変数列中の別の文字に対応する第３の状態変数を活性化する処理をさらに繰り返し、前記検証ステップは、前記第２の状態変数が活性化されたとき、前記末尾の文字を含む入力文字列が該検索文字列又は該派生文字列のいずれかと一致する文字数の割合を求め、得られた文字数の割合が閾値より大きければ、該検索文字列又は該派生文字列が検出されたと判断することを特徴とする請求項２記載の検索プログラム。
【請求項４】
前記検証ステップは、前記第２の状態変数が活性化された状態が表す文字列から、前記末尾の文字を含む入力文字列中の１つ以上の一致文字に対応する１つ以上の文字位置を特定し、該入力文字列中の該１つ以上の文字位置の文字と、前記検索文字列又は前記派生文字列中の該１つ以上の文字位置の文字を比較して、前記文字数の割合を求めることを特徴とする請求項３記載の検索プログラム。
【請求項５】
前記出力ステップは、前記検索対象文書から前記検索文字列が検出されたとき、該検索文字列を前記検索結果として出力し、前記検索対象文書から前記派生文字列が検出されたとき、該派生文字列を前記検索文字列に変換し、得られた検索文字列を前記検索結果として出力することを特徴とする請求項１乃至４のいずれかに記載の検索プログラム。
【請求項６】
各文字について複数の候補文字が用意されている検索対象文書から検索文字列を検索する処理において、前記検索対象文書から入力される文字に対応する複数の候補文字のいずれか１つが前記検索文字列に含まれる文字に一致するときに、状態変数格納部に格納されている状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索対象文書から入力される文字に対応する複数の候補文字がいずれも前記検索文字列に含まれる文字に一致しないときに、前記状態変数列中の別の文字に対応する第２の状態変数を活性化する処理を繰り返す、ことにより前記検索文字列を検索する検索ステップ、
前記状態変数列中の前記検索文字列の末尾の文字に対応する第３の状態変数が活性化されたときに、前記検索文字列の検索結果を出力する出力ステップ、
をコンピュータに実行させる検索プログラム。
【請求項７】
コンピュータが、第１の文字と該第１の文字に対応する第２の文字を格納する文字格納手段を参照して、検索文字列に含まれる該第１の文字を該第２の文字に置き換えた派生文字列を生成する生成ステップと、
前記コンピュータが、文書格納手段に格納された検索対象文書から、前記検索文字列及び前記派生文字列を検索する検索ステップと、
前記コンピュータが、前記検索文字列及び前記派生文字列の検索結果を出力する出力ステップと
を備えることを特徴とする検索方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、文字列を検索するプログラム及び方法に関する。
【背景技術】
【０００２】
近年、文書を保管する場所を節約したり、文書を高速に検索したりするために、従来より紙で保存していた文書をスキャナ等で情報処理装置に読み込み、電子化文書として保存することが行われている。また、国会図書館の本をすべてスキャナ等でサーバ装置に読み込み、全国で閲覧可能にしようとする試みもある。
【０００３】
通常、紙文書を電子化して保存する際には、Optical Character Recognition （ＯＣＲ）により文書中の文字を認識して、認識結果を保存しておくことが多い。これにより、電子化文書の大きな特徴である全文検索等が行えるようになる。ところが、文字認識の認識精度は必ずしも１００％ではないため、従来広く使われている文字列完全一致検索を用いて全文検索を行うと、目的の電子文書を見つけられない可能性がある。
【０００４】
従来の柔軟なテキスト検索として、正規表現を用いた検索が知られている。正規表現とは、検索文字列の一部に一定の範囲を設けて検索文字列を指定する方法である。例えば、「報告書［１−５］」や「東京都＊区」という指定方法が正規表現に該当する。前者は、「報告書１ｏｒ報告書２ｏｒ報告書３ｏｒ報告書４ｏｒ報告書５」を表し、後者は、＊の部分に任意の文字が任意の数だけ含まれ得ることを表す。正規表現によれば、完全一致検索と比較してより柔軟な検索文字列の指定が可能であり、目的の電子文書を見つけられる可能性が高くなる。
【０００５】
また、検索文字列を高速に検索する方法として、オートマトンを用いた文字列検索も知られている。Aho-Corasick（ＡＣ）アルゴリズムは、オートマトンを用いた複数文字列の同時検索を可能とする検索方式の代表的なものの１つである。
【０００６】
さらに、文書中の文字の置換、挿入、及び脱落に対応したあいまい検索を実現するアルゴリズムも知られている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平０２−０７６０７２号公報
【特許文献２】特開平０３−１３１９６９号公報
【特許文献３】特開平０８−２４１３３５号公報
【特許文献４】特開平１１−２０３３１５号公報
【特許文献５】特開平０８−３０５７２２号公報
【非特許文献】
【０００８】
【非特許文献１】A. V. Aho and M. J. Corasick, “Efficient String Matching: An Aid to Bibliographic Search”, Communications of the ACM, Vol.18, No.6, p.333-340, 1975.
【非特許文献２】喜田拓也，「誤りを許したＶＬＤＣパタン照合アルゴリズム」，電子情報通信学会技術研究報告ＣＯＭＰ，Ｖｏｌ．１０３  Ｎｏ．６２２（２００４０１２２），ｐ．６１−６８
【非特許文献３】丸川勝美、藤澤造道、嶋好博、「認識機能の出力あいまい性を許容した情報検索手法の一検討」、電子情報通信学会論文誌 Vol.J79-D-2 No.5 pp785-794
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、上述した従来の文字列検索には、次のような問題がある。
正規表現を用いたテキスト検索技術は、ＯＣＲによる文字認識誤りを考慮した文字列検索には適用することが困難である。例えば、「社外秘」という文字列を検索する場合、文字認識誤りを考慮すると、「ネ土タト秘」、「杜外秘」、「社朴秘」、「社外木必」等の文字列も検索することが望ましい。「ネ土タト秘」及び「社外木必」は、１つの漢字の偏と旁を誤って別々に認識した場合に相当し、「杜外秘」及び「社朴秘」は、１つの漢字を誤って別の類似する漢字として認識した場合に相当する。
【００１０】
しかし、文字認識誤りを考慮した複数の検索文字列を簡単な正規表現で表すことはできない。複数の正規表現の和を用いれば複数の検索文字列を表すこともできるが、その結果、正規表現による検索が複数回繰り返されるため、検索文字列の数が増えるに従って検索時間が増大する。
【００１１】
本発明の課題は、スキャナ等で読み込まれた文書情報における文字認識誤りを考慮した文字列検索を実現することである。
【課題を解決するための手段】
【００１２】
開示の検索プログラムは、生成ステップ、検索ステップ、及び出力ステップをコンピュータに実行させる。
生成ステップは、第１の文字と第１の文字に対応する第２の文字を格納する文字格納手段を参照して、検索文字列に含まれる第１の文字を第２の文字に置き換えた派生文字列を生成する。検索ステップは、文書格納手段に格納された検索対象文書から、検索文字列及び派生文字列を検索する。出力ステップは、検索文字列及び派生文字列の検索結果を出力する。
【００１３】
例えば、第１の文字に対応する誤認識文字を第２の文字として文字格納手段に格納しておけば、検索文字列中の第１の文字をその誤認識文字に置き換えた派生文字列が生成される。これにより、検索文字列を誤認識した結果の文字列も検索対象文書から検索されるため、ユーザは、文字認識誤りを考慮した複数の検索文字列を指定する必要がない。
【００１４】
また、第１の文字に対応する別表記の文字を第２の文字として文字格納手段に格納しておけば、検索文字列中の第１の文字をその別表記の文字に置き換えた派生文字列が生成される。これにより、検索文字列の別表記の文字列も検索対象文書から検索することができる。
【発明の効果】
【００１５】
開示の検索プログラムによれば、文字認識誤りや異なる表記を考慮した文字列検索が可能になる。
【図面の簡単な説明】
【００１６】
【図１】第１の検索装置の構成図である。
【図２】文字テーブルを示す図である。
【図３】第１の非決定性有限オートマトンを示す図である。
【図４】第１の非決定性有限オートマトンの動作を示す図である。
【図５】第１のマスクテーブルを示す図である。
【図６】状態遷移に伴うビット列の変化を示す図である。
【図７】第１の検索処理のフローチャートである。
【図８】第２のマスクテーブルを示す図である。
【図９】第３のマスクテーブルを示す図である。
【図１０】第１の検証処理のフローチャートである。
【図１１】第２の非決定性有限オートマトンを示す図である。
【図１２】第２の非決定性有限オートマトンの動作を示す図である。
【図１３】第４のマスクテーブルを示す図である。
【図１４】第５のマスクテーブルを示す図である。
【図１５】第２の検証処理のフローチャートである。
【図１６】第３の非決定性有限オートマトンを示す図である。
【図１７】第１の状態番号列を示す図である。
【図１８】第２の状態番号列を示す図である。
【図１９】第３の状態番号列を示す図である。
【図２０】第４の状態番号列を示す図である。
【図２１】第５の状態番号列を示す図である。
【図２２】各ビット位置から遷移前の状態番号のビット位置までの距離を示す図である。
【図２３】状態遷移マスクＭ（ａ）の各ビットと状態番号の対応関係を示す図である。
【図２４】第２の検索処理のフローチャートである。
【図２５】第４の非決定性有限オートマトンを示す図である。
【図２６】第５の非決定性有限オートマトンを示す図である。
【図２７】第３の検証処理のフローチャートである。
【図２８】第２の検索装置の構成図である。
【図２９】第３の検索装置の構成を示す図である。
【図３０】文字認識部により生成されるテキスト文書の一部の実施例である。
【図３１】第３の検索装置の検索部の動作を示すフローチャートである。
【図３２】第３の検索装置において生成されるオートマトンの一例を示す図である。
【図３３】オートマトンに第１候補文字および第２候補文字を作用させたときの状態を示す図である。
【図３４】第３の検索装置の動作例を示す図である。
【図３５】第３の検索装置の検索部の動作を詳細に示すフローチャートである。
【図３６】オートマトンの更新について説明する図である。
【図３７】情報処理装置の構成図である。
【図３８】プログラム及びデータを提供する方法を示す図である。
【発明を実施するための形態】
【００１７】
以下、図面を参照しながら、実施形態を詳細に説明する。
図１は、実施形態の検索装置の構成例を示している。図１に示す検索装置（第１の検索装置）は、スキャナ１０１、文字認識部１０２、文書格納部１０３、文字格納部１０４、派生文字列生成部１０５、オートマトン生成部１０６、及び検索部１０７を備える。図１の検索装置は、入力部１０８、検索文字列格納部１０９、閾値格納部１１０、検証部１１１、検索結果格納部１１２、及び出力部１１３をさらに備える。
【００１８】
スキャナ１０１は、紙文書を読み込んで文書画像を生成し、文字認識部１０２は、文書画像の文字認識を行ってテキスト文書を生成する。文書格納部１０３は、生成されたテキスト文書を格納する。なお、スキャナ１０１及び文字認識部１０２は、検索装置と通信ネットワークにより接続された別の情報処理装置に設けても構わない。
【００１９】
ユーザは、入力部１０８から検索対象となる１つ以上の検索文字列と検索閾値を入力し、検索文字列格納部１０９及び閾値格納部１１０は、入力された検索文字列及び検索閾値をそれぞれ格納する。
【００２０】
文字格納部１０４は、検索文字列を変形して派生文字列を生成するための文字情報を格納する。文字情報としては、例えば、１つ以上の文字とその文字に対応する誤認識文字を登録した文字テーブルが用いられる。派生文字列生成部１０５は、文字格納部１０４に格納された文字情報に基づいて、検索文字列格納部１０９に格納された検索文字列から１つ以上の派生文字列を生成し、検索文字列及び派生文字列をオートマトン生成部１０６に出力する。
【００２１】
オートマトン生成部１０６は、検索文字列及び派生文字列からそれらの文字列を検索するためのオートマトンを生成する。検索部１０７は、生成されたオートマトンを用いて、文書格納部１０３に格納されたテキスト文書を検索し、テキスト文書中に存在する検索文字列及び派生文字列の候補となる文字列を検出する。
【００２２】
検証部１１１は、検出された文字列が検索文字列格納部１０９に格納された検索文字列又は生成された派生文字列のいずれかに該当するか否かを判定する。このとき、閾値格納部１１０に格納された検索閾値に基づいて判定を行ってもよい。検索閾値を判定に用いない場合は、検索閾値の入力を省略することができる。
【００２３】
検索文字列又は派生文字列が検出された場合、検証部１１１は、その検索結果を検索結果格納部１１２に格納する。検索結果には、テキスト文書の識別情報、検出文字列、テキスト文書中の検出文字列の位置等の情報を含めることができる。なお、派生文字列が検出された場合は、その派生文字列を元の検索文字列に逆変換して検索結果格納部１１２に格納してもよい。
【００２４】
出力部１１３は、検索結果格納部１１２に格納された検索結果を出力して、ユーザに提示する。出力方法は画面表示でもよく、ファイル出力でもよく、音声メッセージでもよい。
【００２５】
前述したように、文字認識の認識精度は必ずしも１００％ではないため、しばしば文字認識誤りが発生する。このため、文字認識結果のテキスト文書から文字列検索を行う場合、通常の完全一致検索では検索文字列を検出できない場合がある。
【００２６】
そこで、図１の検索装置では、派生文字列生成部１０５により文字認識誤りのパターンを考慮した派生文字列を生成し、それらの派生文字列をも検索対象とすることで、文字認識誤りを含むテキスト文書も検索結果に含めることができる。以下の説明では、検索文字列又は派生文字列を指す用語として、「目的の文字列」を用いる場合がある。
【００２７】
文字認識誤りには、様々なパターンが考えられる。その代表的なものは、以下のようなパターンである。
誤認識パターン１：例えば、「目」を「自」と認識したり、「Ｉ」を「１」と認識したりする等、ある文字を類似する別の文字として認識する。
【００２８】
誤認識パターン２：例えば、「神」を「ネ」と「申」と認識したり、「川」を「ノ」、「ｌ」、及び「１」と認識したりする等、本来１文字であるものを複数の文字として認識する。
【００２９】
誤認識パターン３：例えば、「木市」を「柿」と認識したりする等、本来複数の文字であるものを１文字として認識する。
文字格納部１０４には、このような誤認識パターンを表す情報がテーブル、リスト、又はその他の形式で格納されている。テーブル形式の場合、例えば、図２に示すような文字テーブルが格納される。
【００３０】
図２の文字テーブルにおいて、誤認識文字２０１〜２１０は誤認識パターン１に対応し、誤認識文字２１１及び２１２は誤認識パターン２に対応し、誤認識文字２１３及び２１４は誤認識パターン３に対応する。
【００３１】
誤認識パターン１に対しては、ある文字に類似する別の文字が誤認識文字として登録される。誤認識パターン２に対しては、１つの分離文字を連結要素単位に分解したとき、それぞれの連結要素の認識結果になり得る文字が誤認識文字として登録される。誤認識パターン３に対しては、隣接する複数の文字を統合して得られる１つの文字が誤認識文字として登録される。１つの文字に対して２つ以上の誤認識パターンが存在する場合は、それらの誤認識文字を重複して登録することも可能である。
【００３２】
なお、文字テーブルには、誤認識パターン１、誤認識パターン２、及び誤認識パターン３のすべてを登録する必要はなく、少なくとも１つ以上を登録しておけばよい。また、これらの誤認識パターンとは異なる別の誤認識パターンを登録してもよい。
【００３３】
派生文字列生成部１０５は、この文字テーブルを参照して、検索文字列中の文字が文字テーブルに登録されているか否かをチェックする。そして、文字が文字テーブルに登録されていれば、その文字を対応する誤認識文字に置き換えて検索文字列を変形し、派生文字列を生成する。
【００３４】
１つの文字に対して複数の誤認識文字が文字テーブルに登録されている場合や、１つの検索文字列に含まれる複数の文字が文字テーブルに登録されている場合のように、１つの検索文字列に対して複数の変形方法が存在する場合もあり得る。このように複数の変形方法が存在する場合は、すべての変形方法に対応する派生文字列を生成してもよく、所定の個数の派生文字列を生成してもよい。多くの派生文字列を生成するほど、検索文字列の検索精度が向上する。
【００３５】
例えば、誤認識文字２０５を用いて検索文字列「未来」を変形すると、派生文字列「末来」が生成され、誤認識文字２０７及び２０９を用いて検索文字列「バッタ」を変形すると、派生文字列「パッダ」が生成される。また、誤認識文字２１１及び２１２を用いて検索文字列「神奈川県川崎市」を変形すると、派生文字列「ネ申奈川県川山奇市」が生成され、誤認識文字２１３を用いて検索文字列「神奈川県厚木市」を変形すると、派生文字列「神奈川県厚柿」が生成される。
【００３６】
次に、図３から図９までを参照しながら、テキスト文書から検索文字列及び派生文字列を検索する方法について説明する。
上述したように、図１の検索装置は、検索文字列から１つ以上の派生文字列を生成し、検索文字列及び派生文字列を検索対象として文字列検索を行う。検索方法としては、派生文字列を含む複数の文字列のそれぞれについて検索を繰り返す方法と、複数の文字列を同時に検索する方法が考えられる。
【００３７】
ただし、検索を繰り返す方法では、通常、文字列の数が増えるとそれに比例して検索時間が増加するため、多数の派生文字列が生成された場合には、検索時間が膨大になる可能性がある。したがって、検索時間の観点からは、複数の文字列を同時に検索する方法が望ましい。
【００３８】
以下では、検索対象の文字列の数が増加しても検索時間が大きく増加しない検索方法として、オートマトンを用いた文字列検索について説明する。オートマトンを用いた文字列検索の代表的なものとして、前述したＡＣアルゴリズムが挙げられる。
【００３９】
ＡＣアルゴリズムを用いた場合は、検索部１０７は、検索文字列又は派生文字列と完全一致する文字列を検索対象のテキスト文書から検索する。また、多少の不一致を許容して文字列を検索するようにオートマトンの構造を変形した場合は、検索文字列又は派生文字列と類似する別の文字列が検出される場合もある。そこで、検証部１１１は、検索部１０７により検出された文字列が、検索文字列又は派生文字列のいずれであるかを判定する。
【００４０】
検出文字列が派生文字列である場合、検証部１１１は、その派生文字列を元の検索文字列に逆変換し、検索結果格納部１１２に格納し、検出文字列が検索文字列である場合は、検出文字列をそのまま検索結果格納部１１２に格納する。
【００４１】
派生文字列を検索文字列に逆変換するために、派生文字列生成部１０５は、派生文字列の生成時に、検索文字列と派生文字列の対応関係を登録した変換テーブルを生成し、それを検証部１１１に出力しておく。検証部１１１は、この変換テーブルを参照することで、派生文字列を検索文字列に逆変換することができる。
【００４２】
ここで、検索部１０７が使用するオートマトンとして、非決定性有限オートマトンをビットパラレル法で実装した例について説明する。
図３は、文字列「ａｂａｃ」を検索する場合の非決定性有限オートマトンの例を示している。図３のオートマトンは、５つの状態０〜４を有する。最初は、状態０のみが活性化されており、状態１〜４は非活性状態となっている。各状態が活性化されているときに、矢印の上に記された文字が入力されると、矢印で結ばれた次の状態が活性化され、元の状態は非活性となる。ただし、状態０は常に活性状態にしておく。
【００４３】
検索部１０７は、検索対象のテキスト文書の先頭文字から順に文字を取り出してオートマトンに作用させ、状態遷移を繰り返す。テキスト文書に目的の文字列「ａｂａｃ」が存在すれば、その位置で状態４が活性化されるため、目的の文字列が検出されたことが分かる。
【００４４】
例えば、テキスト文書Ｔとして「ａｂａｂａｃ」が入力された場合、図３のオートマトンは、図４に示すように動作する。図４において、論理“１”は活性状態を示し、論理“０”は非活性状態を示す。テキスト文書Ｔの最後の文字「ｃ」が入力されたとき、状態３から状態４への遷移が起こり、状態４において文字列「ａｂａｃ」が受理される。
【００４５】
このオートマトンの状態遷移は、以下に述べる方法により、情報処理装置におけるシフト演算、論理積、及び論理和を利用して高速に実行することができる。
状態１〜４は、例えば、状態変数としてのレジスタＲの第１ビット（最下位ビット）〜第４ビット（最上位ビット）でそれぞれ表現される。レジスタＲのビット値“１”は活性状態を表し、ビット値“０”は非活性状態を表す。状態０は常に活性状態であるため、レジスタＲでは省略することができる。
【００４６】
また、図５に示すように、正しい状態遷移を選別するためのマスク（状態遷移マスク）を定義したマスクテーブルが生成される。図５のＭ（ａ）、Ｍ（ｂ）、及びＭ（ｃ）は、それぞれ入力文字「ａ」、「ｂ」、及び「ｃ」に対する状態遷移マスクを表し、Ｍ（ａｂｃ以外）は、それ以外の入力文字に対する状態遷移マスクを表す。
【００４７】
状態遷移マスクは、レジスタＲと同じビット数のビット列において、目的の文字列中の同じ文字の位置にビット値“１”を与えることで生成される。状態遷移マスクのビット値“１”は入力文字に対して状態遷移が可能であることを表し、ビット値“０”は状態遷移が不可能であることを表す。
【００４８】
４文字の文字列「ａｂａｃ」の場合、状態遷移マスクは４ビットで表され、最下位ビット（右端のビット）は第１文字に対応し、最上位ビット（左端のビット）は第４文字に対応する。したがって、Ｍ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ａｂｃ以外）は、以下のようになる。
Ｍ（ａ）＝０１０１（二進法）＝５（十進法）
Ｍ（ｂ）＝００１０（二進法）＝２（十進法）
Ｍ（ｃ）＝１０００（二進法）＝８（十進法）
Ｍ（ａｂｃ以外）＝００００（二進法）＝０（十進法）
以下では、二進法表記のビット列であることを明示するために、ビット列の先頭に“０ｂ”を付加するものとする。
【００４９】
レジスタＲにより状態１〜４のそれぞれが活性状態か否かを表現し、状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ａｂｃ以外）により状態遷移の可否を表現すると、図４の状態遷移は次式により表される。
Ｒi ＝（（Ｒi-1 ＜＜１）｜１）＆Ｍ（Ｔ［ｉ］）      （１）
【００５０】
Ｔ［ｉ］は、Ｎ文字のテキスト文書Ｔから入力されるｉ番目の文字（ｉ＝１，２，．．．，Ｎ）を表し、Ｒi は、ｉ番目の文字が入力されたときのレジスタＲのビット列を表す。ただし、Ｒ0 ＝０ｂ００００、１＝０ｂ０００１である。“＜＜１”は、ビット列を左に１ビットシフトするシフト演算を表し、“｜”はビット列の論理和を表し、“＆”は、ビット列の論理積を表す。
【００５１】
例えば、テキスト文書「ａｂａｂａｃ」の第４文字「ｂ」が入力されたときのビット列Ｒ3 とＲ4 の関係は、図６のようになる。この場合、ビット列Ｒ3 ＝０ｂ０１０１を左に１ビットシフトすると、ビット列０ｂ１０１０が得られる。次に、最下位ビットを“１”にするために、ビット列０ｂ１０１０とビット列０ｂ０００１の論理和を計算すると、ビット列０ｂ１０１１が得られる。そして、このビット列０ｂ１０１１と、文字「ｂ」に対する状態遷移マスクＭ（ｂ）＝０ｂ００１０の論理積を計算することで、Ｒ4 ＝０ｂ００１０が得られる。
【００５２】
このように、検索部１０７は、テキスト文書Ｔの各文字を順にオートマトンに入力し、（１）式に従って状態遷移を繰り返す。図４の例では、レジスタＲの第４ビットが“１”になると、文字列「ａｂａｃ」が検出されたことになる。
【００５３】
図７は、（１）式に基づく検索処理の例を示すフローチャートである。検索部１０７は、まず、検索文字列「ａｂａｃ」に対するマスクテーブルＭを生成する（ステップ７０１）。このマスクテーブルＭには、図５の状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ａｂｃ以外）が含まれる。
【００５４】
次に、レジスタＲにビット列０ｂ００００を設定し、入力テキスト文書Ｔ中の文字位置を表す制御変数ｉに１を設定する（ステップ７０２）。そして、レジスタＲを左に１ビットシフトし（ステップ７０３）、レジスタＲとビット列０ｂ０００１の論理和によりレジスタＲを更新する（ステップ７０４）。
【００５５】
次に、レジスタＲと状態遷移マスクＭ（Ｔ［ｉ］）の論理積によりレジスタＲを更新し（ステップ７０５）、レジスタＲの最上位ビット（受理ビット）が“１”か否かをチェックする（ステップ７０６）。
【００５６】
受理ビットが“１”でなければ（ステップ７０６，ＮＯ）、次に、ｉがテキスト文書Ｔの最後の文字位置Ｎに達したか否かをチェックする（ステップ７０７）。ｉがＮに達していなければ（ステップ７０７，ＹＥＳ）、ｉを１だけインクリメントして（ステップ７０８）、ステップ７０３以降の処理を繰り返す。
【００５７】
一方、ステップ７０６において受理ビットが“１”であれば（ステップ７０６，ＹＥＳ）、検索文字列「ａｂａｃ」を検出したものと判断し、そのときの文字位置ｉを記録して（ステップ７０９）、ステップ７０７以降の処理を行う。そして、ステップ７０７においてｉがＮに達すると（ステップ７０７，ＮＯ）、処理を終了する。
【００５８】
例えば、図４のテキスト文書「ａｂａｂａｃ」の第１文字「ａ」が入力されたとき、Ｒ＝０ｂ００００を左に１ビットシフトしてＲとビット列０ｂ０００１の論理和を計算すると、Ｒ＝０ｂ０００１となる（ステップ７０４）。次に、Ｒと状態遷移マスクＭ（ａ）＝０ｂ０１０１の論理積を計算すると、Ｒ＝０ｂ０００１となる（ステップ７０５）。
【００５９】
第２文字「ｂ」が入力されたとき、Ｒ＝０ｂ０００１を左に１ビットシフトしてＲとビット列０ｂ０００１の論理和を計算すると、Ｒ＝０ｂ００１１となる（ステップ７０４）。次に、Ｒと状態遷移マスクＭ（ｂ）＝０ｂ００１０の論理積を計算すると、Ｒ＝０ｂ００１０となる（ステップ７０５）。
【００６０】
第３文字「ａ」が入力されたとき、Ｒ＝０ｂ００１０を左に１ビットシフトしてＲとビット列０ｂ０００１の論理和を計算すると、Ｒ＝０ｂ０１０１となる（ステップ７０４）。次に、Ｒと状態遷移マスクＭ（ａ）＝０ｂ０１０１の論理積を計算すると、Ｒ＝０ｂ０１０１となる（ステップ７０５）。
【００６１】
第４文字「ｂ」が入力されたとき、Ｒ＝０ｂ０１０１を左に１ビットシフトしてＲとビット列０ｂ０００１の論理和を計算すると、Ｒ＝０ｂ１０１１となる（ステップ７０４）。次に、Ｒと状態遷移マスクＭ（ｂ）＝０ｂ００１０の論理積を計算すると、Ｒ＝０ｂ００１０となる（ステップ７０５）。
【００６２】
第５文字「ａ」が入力されたとき、Ｒ＝０ｂ００１０を左に１ビットシフトしてＲとビット列０ｂ０００１の論理和を計算すると、Ｒ＝０ｂ０１０１となる（ステップ７０４）。次に、Ｒと状態遷移マスクＭ（ａ）＝０ｂ０１０１の論理積を計算すると、Ｒ＝０ｂ０１０１となる（ステップ７０５）。
【００６３】
第６文字「ｃ」が入力されたとき、Ｒ＝０ｂ０１０１を左に１ビットシフトしてＲとビット列０ｂ０００１の論理和を計算すると、Ｒ＝０ｂ１０１１となる（ステップ７０４）。次に、Ｒと状態遷移マスクＭ（ｃ）＝０ｂ１０００の論理積を計算すると、Ｒ＝０ｂ１０００となる（ステップ７０５）。このとき、Ｒの受理ビットが“１”になるため、検索文字列「ａｂａｃ」が検出される（ステップ７０９）。
【００６４】
次に、ビットパラレル法による非決定性有限オートマトンを用いた文字列検索に検証処理を組み合わせることで、検索文字列及び派生文字列を含む複数文字列を同時に検索する方法について説明する。
【００６５】
例えば、上述した誤認識パターン１の場合は、通常、検索文字列と同じ長さの派生文字列が生成されると考えられるため、同じ長さの複数文字列を同時に検索することが望ましい。
【００６６】
複数文字列の検索は、検索部１０７による非決定性有限オートマトンを用いた文字列検索に続いて、検証部１１１による検証処理を行うことで実現される。複数文字列に対する状態遷移マスクは、複数文字列のそれぞれに対して生成された状態遷移マスクの論理和で与えられる。
【００６７】
例えば、２つの文字列「ａｂａｃ」及び「ａｃｂｃ」を検索する場合、文字列「ａｂａｃ」に対するマスクテーブルは図５のようになり、文字列「ａｃｂｃ」に対するマスクテーブルは図８のようになる。したがって、文字列「ａｂａｃ」及び「ａｃｂｃ」に対するマスクテーブルは、図５の状態遷移マスクと図８の状態遷移マスクの論理和で与えられ、図９のようになる。
【００６８】
ただし、図９のマスクテーブルは、文字列の第２文字が「ｂ」又は「ｃ」であり、かつ、第３文字が「ａ」又は「ｂ」であることを表しているに過ぎない。このため、このマスクテーブルを用いて（１）式に従ってオートマトンを動作させると、目的の文字列「ａｂａｃ」及び「ａｃｂｃ」以外に、文字列「ａｂｂｃ」及び「ａｃａｃ」も検出されてしまう。
【００６９】
そこで、検証部１１１は、オートマトンで検出された文字列が目的の文字列か否かを判定する。例えば、検出文字列と検索文字列又は派生文字列を逐一比較することで、検出文字列が目的の文字列か否かを判定することができる。
【００７０】
図１０は、目的の文字列の数がＫ個の場合の検証処理の例を示すフローチャートである。検証部１１１は、まず、検出された文字列をＹとして（ステップ１００１）、制御変数ｋを１に設定する（ステップ１００２）。次に、目的の文字列のうちｋ番目の文字列をＸとして（ステップ１００３）、文字列Ｘと文字列Ｙを比較する（ステップ１００４）。
【００７１】
文字列Ｘと文字列Ｙが一致すれば（ステップ１００４，ＹＥＳ）、文字列Ｘを検出したものと判定する（ステップ１００５）。一方、文字列Ｘと文字列Ｙが一致しなければ（ステップ１００４，ＮＯ）、次に、ｋとＫを比較する（ステップ１００６）。ｋの値がＫに達していなければ（ステップ１００６，ＮＯ）、ｋを１だけインクリメントして（ステップ１００７）、ステップ１００３以降の処理を繰り返す。そして、ｋの値がＫに達すると（ステップ１００６，ＹＥＳ）、処理を終了する。
【００７２】
検証部１１１は、さらに、ステップ１００５で検出された文字列が検索文字列又は派生文字列のいずれであるかを判定し、それが派生文字列であれば、元の検索文字列に逆変換して検索結果格納部１１２に格納する。
【００７３】
このような検証処理を設けることで、検索対象の文字列の数が増えても検索時間が大幅に増加しない文字列検索を実現することができる。なお、図９には２つの文字列に対するマスクテーブルを示したが、３つ以上の文字列に対するマスクテーブルも、それぞれの文字列に対するマスクテーブルの論理和で与えられる。したがって、３つ以上の文字列も図７及び図１０と同様の処理により検索することができる。
【００７４】
ところで、上述した誤認識パターン２及び３の場合は、検索文字列と異なる長さの派生文字列が生成されるため、異なる長さの複数文字列を同時に検索する場合がある。この場合、オートマトン上で文字列が受理される状態を複数設けることで、異なる長さの文字列を検出できるようにする。
【００７５】
図１１は、文字列「ａｂａｃ」及び「ａｃａ」を検索する場合の非決定性有限オートマトンの例を示している。図１１のオートマトンの形状は、図３のオートマトンと同様である。
【００７６】
ただし、状態１が活性化されているときに、文字「ｂ」又は「ｃ」のいずれかが入力されると、状態２が活性化され、次に文字「ａ」が入力されると、状態３が活性化されて、入力文字列が受理される。状態３で入力文字列が受理された後も、検索処理は続行される。したがって、テキスト文書に文字列「ａｃａ」が存在すれば、その位置で状態３が活性化されるため、文字列「ａｃａ」が検出されたことが分かる。
【００７７】
この場合、図７の検索処理では、レジスタＲの４つのビットのうち第３及び第４ビットが受理ビットして扱われる。
例えば、テキスト文書Ｔとして「ａｂａｂａｃａ」が入力された場合、図１１のオートマトンは、図１２に示すように動作する。図１２において、テキスト文書Ｔの第３文字「ａ」が入力されたときと、第５文字「ａ」が入力されたときに、それぞれ状態２から状態３への遷移が起こり、状態３において文字列「ａｂａ」が受理される。また、第６文字「ｃ」が入力されたとき、状態３から状態４への遷移が起こり、状態４において文字列「ａｂａｃ」が受理される。さらに、第７文字「ａ」が入力されたとき、状態２から状態３への遷移が起こり、状態３において文字列「ａｃａ」が受理される。
【００７８】
文字列「ａｂａｃ」に対するマスクテーブルは図５のようになり、文字列「ａｃａ」に対するマスクテーブルは図１３のようになる。したがって、文字列「ａｂａｃ」及び「ａｃａ」に対するマスクテーブルは、図５の状態遷移マスクと図１３の状態遷移マスクの論理和で与えられ、図１４のようになる。
【００７９】
ただし、図１４のマスクテーブルは、文字列の第２文字が「ｂ」又は「ｃ」であることを表しているに過ぎない。このため、このマスクテーブルを用いて（１）式に従ってオートマトンを動作させると、目的の文字列「ａｂａｃ」及び「ａｃａ」以外に、文字列「ａｃａｃ」及び「ａｂａ」も検出されてしまう。
【００８０】
そこで、検証部１１１は、オートマトンで検出された文字列が目的の文字列か否かを判定する。例えば、検出文字列と同じ長さの検索文字列又は派生文字列を逐一比較することで、検出文字列が目的の文字列か否かを判定することができる。
【００８１】
図１５は、検出文字列と同じ長さの目的の文字列の数がＫ１個の場合の検証処理の例を示すフローチャートである。検証部１１１は、まず、オートマトンの受理状態に対応する検出文字列長をＬに設定する（ステップ１５０１）。例えば、図１１の状態３で文字列が受理された場合はＬ＝３となり、状態４で文字列が受理された場合はＬ＝４となる。
【００８２】
次に、受理時に入力された文字から前の長さＬの文字列をＹとして（ステップ１５０２）、制御変数ｋを１に設定する（ステップ１５０３）。次に、長さＬの目的の文字列のうちｋ番目の文字列をＸとして（ステップ１５０４）、文字列Ｘと文字列Ｙを比較する（ステップ１５０５）。
【００８３】
文字列Ｘと文字列Ｙが一致すれば（ステップ１５０５，ＹＥＳ）、文字列Ｘを検出したものと判定する（ステップ１５０６）。一方、文字列Ｘと文字列Ｙが一致しなければ（ステップ１５０５，ＮＯ）、次に、ｋとＫ１を比較する（ステップ１５０７）。ｋの値がＫ１に達していなければ（ステップ１５０７，ＮＯ）、ｋを１だけインクリメントして（ステップ１５０８）、ステップ１５０４以降の処理を繰り返す。そして、ｋの値がＫ１に達すると（ステップ１５０７，ＹＥＳ）、処理を終了する。
【００８４】
検証部１１１は、さらに、ステップ１５０６で検出された文字列が検索文字列又は派生文字列のいずれであるかを判定し、それが派生文字列であれば、元の検索文字列に逆変換して検索結果格納部１１２に格納する。
【００８５】
図１５の検証処理は、検索文字列及びすべての派生文字列が同じ長さである場合にも有効である。なお、図１１には２つの文字列に対するオートマトンを示したが、異なる長さの３つ以上の文字列に対するオートマトンも、それぞれの長さの文字列に対する受理状態を設けることで生成される。したがって、３つ以上の文字列も図７及び図１５と同様の処理により検索することができる。
【００８６】
次に、非決定性有限オートマトンと検証処理を組み合わせることで、文字の置換等の文字認識誤りを考慮したあいまい検索を実現する方法について説明する。
文字の置換とは、目的の文字列中の任意の文字が他の文字に置き換わったことを指す。例えば、文字列「ａｂｃ」中の文字「ｂ」を「ｘ」に置換すると、文字列「ａｘｃ」が得られる。ＯＣＲ等による文字認識結果ではこのような置換が発生する場合があるので、文字認識結果のテキスト文書を対象する文字列検索では、置換を考慮したあいまい検索を行うことが効果的である。
【００８７】
図１６は、置換を考慮したあいまい検索のための非決定性有限オートマトンの例を示している。図１６のオートマトンは、文字列「ａｂｃ」を検索するためのものであり、１５個の状態０〜１４を有する。最初は、状態０のみが活性化されており、状態１〜１４は非活性状態となっている。各状態が活性化されているときに、矢印の上に記された文字が入力されると、矢印で結ばれた次の状態が活性化され、元の状態は非活性となる。ただし、状態０は常に活性状態にしておく。
【００８８】
図１６のオートマトンでは、各状態からの遷移先である次の状態が１つではなく、２つ存在する。例えば、状態０が活性化されているときに、文字「ａ」が入力されると、状態１が活性化され、「ａ」以外の文字が入力されると、状態２が活性化される。
【００８９】
検索部１０７は、検索対象のテキスト文書の先頭文字から順に文字を取り出してオートマトンに作用させ、状態遷移を繰り返す。そして、状態７〜１４のいずれかが活性化されたとき、検出された文字列が受理される。テキスト文書に目的の文字列「ａｂｃ」が存在すれば、その位置で状態７が活性化されるため、目的の文字列が検出されたことが分かる。また、状態８〜１４のいずれかが活性化されると、文字列「ａｂｃ」中の１つ以上の文字を他の文字に置換した別の文字列が検出されたことが分かる。
【００９０】
置換された文字を「？」と記すことにすると、状態８〜１４により表される検出文字列は、以下の通りである。
状態８：「ａｂ？」
状態９：「ａ？ｃ」
状態１０：「ａ？？」
状態１１：「？ｂｃ」
状態１２：「？ｂ？」
状態１３：「？？ｃ」
状態１４：「？？？」
例えば、入力テキスト文書が「ａｘｃ」の場合、状態０→状態１→状態４→状態９なる状態遷移が行われる。また、入力テキスト文書が「ａｘｂｙ」の場合、状態０→状態１→状態４→状態１０と状態０→状態２→状態５→状態１２なる状態遷移が行われる。
【００９１】
図１６のオートマトンでは、目的の文字列に含まれる文字以外の文字が入力された場合でも、状態遷移の遷移先が一意に決まる。このため、文字列が受理された状態の状態番号から、目的の文字列のうち一致している文字とその位置を特定することが可能である。
【００９２】
このオートマトンの状態遷移は、以下に述べる方法により、情報処理装置における数回のシフト演算、論理積、及び論理和を利用して高速に実行することができる。
状態１〜１４は、例えば、状態変数としてのレジスタＲの第１ビット（最下位ビット）〜第１４ビット（最上位ビット）でそれぞれ表現される。レジスタＲの各ビットは、以下に示す状態番号の状態を表す。
第１ビット：状態１
第２ビット：状態２
第３ビット：状態３
第４ビット：状態５
第５ビット：状態４
第６ビット：状態６
第７ビット：状態７
第８ビット：状態１１
第９ビット：状態９
第１０ビット：状態１３
第１１ビット：状態８
第１２ビット：状態１２
第１３ビット：状態１０
第１４ビット：状態１４
【００９３】
各ビットのビット値“１”は活性状態を表し、ビット値“０”は非活性状態を表す。状態０は常に活性状態であるため、レジスタＲでは省略することができる。なお、この状態番号の数列は、以下のようにして作成できる。
【００９４】
ステップ１：図１７に示すように、レジスタＲのビット列を表すボックス列を用意し、その右端に状態番号２及び１を記入する。
ステップ２：図１８に示すように、状態番号２及び１を、左に２個及び４個だけシフトした位置にコピーする。
【００９５】
ステップ３：図１９に示すように、コピーされた状態番号２及び１を、図１６のオートマトンに従ってそれぞれの状態番号からの遷移先の状態番号に書き換える。
ステップ４：図２０に示すように、ステップ３で書き換えられた状態番号６、４、５、及び３を、さらに左に４個及び８個だけシフトした位置にコピーする。
【００９６】
ステップ５：ステップ３に戻って、図２１に示すように、コピーされた状態番号６、４、５、及び３をそれぞれの遷移先の状態番号に書き換える。これにより、上述した状態番号の数列が作成される。
【００９７】
なお、目的の文字列が４文字以上であり、オートマトンによる状態遷移の回数が多い場合は、ステップ３〜５の操作を必要な長さの数列ができるまで繰り返せばよい。この場合、ステップ４において、ステップ３で書き換えられたｎ個の状態番号が、さらに左にｎ個及び２ｎ個だけシフトした位置にコピーされる。
【００９８】
図２１の数列において、各ビット位置から遷移前の状態番号のビット位置までの距離（ステップ４におけるシフト量）は、図２２のようになる。図２２のビット位置と距離の関係から、検索部１０７が状態遷移を行うときのビットシフト量が求められる。例えば、状態３の直前の状態は、状態１である。ここで、状態３のビット位置は「３」であり、状態１のビット位置は「１」である。よって、状態３とその直前の状態との間の距離は「２」である。状態４の直前の状態は、状態１である。ここで、状態４のビット位置は「５」である。よって、状態４とその直前の状態との間の距離は「４」である。なお、第３〜第１４ビットのビットシフト量は、以下の通りである。
第３及び第４ビット：ビットシフト量＝２
第５〜第１０ビット：ビットシフト量＝４
第１１〜第１４ビット：ビットシフト量＝８
【００９９】
次に、文字列「ａｂｃ」に対する状態遷移マスクの生成方法について説明する。
ステップ１：Ｍｂ＝０ｂ１１１１００００１１００１０とする。Ｍｂは、図１６において、「ａ以外」、「ｂ以外」、及び「ｃ以外」と記された矢印が指す状態がすべて活性化されたときのレジスタＲのビット列を表す。このビット列の状態番号２、４、６、８、１０、１２、及び１４のビット値は“１”であり、それ以外の状態番号のビット値は“０”である。
【０１００】
ステップ２：文字列「ａｂｃ」中の各文字に対する状態遷移マスクＭ（ａ）、Ｍ（ｂ）、及びＭ（ｃ）を、その文字位置に対応する定数とＭｂの排他的論理和で定義する。各文字位置に対応する定数は、以下の通りである。
第１文字：０ｂ００００００００００００１１
第２文字：０ｂ００００００００１１１１００
第３文字：０ｂ１１１１１１１１００００００
【０１０１】
第１文字に対応する定数は、図１７の２つの状態番号のビット値を“１”とし、それ以外の状態番号のビット値を“０”にしたビット列に対応する。第２文字に対応する定数は、図１９で書き換えられた４つの状態番号のビット値を“１”とし、それ以外の状態番号のビット値を“０”にしたビット列に対応する。第３文字に対応する定数は、図２１で書き換えられた８個の状態番号のビット値を“１”とし、それ以外の状態番号のビット値を“０”にしたビット列に対応する。
【０１０２】
したがって、状態遷移マスクＭ（ａ）、Ｍ（ｂ）、及びＭ（ｃ）は、以下のようになる。
Ｍ（ａ）＝０ｂ００００００００００００１１＾Ｍｂ
＝０ｂ００００００００００００１１＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００１１０００１
Ｍ（ｂ）＝０ｂ００００００００１１１１００＾Ｍｂ
＝０ｂ００００００００１１１１００＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００００１１１０
Ｍ（ｃ）＝０ｂ１１１１１１１１００００００＾Ｍｂ
＝０ｂ１１１１１１１１００００００＾０ｂ１１１１００００１１００１０
＝０ｂ００００１１１１１１００１０
“＾”は、排他的論理和を表す。
【０１０３】
ステップ３：Ｍ（ａｂｃ以外）＝Ｍｂとする。
例えば、Ｍ（ａ）の各ビットと状態番号の対応関係は、図２３のようになる。Ｍ（ａ）のビット値“１”に対応する状態番号は、図１６において、入力文字が「ａ」である場合の遷移先の候補を表している。Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ａｂｃ以外）についても同様に、ビット値“１”は入力文字に対して状態遷移が可能であることを表し、ビット値“０”は状態遷移が不可能であることを表す。
【０１０４】
たとえば、状態０において「ａ」が入力されると、状態１が活性化される。よって、状態１を表す「ビット位置＝１」に「１」が設定される。また、状態１において「ａ」が入力されると、状態４が活性化される。よって、状態４を表す「ビット位置＝５」に「１」が設定される。さらに、状態２において「ａ」が入力されると、状態６が活性化される。よって、状態６を表す「ビット位置＝６」に「１」が設定される。同様に、状態３、４、５、６において「ａ」が入力されると、それぞれ状態８、１０、１２、１４が活性化される。よって、状態８、１０、１２、１４を表す「ビット位置＝１１、１３、１２、１４」にそれぞれ「１」が設定される。したがって、「Ｍ（ａ）＝０ｂ１１１１００００１１０００１」が得られる。
【０１０５】
レジスタＲにより状態１〜１４のそれぞれが活性状態か否かを表現し、状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ａｂｃ以外）により状態遷移の可否を表現すると、図１６の状態遷移は次式により表される。
Ｒi ＝（（（Ｒi-1 ＜＜２）＆Ｍ１）｜（（Ｒi-1 ＜＜４）＆Ｍ２）
｜（（Ｒi-1 ＜＜８）＆Ｍ３）｜３）＆Ｍ（Ｔ［ｉ］）      （２）
【０１０６】
Ｔ［ｉ］は、Ｎ文字のテキスト文書Ｔから入力されるｉ番目の文字（ｉ＝１，２，．．．，Ｎ）を表し、Ｒi は、ｉ番目の文字が入力されたときのレジスタＲのビット列を表す。ただし、Ｒ0 ＝０ｂ００００００００００００００である。Ｍ１〜Ｍ３及び３は、以下のビット列を表す。
Ｍ１＝０ｂ００００００００００１１００
Ｍ２＝０ｂ００００１１１１１１００００
Ｍ３＝０ｂ１１１１００００００００００
３＝０ｂ００００００００００００１１
“＜＜２”、“＜＜４”、及び“＜＜８”は、ビット列を左にそれぞれ２ビット、４ビット、及び８ビットシフトするシフト演算を表し、“｜”はビット列の論理和を表し、“＆”は、ビット列の論理積を表す。
【０１０７】
検索部１０７は、テキスト文書Ｔの各文字を順にオートマトンに入力し、（２）式に従って状態遷移を繰り返す。このとき、レジスタＲにおいて“０”から“１”に変化したビットの位置により、入力文字が目的の文字列に含まれるどの文字と一致したかが分かる。また、状態７〜１４のいずれが活性化されたかをチェックすることで、目的の文字列のうち何％の文字が入力文字列と一致したかが分かる。
【０１０８】
例えば、状態９が活性化された場合、文字列「ａｂｃ」のうち第１文字「ａ」と第３文字「ｃ」を含む文字列が検出されことが分かり、文字列の文字数の２／３＝６６％が一致することになる。ただし、第２文字「ｂ」がどの文字に置換されたのかは分からない。
【０１０９】
検出された文字列の判定基準としては様々なものが考えられるが、一例として検出文字列に含まれている目的の文字列中の文字の割合を用いることができる。この場合、検証部１１１は、次式により再現率を計算し、得られた再現率を閾値格納部１１０に格納された検索閾値と比較する。
再現率＝（検出文字列に含まれている目的の文字列中の文字の数）
／（目的の文字列長）                                      （３）
【０１１０】
（３）式による再現率の計算例は、以下の通りである。
（ａ）文字列「関係社外秘」の検索時に文字列「関係社外秘」が検出された場合
再現率＝５／５＝１００％
（ｂ）文字列「関係社外秘」の検索時に文字列「関系社外秘」が検出された場合
再現率＝４／５＝８０％
また、検出文字列に含まれている目的の文字列中の文字の数そのものを検索閾値と比較しても構わない。さらに、検出文字列に含まれていない目的の文字列中の文字（足りない文字）の数の割合を、再現率の代わりの判定基準として用いてもよい。
【０１１１】
図２４は、判定基準として再現率を用いた場合の（２）式に基づく検索処理の例を示すフローチャートである。検索部１０７は、まず、検索文字列「ａｂｃ」に対するマスクテーブルＭを生成する（ステップ２４０１）。このマスクテーブルＭには、上述した状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ａｂｃ以外）が含まれる。
【０１１２】
次に、レジスタＲにビット列０ｂ００００００００００００００を設定し、制御変数ｉに１を設定する（ステップ２４０２）。そして、レジスタＲのビット列に次式のようなビット操作を行って、レジスタＲを更新する（ステップ２４０３）。
Ｒ＝（（Ｒi-1 ＜＜２）＆Ｍ１）｜（（Ｒi-1 ＜＜４）＆Ｍ２）
｜（（Ｒi-1 ＜＜８）＆Ｍ３）                            （４）
【０１１３】
次に、レジスタＲとビット列０ｂ００００００００００００１１の論理和によりレジスタＲを更新する（ステップ２４０４）。さらに、レジスタＲと状態遷移マスクＭ（Ｔ［ｉ］）の論理積によりレジスタＲを更新し（ステップ２４０５）、レジスタＲの第７〜第１３ビット（受理ビット）が“１”か否かをチェックする（ステップ２４０６）。なお、第１４ビットに対応する状態１４は再現率が０％であるため、受理ビットのチェック対象から除外されている。
【０１１４】
すべての受理ビットが“１”でなければ（ステップ２４０６，ＮＯ）、次に、ｉがテキスト文書Ｔの最後の文字位置Ｎに達したか否かをチェックする（ステップ２４０７）。ｉがＮに達していなければ（ステップ２４０７，ＹＥＳ）、ｉを１だけインクリメントして（ステップ２４０８）、ステップ２４０３以降の処理を繰り返す。
【０１１５】
一方、ステップ２４０６においていずれかの受理ビットが“１”であれば（ステップ２４０６，ＹＥＳ）、その受理ビットに対応する検出文字列を検証部１１１に出力する。
検証部１１１は、その検出文字列の再現率を計算し、検索閾値と比較する（ステップ２４０９）。そして、再現率が検索閾値以上であれば（ステップ２４０９，ＹＥＳ）、検索文字列「ａｂｃ」を検出したものと判断し、そのときの文字位置ｉを記録する（ステップ２４１０）。
【０１１６】
その後、検索部１０７は、ステップ２４０７以降の処理を行う。再現率が検索閾値未満であれば（ステップ２４０９，ＮＯ）、検索部１０７は、そのままステップ２４０７以降の処理を行う。そして、ステップ２４０７においてｉがＮに達すると（ステップ２４０７，ＮＯ）、処理を終了する。
【０１１７】
一例として、テキスト文書「ａｘｃ」の第１文字「ａ」が入力されたとき、Ｒ＝０ｂ００００００００００００００に対して（４）式のビット操作を行うと、次のようになる（ステップ２４０３）。
Ｒ＝（（０ｂ００００００００００００００＜＜２）
＆０ｂ００００００００００１１００）
｜（（０ｂ００００００００００００００＜＜４）
＆０ｂ００００１１１１１１００００）
｜（（０ｂ００００００００００００００＜＜８）
＆０ｂ１１１１００００００００００）
＝（０ｂ００００００００００００００＆０ｂ００００００００００１１００）
｜（０ｂ００００００００００００００＆０ｂ００００１１１１１１００００）
｜（０ｂ００００００００００００００＆０ｂ１１１１００００００００００）
＝０ｂ００００００００００００００｜０ｂ００００００００００００００
｜０ｂ００００００００００００００
＝０ｂ００００００００００００００
【０１１８】
次に、Ｒとビット列０ｂ００００００００００００１１の論理和を計算すると、Ｒ＝０ｂ００００００００００００１１となる（ステップ２４０４）。次に、Ｒと状態遷移マスクＭ（ａ）＝０ｂ１１１１００００１１０００１の論理積を計算すると、Ｒ＝０ｂ０００００００００００００１となる（ステップ２４０５）。
【０１１９】
第２文字「ｘ」が入力されたとき、Ｒ＝０ｂ０００００００００００００１に対して（４）式のビット操作を行うと、次のようになる（ステップ２４０３）。
Ｒ＝（（０ｂ０００００００００００００１＜＜２）
＆０ｂ００００００００００１１００）
｜（（０ｂ０００００００００００００１＜＜４）
＆０ｂ００００１１１１１１００００）
｜（（０ｂ０００００００００００００１＜＜８）
＆０ｂ１１１１００００００００００）
＝（０ｂ０００００００００００１００＆０ｂ００００００００００１１００）
｜（０ｂ０００００００００１００００＆０ｂ００００１１１１１１００００）
｜（０ｂ０００００１００００００００＆０ｂ１１１１００００００００００）
＝０ｂ０００００００００００１００｜０ｂ０００００００００１００００
｜０ｂ００００００００００００００
＝０ｂ０００００００００１０１００
【０１２０】
次に、Ｒとビット列０ｂ００００００００００００１１の論理和を計算すると、Ｒ＝０ｂ０００００００００１０１１１となる（ステップ２４０４）。次に、Ｒと状態遷移マスクＭ（ａｂｃ以外）＝０ｂ１１１１００００１１００１０の論理積を計算すると、Ｒ＝０ｂ０００００００００１００１０となる（ステップ２４０５）。
【０１２１】
第３文字「ｃ」が入力されたとき、Ｒ＝０ｂ０００００００００１００１０に対して（４）式のビット操作を行うと、次のようになる（ステップ２４０３）。
Ｒ＝（（０ｂ０００００００００１００１０＜＜２）
＆０ｂ００００００００００１１００）
｜（（０ｂ０００００００００１００１０＜＜４）
＆０ｂ００００１１１１１１００００）
｜（（０ｂ０００００００００１００１０＜＜８）
＆０ｂ１１１１００００００００００）
＝（０ｂ０００００００１００１０００＆０ｂ００００００００００１１００）
｜（０ｂ０００００１００１０００００＆０ｂ００００１１１１１１００００）
｜（０ｂ０１００１０００００００００＆０ｂ１１１１００００００００００）
＝０ｂ００００００００００１０００｜０ｂ０００００１００１０００００
｜０ｂ０１００００００００００００
＝０ｂ０１０００１００１０１０００
【０１２２】
次に、Ｒとビット列０ｂ００００００００００００１１の論理和を計算すると、Ｒ＝０ｂ０１０００１００１０１０１１となる（ステップ２４０４）。次に、Ｒと状態遷移マスクＭ（ｃ）＝０ｂ００００１１１１１１００１０の論理積を計算すると、Ｒ＝０ｂ０００００１００１０００１０となる（ステップ２４０５）。このとき、Ｒの第９ビット（状態９に対応する受理ビット）が“１”になるため、文字列「ａ？ｃ」が検出される（ステップ２４０６，ＹＥＳ）。
【０１２３】
そこで、文字列「ａ？ｃ」の再現率６６％が検索閾値と比較される（ステップ２４０９）。このとき、検索閾値が６５％以下であれば、検索文字列「ａｂｃ」が検出されたものと判断される。
【０１２４】
別の例として、テキスト文書「ａｘｂｙ」の場合、第１文字及び第２文字が入力されたときの処理は、テキスト文書「ａｘｃ」の場合と同じである。
第３文字「ｂ」が入力されたとき、Ｒ＝０ｂ０００００００００１００１０に対して（４）式のビット操作を行うと、次のようになる（ステップ２４０３）。
Ｒ＝（（０ｂ０００００００００１００１０＜＜２）
＆０ｂ００００００００００１１００）
｜（（０ｂ０００００００００１００１０＜＜４）
＆０ｂ００００１１１１１１００００）
｜（（０ｂ０００００００００１００１０＜＜８）
＆０ｂ１１１１００００００００００）
＝（０ｂ０００００００１００１０００＆０ｂ００００００００００１１００）
｜（０ｂ０００００１００１０００００＆０ｂ００００１１１１１１００００）
｜（０ｂ０１００１０００００００００＆０ｂ１１１１００００００００００）
＝０ｂ００００００００００１０００｜０ｂ０００００１００１０００００
｜０ｂ０１００００００００００００
＝０ｂ０１０００１００１０１０００
【０１２５】
次に、Ｒとビット列０ｂ００００００００００００１１の論理和を計算すると、Ｒ＝０ｂ０１０００１００１０１０１１となる（ステップ２４０４）。次に、Ｒと状態遷移マスクＭ（ｂ）＝０ｂ１１１１００００００１１１０の論理積を計算すると、Ｒ＝０ｂ０１００００００００１０１０となる（ステップ２４０５）。このとき、Ｒの第１３ビット（状態１０に対応する受理ビット）が“１”になるため、文字列「ａ？？」が検出される（ステップ２４０６，ＹＥＳ）。
【０１２６】
そこで、文字列「ａ？？」の再現率３３％が検索閾値と比較される（ステップ２４０９）。このとき、検索閾値が３４％以上であれば、検索文字列「ａｂｃ」は検出されなかったものと判断される。
【０１２７】
第４文字「ｙ」が入力されたとき、Ｒ＝０ｂ０１００００００００１０１０に対して（４）式のビット操作を行うと、次のようになる（ステップ２４０３）。
Ｒ＝（（０ｂ０１００００００００１０１０＜＜２）
＆０ｂ００００００００００１１００）
｜（（０ｂ０１００００００００１０１０＜＜４）
＆０ｂ００００１１１１１１００００）
｜（（０ｂ０１００００００００１０１０＜＜８）
＆０ｂ１１１１００００００００００）
＝（０ｂ００００００００１０１０００＆０ｂ００００００００００１１００）
｜（０ｂ００００００１０１０００００＆０ｂ００００１１１１１１００００）
｜（０ｂ００１０１０００００００００＆０ｂ１１１１００００００００００）
＝０ｂ００００００００００１０００｜０ｂ００００００１０１０００００
｜０ｂ００１０００００００００００
＝０ｂ００１０００１０１０１０００
【０１２８】
次に、Ｒとビット列０ｂ００００００００００００１１の論理和を計算すると、Ｒ＝０ｂ００１０００１０１０１０１１となる（ステップ２４０４）。次に、Ｒと状態遷移マスクＭ（ａｂｃ以外）＝０ｂ１１１１００００１１００１０の論理積を計算すると、Ｒ＝０ｂ００１０００００１０００１０となる（ステップ２４０５）。このとき、Ｒの第１２ビット（状態１２に対応する受理ビット）が“１”になるため、文字列「？ｂ？」が検出される（ステップ２４０６，ＹＥＳ）。
【０１２９】
そこで、文字列「？ｂ？」の再現率３３％が検索閾値と比較される（ステップ２４０９）。このとき、検索閾値が３４％以上であれば、検索文字列「ａｂｃ」は検出されなかったものと判断される。
【０１３０】
非決定性有限オートマトンと検証処理の組み合わせによる文字列検索では、図１６に示したように、オートマトンの状態遷移を工夫することで、文字の置換を考慮したあいまい検索を行うことができる。このため、ＡＣアルゴリズムよりも高性能なあいまい検索が実現される。
【０１３１】
次に、検索文字列及び派生文字列を含む複数文字列を同時に検索するあいまい検索について説明する。複数文字列を同時に検索するには、非決定性有限オートマトンの各文字を複数の候補文字の和で表現すればよい。例えば、図１６のオートマトンにおいて、２つの文字列「ａｂｃ」及び「ｄａｆ」を検索する場合、矢印の上に記された文字を次のように置き換える。
「ａ」→「ａ／ｄ」
「ａ以外」→「ａｄ以外」
「ｂ」→「ｂ／ａ」
「ｂ以外」→「ｂａ以外」
「ｃ」→「ｃ／ｆ」
「ｃ以外」→「ｃｆ以外」
【０１３２】
これにより、図１６のオートマトンは、図２５のように変更される。文字列「ａｂｃ」及び「ｄａｆ」に対する状態遷移マスクは、以下の手順で生成される。
【０１３３】
ステップ１：Ｍｂ＝０ｂ１１１１００００１１００１０とする。このＭｂは、文字列「ａｂｃ」に対する状態遷移マスクを生成する場合と同じである。
ステップ２：文字列「ａｂｃ」及び「ｄａｆ」中の各文字に対する状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、Ｍ（ｄ）、及びＭ（ｆ）を、その文字位置に対応する定数の論理和とＭｂの排他的論理和で定義する。各文字位置に対応する定数は、文字列「ａｂｃ」に対する状態遷移マスクを生成する場合と同じである。
【０１３４】
例えば、文字「ａ」は、文字列「ａｂｃ」の第１文字であり、文字列「ｄａｆ」の第２文字である。したがって、文字「ａ」の文字位置に対応する定数の論理和は、第１文字に対応する定数０ｂ００００００００００００１１と、第２文字に対応する定数０ｂ００００００００１１１１００との論理和である。
【０１３５】
一方、文字「ｂ」は、文字列「ａｂｃ」の第２文字であり、文字列「ｄａｆ」には含まれていない。したがって、文字「ｂ」の文字位置に対応する定数の論理和は、第２文字に対応する定数０ｂ００００００００１１１１００そのものである。
【０１３６】
状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、Ｍ（ｄ）、及びＭ（ｆ）は、以下のようになる。
Ｍ（ａ）＝（０ｂ００００００００００００１１｜０ｂ００００００００１１１１００）
＾Ｍｂ
＝０ｂ００００００００１１１１１１＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００００１１０１
Ｍ（ｂ）＝０ｂ００００００００１１１１００＾Ｍｂ
＝０ｂ００００００００１１１１００＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００００１１１０
Ｍ（ｃ）＝０ｂ１１１１１１１１００００００＾Ｍｂ
＝０ｂ１１１１１１１１００００００＾０ｂ１１１１００００１１００１０
＝０ｂ００００１１１１１１００１０
Ｍ（ｄ）＝０ｂ００００００００００００１１＾Ｍｂ
＝０ｂ００００００００００００１１＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００１１０００１
Ｍ（ｆ）＝０ｂ１１１１１１１１００００００＾Ｍｂ
＝０ｂ１１１１１１１１００００００＾０ｂ１１１１００００１１００１０
＝０ｂ００００１１１１１１００１０
ステップ３：Ｍ（ａｂｃｄｆ以外）＝Ｍｂとする。
【０１３７】
ただし、以上の状態遷移マスクは、文字列の第１文字が「ａ」又は「ｄ」であり、かつ、第２文字が「ｂ」又は「ａ」であり、かつ、第３文字が「ｃ」又は「ｆ」であることを表しているに過ぎない。このため、（２）式に従ってオートマトンを動作させると、状態７において、目的の文字列「ａｂｃ」及び「ｄａｆ」以外に、文字列「ａｂｆ」、「ａａｃ」、「ａａｆ」、「ｄｂｃ」、「ｄｂｆ」、及び「ｄａｃ」も検出されてしまう。
【０１３８】
そこで、検証部１１１は、オートマトンで検出された文字列が検索文字列又は派生文字列であるか否かを判定する。オートマトンで文字列が受理された状態の状態番号により、目的の文字列のうち一致している文字の位置は既に判明しているため、検証処理は簡便に行うことができる。
【０１３９】
例えば、状態９で文字列が受理された場合、検出文字列には「ａｘｃ」、「ａｘｆ」等も含まれる。しかし、文字列の第１文字「ａ」と第３文字「ｃ／ｆ」は一致していることが保証されている。このため、検証処理においては、文字列「ａｂｃ」又は「ｄａｆ」中の特定の文字が存在するか否かだけを確認すればよい。この検証処理の手順については後で説明する。
【０１４０】
ところで、図２５のオートマトンは同じ長さの複数文字列を検索するためのものであるが、異なる長さの複数文字列を同時に検索する場合は、最長文字列の長さに合わせてオートマトンを生成すればよい。このとき、他の文字列の先頭に１つ以上のダミー文字（空白文字）を付加して、すべての文字列の長さを最長文字列の長さに一致させる。これにより、図２５のオートマトンと同様に、右端の複数の状態で複数文字列を検出することができる。
【０１４１】
例えば、図１６のオートマトンにおいて、２つの文字列「ａｂｃ」及び「ｄａ」を検索する場合、矢印の上に記された文字を次のように置き換える。
「ｂ」→「ｂ／ｄ」
「ｂ以外」→「ｂｄ以外」
「ｃ」→「ｃ／ａ」
「ｃ以外」→「ｃａ以外」
【０１４２】
これにより、図１６のオートマトンは、図２６のように変更される。文字列「ａｂｃ」及び「ｄａ」に対する状態遷移マスクは、以下の手順で生成される。
【０１４３】
ステップ１：Ｍｂ＝０ｂ１１１１００００１１００１０とする。このＭｂは、文字列「ａｂｃ」に対する状態遷移マスクを生成する場合と同じである。
ステップ２：文字列「ｄａ」を最長文字列「ａｂｃ」と同じ長さにするために、先頭にダミー文字「＿」を付加して文字列「＿ｄａ」に変更する。そして、文字列「ａｂｃ」及び「＿ｄａ」中の各文字に対する状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ｄ）を、その文字位置に対応する定数の論理和とＭｂの排他的論理和で定義する。各文字位置に対応する定数は、文字列「ａｂｃ」に対する状態遷移マスクを生成する場合と同じである。
【０１４４】
例えば、文字「ａ」は、文字列「ａｂｃ」の第１文字であり、文字列「＿ｄａ」の第３文字である。したがって、文字「ａ」の文字位置に対応する定数の論理和は、第１文字に対応する定数０ｂ００００００００００００１１と、第３文字に対応する定数０ｂ１１１１１１１１００００００との論理和である。
【０１４５】
一方、文字「ｂ」は、文字列「ａｂｃ」の第２文字であり、文字列「＿ｄａ」には含まれていない。したがって、文字「ｂ」の文字位置に対応する定数の論理和は、第２文字に対応する定数０ｂ００００００００１１１１００そのものである。
【０１４６】
状態遷移マスクＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、及びＭ（ｄ）は、以下のようになる。
Ｍ（ａ）＝（０ｂ００００００００００００１１｜０ｂ１１１１１１１１００００００）
＾Ｍｂ
＝０ｂ１１１１１１１１００００１１＾０ｂ１１１１００００１１００１０
＝０ｂ００００１１１１１１０００１
Ｍ（ｂ）＝０ｂ００００００００１１１１００＾Ｍｂ
＝０ｂ００００００００１１１１００＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００００１１１０
Ｍ（ｃ）＝０ｂ１１１１１１１１００００００＾Ｍｂ
＝０ｂ１１１１１１１１００００００＾０ｂ１１１１００００１１００１０
＝０ｂ００００１１１１１１００１０
Ｍ（ｄ）＝０ｂ００００００００１１１１００＾Ｍｂ
＝０ｂ００００００００１１１１００＾０ｂ１１１１００００１１００１０
＝０ｂ１１１１００００００１１１０
ステップ３：Ｍ（ａｂｃｄ以外）＝Ｍｂとする。
【０１４７】
ただし、以上の状態遷移マスクは、文字列の第２文字が「ｂ」又は「ｄ」であり、かつ、第３文字が「ｃ」又は「ａ」であることを表しているに過ぎない。このため、（２）式に従ってオートマトンを動作させると、状態７及び１１において、目的の文字列「ａｂｃ」及び「＿ｄａ」以外に、文字列「ａｄｃ」、「ａｄａ」、「ａｂａ」、「＿ｂｃ」、「＿ｂａ」、及び「＿ｄｃ」も検出されてしまう。
【０１４８】
そこで、検証部１１１は、オートマトンで検出された文字列が検索文字列又は派生文字列であるか否かを判定する。
次に、複数文字列のあいまい検索における検証処理について説明する。複数文字列のあいまい検索を行う場合、図２４の検索処理のステップ２４０９及び２４１０の処理が、図２７に示すような検証処理に置き換えられる。
【０１４９】
検証部１１１は、まず、図２４のステップ２４０６で“１”となった受理ビットに対応する状態番号から、検出文字列中の一致文字（？以外の文字）の位置をｘ（ｓ）に設定する（ステップ２７０１）。一致文字にはダミー文字も含まれ、一致文字の個数をＳ個とすると、検出文字列の先頭に近い位置から順にＳ個の位置ｘ（１）〜ｘ（Ｓ）が設定される。
【０１５０】
次に、目的の文字列（検索文字列及び派生文字列）の長さをＬとし（ステップ２７０２）、制御変数ｋを１に設定する（ステップ２７０３）。目的の文字列の長さが異なる場合は、最長文字列の長さがＬに設定される。
【０１５１】
次に、目的の文字列のうちｋ番目の文字列をＸとし（ステップ２７０４）、制御変数ｓ及びｆにＳ及び０を設定する（ステップ２７０５）。ｓは、ｓ番目の一致文字を表し、ｓ＝Ｓは、検出文字列の末尾に最も近い一致文字を指す。ｆは、検出文字列に含まれている文字列Ｘ中の文字の数を表す。
【０１５２】
次に、テキスト文書Ｔの第（ｉ−（Ｌ−ｘ（ｓ）））文字であるＴ［ｉ−（Ｌ−ｘ（ｓ））］と、文字列Ｘの第ｘ（ｓ）文字であるＸ［ｘ（ｓ）］とを比較する（ステップ２７０６）。ｉは、図２４のステップ２４０６で受理ビットが“１”になったときのテキスト文書Ｔの入力文字の位置を表す。
【０１５３】
Ｔ［ｉ−（Ｌ−ｘ（ｓ））］とＸ［ｘ（ｓ）］が一致しなければ（ステップ２７０６，ＮＯ）、ｓが１に達した否かをチェックする（ステップ２７０７）。ｓが１に達していなければ（ステップ２７０７，ＹＥＳ）、ｓを１だけデクリメントし（ステップ２７０８）、Ｘ［ｘ（ｓ）］がダミー文字か否かを判定する。Ｘ［ｘ（ｓ）］がダミー文字でなければ（ステップ２７０９，ＮＯ）、ステップ２７０６以降の処理を繰り返す。
【０１５４】
ステップ２７０６においてＴ［ｉ−（Ｌ−ｘ（ｓ））］とＸ［ｘ（ｓ）］が一致すれば（ステップ２７０６，ＹＥＳ）、ｆを１だけインクリメントし（ステップ２７１２）、ステップ２７０７以降の処理を行う。
【０１５５】
ステップ２７０７においてｓが１に達すれば（ステップ２７０７，ＮＯ）、文字列Ｘの全文字数に対する文字数ｆの割合を計算し、検索閾値と比較する（ステップ２７１３）。文字列Ｘにダミー文字が含まれている場合は、ダミー文字を除いた文字数が文字列Ｘの全文字数として用いられる。ステップ２７０９においてＸ［ｘ（ｓ）］がダミー文字である場合も（ステップ２７０９，ＹＥＳ）、ステップ２７１３の処理が行われる。
【０１５６】
文字数ｆの割合が検索閾値以上であれば（ステップ２７１３，ＹＥＳ）、文字列Ｘを検出したものと判断し、そのときの文字位置ｉを記録する（ステップ２７１４）。文字数ｆの割合が検索閾値未満であれば（ステップ２７１３，ＮＯ）、ｋが目的の文字列の数Ｋに達した否かをチェックする（ステップ２７１０）。
【０１５７】
ｋがＫに達していなければ（ステップ２７１０，ＮＯ）、ｋを１だけインクリメントし（ステップ２７１１）、ステップ２７０４以降の処理を繰り返す。そして、ステップ２７１０においてｋがＫに達すると（ステップ２７１０，ＹＥＳ）、処理を終了する。
【０１５８】
一例として、図２５のオートマトンを用いてテキスト文書「ａｘｃ」から文字列「ａｂｃ」及び「ｄａｆ」を検索する場合を説明する。この場合、ｉ＝３のときに状態９において文字列「ａ／ｄ？ｃ／ｆ」が検出されるため、第１文字及び第３文字が一致文字として扱われ、Ｓ＝２、ｘ（１）＝１、ｘ（２）＝３となる（ステップ２７０１）。また、文字列「ａｂｃ」及び「ｄａｆ」は３文字であるから、Ｌ＝３となる（ステップ２７０２）。
【０１５９】
次に、Ｘ＝ａｂｃとおいて、入力済みのテキスト文書「ａｘｃ」と文字列Ｘが末尾から順に比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝２のとき、ｘ（２）＝３であるから、Ｔ［３−（３−３）］＝Ｔ［３］とＸ［３］が比較される（ステップ２７０６）。Ｔ［３］＝Ｘ［３］＝ｃであるから、ｆ＝１となる（ステップ２７１２）。
【０１６０】
次に、ｓ＝１のとき、ｘ（１）＝１であるから、Ｔ［３−（３−１）］＝Ｔ［１］とＸ［１］が比較される（ステップ２７０６）。Ｔ［１］＝Ｘ［１］＝ａであるから、ｆ＝２となる（ステップ２７１２）。
【０１６１】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝２の割合６６％が検索閾値と比較される（ステップ２７１３）。このとき、検索閾値が６５％以下であれば、文字列「ａｂｃ」が検出されたものと判断される（ステップ２７１４）。
【０１６２】
別の例として、テキスト文書「ａｘｂｙ」の場合、ｉ＝３のときに状態１０において文字列「ａ／ｄ？？」が検出されるため、第１文字が一致文字として扱われ、Ｓ＝１、ｘ（１）＝１となる（ステップ２７０１）。この場合も、Ｌ＝３である（ステップ２７０２）。
【０１６３】
次に、Ｘ＝ａｂｃとおいて、入力済みのテキスト文書の「ａｘｂ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝１であるから、Ｔ［３−（３−１）］＝Ｔ［１］とＸ［１］が比較される（ステップ２７０６）。Ｔ［１］＝Ｘ［１］＝ａであるから、ｆ＝１となる（ステップ２７１２）。
【０１６４】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝１の割合３３％が検索閾値と比較される（ステップ２７１３）。このとき、検索閾値が３４％以上であれば、文字列「ａｂｃ」は検出されなかったものと判断される。
【０１６５】
次に、Ｘ＝ｄａｆとおいて、入力済みのテキスト文書「ａｘｂ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝１であるから、Ｔ［３−（３−１）］＝Ｔ［１］とＸ［１］が比較される（ステップ２７０６）。Ｔ［１］＝ａかつＸ［１］＝ｄであるから、ｆ＝０のままである。
【０１６６】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝０の割合０％が検索閾値と比較される（ステップ２７１３）。このとき、文字列「ｄａｆ」は検出されなかったものと判断される。
【０１６７】
次に、ｉ＝４のときに状態１２において文字列「？ｂ／ａ？」が検出されるため、第２文字が一致文字として扱われ、Ｓ＝１、ｘ（１）＝２となる（ステップ２７０１）。
次に、Ｘ＝ａｂｃとおいて、入力済みのテキスト文書「ａｘｂｙ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝２であるから、Ｔ［４−（３−２）］＝Ｔ［３］とＸ［２］が比較される（ステップ２７０６）。Ｔ［３］＝Ｘ［２］＝ｂであるから、ｆ＝１となる（ステップ２７１２）。
【０１６８】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝１の割合３３％が検索閾値と比較される（ステップ２７１３）。このとき、検索閾値が３４％以上であれば、文字列「ａｂｃ」は検出されなかったものと判断される。
【０１６９】
次に、Ｘ＝ｄａｆとおいて、入力済みのテキスト文書「ａｘｂｙ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝２であるから、Ｔ［４−（３−２）］＝Ｔ［３］とＸ［２］が比較される（ステップ２７０６）。Ｔ［３］＝ｂかつＸ［２］＝ａであるから、ｆ＝０のままである。
【０１７０】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝０の割合０％が検索閾値と比較される（ステップ２７１３）。このとき、文字列「ｄａｆ」は検出されなかったものと判断される。
【０１７１】
以上より、テキスト文書「ａｘｂｙ」からは、文字列「ａｂｃ」又は「ｄａｆ」のいずれも検出されない。
【０１７２】
さらに別の例として、図２６のオートマトンを用いてテキスト文書「ａｘｃ」から文字列「ａｂｃ」及び「ｄａ」を検索する場合を説明する。この場合、ｉ＝３のときに状態９において文字列「ａ？ｃ／ａ」が検出されるため、図２５のオートマトンを用いた場合と同様にして、文字列「ａｂｃ」が検出されたものと判断される。
【０１７３】
一方、テキスト文書「ａｘｂｙ」の場合、ｉ＝３のときに状態１０において文字列「ａ？？」が検出されるため、第１文字が一致文字として扱われ、Ｓ＝１、ｘ（１）＝１となる（ステップ２７０１）。この場合も、Ｌ＝３である（ステップ２７０２）。
【０１７４】
次に、Ｘ＝ａｂｃとおいて、入力済みのテキスト文書の「ａｘｂ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝１であるから、Ｔ［３−（３−１）］＝Ｔ［１］とＸ［１］が比較される（ステップ２７０６）。Ｔ［１］＝Ｘ［１］＝ａであるから、ｆ＝１となる（ステップ２７１２）。
【０１７５】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝１の割合３３％が検索閾値と比較される（ステップ２７１３）。このとき、検索閾値が３４％以上であれば、文字列「ａｂｃ」は検出されなかったものと判断される。
【０１７６】
次に、Ｘ＝＿ｄａとおいて、入力済みのテキスト文書「ａｘｂ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝１であるから、Ｔ［３−（３−１）］＝Ｔ［１］とＸ［１］が比較される（ステップ２７０６）。Ｔ［１］＝ａかつＸ［１］＝＿であるから、ｆ＝０のままである。
【０１７７】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝０の割合０％が検索閾値と比較される（ステップ２７１３）。このとき、文字列「ｄａ」は検出されなかったものと判断される。
【０１７８】
次に、ｉ＝４のときに状態１２において文字列「？ｂ／ｄ？」が検出されるため、第２文字が一致文字として扱われ、Ｓ＝１、ｘ（１）＝２となる（ステップ２７０１）。
次に、Ｘ＝ａｂｃとおいて、入力済みのテキスト文書「ａｘｂｙ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝２であるから、Ｔ［４−（３−２）］＝Ｔ［３］とＸ［２］が比較される（ステップ２７０６）。Ｔ［３］＝Ｘ［２］＝ｂであるから、ｆ＝１となる（ステップ２７１２）。
【０１７９】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝１の割合３３％が検索閾値と比較される（ステップ２７１３）。このとき、検索閾値が３４％以上であれば、文字列「ａｂｃ」は検出されなかったものと判断される。
【０１８０】
次に、Ｘ＝＿ｄａとおいて、入力済みのテキスト文書「ａｘｂｙ」と文字列Ｘが比較される（ステップ２７０６〜２７０９）。まず、ｓ＝Ｓ＝１のとき、ｘ（１）＝２であるから、Ｔ［４−（３−２）］＝Ｔ［３］とＸ［２］が比較される（ステップ２７０６）。Ｔ［３］＝ｂかつＸ［２］＝ｄであるから、ｆ＝０のままである。
【０１８１】
ここで、ｓが１に達したため、文字列Ｘの全文字数３に対する文字数ｆ＝０の割合０％が検索閾値と比較される（ステップ２７１３）。このとき、文字列「ｄａ」は検出されなかったものと判断される。
【０１８２】
以上より、テキスト文書「ａｘｂｙ」からは、文字列「ａｂｃ」又は「ｄａ」のいずれも検出されない。
【０１８３】
検証部１１１は、図２７のステップ２７１４で検出された文字列が検索文字列又は派生文字列のいずれであるかを判定し、それが派生文字列であれば、元の検索文字列に逆変換して検索結果格納部１１２に格納する。
【０１８４】
図２７の検証処理は、検索文字列及び派生文字列が同じ長さであるか否かにかかわらず有効である。この検証処理によれば、オートマトンの受理状態から検出文字列における一致文字の位置を特定し、検出文字列と目的の文字列におけるその位置の文字同士を比較することで、検出文字列の検証を高速に行うことができる。
【０１８５】
なお、図２５及び図２６には２つの文字列に対するオートマトンを示したが、３つ以上の文字列に対するオートマトンも、矢印の上に記された文字を複数の候補文字で置き換えることで生成される。したがって、３つ以上の文字列も図２４及び図２７と同様の処理により検索することができる。
【０１８６】
図２８は、別の実施形態の検索装置の構成例を示している。図２８に示す検索装置（第２の検索装置）は、図１の構成に出力部２８０１及び編集部２８０２を追加した構成を有する。出力部２８０１は、派生文字列生成部１０５により生成された派生文字列を外部に出力する。出力方法は画面表示でもよく、ファイル出力でもよい。
【０１８７】
ユーザは、出力された派生文字列を確認し、必要であれば、編集部２８０２を用いて派生文字列を編集する。なお、派生文字列を編集する代わりに、文字格納部１０４に格納された文字情報を編集してもよい。これにより、ユーザが自ら派生文字列の追加又は削除を行ったり、派生文字列生成方法を変更したりすることができる。
【０１８８】
ところで、派生文字列の生成方法としては、誤認識文字への置き換え以外にも、表記の異なる別の文字への置き換えが考えられる。このような派生文字列には、以下のものが含まれる。
（１）片仮名と平仮名の揺らぎを吸収する派生文字列
例えば、「ハミガキ粉」と「はみがき粉」のように、片仮名の文字列と平仮名の文字列を相互に変換することで、派生文字列を生成する。
（２）全角文字と半角文字の揺らぎを吸収する派生文字列
全角文字列と半角文字列を相互に変換することで、派生文字列を生成する。
（３）難読漢字の漢字表記と平仮名表記の揺らぎを吸収する派生文字列
例えば、「情報漏洩」と「情報漏えい」や、「曖昧」と「あいまい」のように、漢字文字列と平仮名文字列を相互に変換することで、派生文字列を生成する。
（４）住所表記の揺らぎを吸収する派生文字列
例えば、「中原区上小田中４丁目１番地の１」と「中原区上小田中４−１−１」のように、異なる住所標記を相互に変換することで、派生文字列を生成する。
（５）別称、愛称、又は略称を持つ名詞のための派生文字列
例えば、「パソコン」と「ＰＣ」のように、名詞とその別称、愛称、又は略称とを相互に変換することで、派生文字列を生成する。
【０１８９】
これらの派生文字列を生成するには、図２の文字テーブルにおいて、検索文字列中の文字の代わりに検索文字列中の文字列を登録し、誤認識文字の代わりに別表記の文字列を登録すればよい。
【０１９０】
図２９は、さらに他の実施形態の検索装置の構成を示す図である。図２９に示す検索装置（第３の検索装置）は、スキャナ１０１、文字認識部２９０１、文書格納部２９０２、文字格納部１０４、派生文字列生成部１０５、オートマトン生成部１０６、検索部２９０３、入力部１０８、検索文字列格納部１０９、閾値格納部１１０、検証部１１１、検索結果格納部１１２、出力部１１３を備える。なお、スキャナ１０１、文字格納部１０４、派生文字列生成部１０５、オートマトン生成部１０６、入力部１０８、検索文字列格納部１０９、閾値格納部１１０、検証部１１１、検索結果格納部１１２、出力部１１３は、特に限定されるものではないが、図１に示す対応する機能要素により実現される。また、第３の検索装置は、文字格納部１０４および派生文字列生成部１０５を備えなくてもよい。すなわち、第３の検索装置において、文字格納部１０４および派生文字列生成部１０５は必須の構成要素ではない。
【０１９１】
文字認識部２９０１は、スキャナ１０１により得られる文字画像について文字認識を行い、テキスト文書を生成する。このとき、文字認識部２９０１は、文字画像上の各文字について複数の候補文字を生成する。文書格納部２９０２は、文字認識部２９０１により生成されるテキスト文書を格納する。なお、文字認識部２９０１および文書格納部２９０２は、検索装置の一部であってもよいし、検索装置の一部でなくてもよい。
【０１９２】
図３０は、第３の検索装置において、文字認識部２９０１により生成されるテキスト文書の一部の実施例である。この例では、原文が「・・・全額１万円を送ります・・・」である。そして、各文字に対してそれぞれ複数の認識結果候補文字が得られている。たとえば、「全」に対して、第１候補として「金」が得られており、第２候補として「全」が得られている。また、「額」に対して、第１候補として「額」が得られており、第２候補として「顎」が得られている。この結果、第１候補文字ばかりを集めると「金額ｌ方丹を迭ります」が生成され、第２候補文字ばかり集めると「全顎Ｉ万門在送リ主ず」が生成される。
【０１９３】
文字格納部２９０２は、第１候補文字列だけでなく、第２候補文字列も合わせて格納する。このとき、第１候補文字列は、認識結果として格納されるようにしてもよい。なお、図３０に示す例では、第１および第２の候補が生成されて格納されているが、より多くの候補が生成されて格納されてもよい。
【０１９４】
検索部２９０３は、オートマトン生成部１０６により生成されるオートマトンを利用して、検索対象文書から検索文字列を検索する。オートマトンは、上述したように、検索文字列に基づいて生成される。検索対象文書は、文書格納部２９０２に格納されているテキスト文書である。検索文字列は、例えば、ユーザにより指定されて入力部１０８を介して入力される。なお、検索装置が文字格納部１０４および派生文字列生成部１０５を備える場合は、検索文字列は、派生文字列生成部１０５により生成される派生文字列を含むものとする。
【０１９５】
検証部１１１は、上述した方法で、検索部２９０３により検出された文字列が検索文字列（または、派生文字列）に該当するか否かを判定する。検索結果格納部１１２は、検索結果を格納する。そして、出力部１１３は、検索結果格納部１１２に格納されている検索結果を出力する。
【０１９６】
第３の検索装置においては、認識結果（第１候補）として格納されているテキスト文書だけでなく、２番目以降の認識結果候補文字も利用して検索が行われる。例えば、検索対象文書として、図３０に示す認識結果および第２候補が格納されているときに、検索文字列として「全額１万円を送ります」が入力されたものとする。そうすると、第１候補文字列においては「額」「を」「り」「ま」「す」が一致する。この場合、上記検索がヒットするためには、再現率の閾値レベルを５０パーセント以下に設定する必要がある。ところが、閾値レベルを低くすると、不要な文字列も検出されてしまい、検索結果が多くの雑音を含むこととなる。
【０１９７】
そこで、第３の検索装置は、２番目以降の認識結果候補を参照する。この例では、第２候補文字列が検索される。そうすると、第２候補文字列においては、「全」「万」「送」が一致する。すなわち、検索文字ごとに、第１候補文字列または第２候補文字列の双方を検索することにより、再現率は８０パーセントに向上する。この場合、閾値レベルを例えば７５パーセントに設定しても、上記検索はヒットすることになる。したがって、雑音の少ない検索結果が得られる。
【０１９８】
図３１は、検索部２９０３の動作を示すフローチャートである。なお、文書格納部２９０２には、各文字について複数の候補文字が用意された検索対象文書が格納されている。また、検索部２９０３には、オートマトン生成部１０６により生成されたオートマトンが与えられる。
【０１９９】
ステップ３１０１において、検索部２９０３は、検索対象文書として格納されている認識結果文字Ｔp[i]を読み込む。ｉは、検索対象文書の先頭からの文字の位置を表す。ｐは、文字認識結果の候補番号を表す。例えば、Ｔ2[10]は、第１０番目の文字についての認識結果の第２候補を表す。
【０２００】
ステップ３１０２において、検索部２９０３は、検索対象文書のｉ番目の文字に対応するＴp[i]をオートマトンに作用させる。これにより、状態変数Ｒpが算出される。ここで、文書格納部２９０２には、各文字についてそれぞれ第１〜Ｋ候補が格納されている。すなわち、ｐ＝１，２，．．．，Ｋである。この場合、検索部２９０３は、オートマトンに対してＴ1[i]〜ＴK[i]をそれぞれ独立して作用させ、状態変数Ｒ1〜ＲKを算出する。
【０２０１】
ステップ３１０３において、検索部２９０３は、状態変数Ｒを更新する。状態変数Ｒは、状態変数Ｒ1〜ＲKに基づいて更新される。すなわち、状態変数Ｒは、検索対象文書の入力文字の第１〜Ｋ候補を考慮して更新される。このとき、入力文字に対応する複数の候補文字のいずれか１つが検索文字に一致するときには、状態変数列中の一致した文字に対応する状態変数が活性化される。一方、入力文字に対応する複数の候補文字がいずれも検索文字に一致しないときには、状態変数列中の別の文字に対応する状態変数が活性化される。
【０２０２】
ステップ３１０４において、変数ｉがインクリメントされる。すなわち、検索対象文書の次の文字が選択される。以降、検索対象文書のすべての文字についてステップ３１０２〜３１０３の処理が繰り返し実行される。
【０２０３】
次に、図３１に示すフローチャートの処理の実施例を説明する。以下の説明では、文書格納部２９０２に図３０に示す検索対象文書が格納されているものとする。この例では、Ｋ＝２であり、検索対象文書の各文字についてそれぞれ第１候補および第２候補が格納されている。また、検索文字列は「全額１万」であり、オートマトン生成部１０６により図３２に示すオートマトンが生成されているものとする。このオートマトンでは、与えられた検索文字列に対して状態０〜状態３０が定義されている。なお、状態０は、常に活性状態である。
【０２０４】
図３２に示すオートマトンに「全」を作用させると、状態１が活性化される。これに対して、上記オートマトンに「全以外の文字」を作用させると、状態２が活性化される。また、状態１が活性状態であるときに、「額」を作用させると状態３が活性化され、「額以外の文字」を作用させると状態４が活性化される。同様に、状態２が活性状態であるときに、「額」を作用させると状態５が活性化され、「額以外の文字」を作用させると状態６が活性化される。他の状態遷移も同様である。なお、このオートマトンは、状態１５〜３０のいずれか１つが活性化されたときに受理状態となる。
【０２０５】
ステップ３１０１において、文書格納部２９０２から検索部２９０３へ検索対象文書が入力される。以下の説明では、各検索部２９０３に入力される文字をＴp[i]で表すものとする。図３０に示す例では、Ｔ1[1]＝金、Ｔ2[1]＝全、Ｔ1[2]＝額、Ｔ2[2]＝顎、．．．である。
【０２０６】
ステップ３１０２において、図３２に示すオートマトンにＴp[i]が与えられる。この場合、まず、「ｉ＝１」について処理が実行される。すなわち、Ｔ1[1]＝金、Ｔ2[1]＝全がそれぞれオートマトンに与えられる。
【０２０７】
「金（Ｔ1[1]）」が入力されたときは、状態０において「全以外の文字」と判定されるので、図３３（ａ）に示すように、状態２が活性化される。これにより、図３３（ａ）に示す状態を表す状態変数Ｒ1が生成される。一方、「全（Ｔ2[1]）」が入力されたときには、状態０において「全」と判定されるので、図３３（ｂ）に示すように、状態１が活性化される。これにより、図３３（ｂ）に示す状態を表す状態変数Ｒ2が生成される。
【０２０８】
ステップ３１０３においては、状態変数Ｒ1、Ｒ2に基づいて、状態変数Ｒが更新される。このとき、検索文字「全」が第１候補または第２候補に一致すれば、この検索文字についての検索結果は「ヒット」と判定される。この場合、状態変数Ｒは、状態１が活性化された状態に更新される。一方、検索文字「全」が第１候補または第２候補のいずれにも一致しないときには、この検索文字についての検索結果は「ミス」と判定される。この場合、状態変数Ｒは、状態２が活性化された状態に更新される。この例では、第２候補として「全」が格納されている。したがって、Ｔ1[1]、Ｔ2[1]が入力されたときに、状態変数Ｒは、図３４に示すように、状態１が活性化された状態に更新される。なお、図３４においては、太線の丸枠が活性状態を表している。
【０２０９】
２番目の検索文字は「額」である。このとき、検索対象文書の２番目の文字の第１候補および第２候補は、それぞれ、「額（Ｔ1[2]）」および「顎（Ｔ2[2]）」である。すなわち、この検索文字は、第１候補に一致する。したがって、状態１が活性状態であるときにＴ1[2]、Ｔ2[2]が入力されると、図３４に示すように、状態３が活性化される。
【０２１０】
３番目の検索文字は「１（数字）」である。このとき、検索対象文書の３番目の文字の第１候補および第２候補は、それぞれ、「ｌ（Ｔ1[3]、アルファベットの小文字のエル）」および「Ｉ（Ｔ2[3]、アルファベットの大文字のアイ）」である。すなわち、この検索文字は、第１候補または第２候補のいずれにも一致していない。したがって、状態３が活性状態であるときにＴ1[3]、Ｔ2[3]が入力されると、図３４に示すように、状態８が活性化される。
【０２１１】
４番目の検索文字は「万」である。このとき、検索対象文書の４番目の文字の第１候補および第２候補は、それぞれ、「方（Ｔ1[4]）」および「万（Ｔ2[4]）」である。すなわち、この検索文字は、第２候補に一致する。したがって、状態８が活性状態であるときにＴ1[4]、Ｔ2[4]が入力されると、図３４に示すように、状態１７が活性化される。
【０２１２】
上述のようにして状態１７が活性化されると、検索部２９０３は、受理状態が得られたと判定し、検索文字列に対応する文字列が検出された旨を表す情報を検証部１１１に通知する。ここで、状態１７は、１番目、２番目、４番目の検索文字がそれぞれ第１候補または第２候補に一致すると共に、３番目の検索文字が第１候補または第２候補のいずれにも一致していないことを表している。したがって、この検索結果の再現率は、７５パーセントである。そして、この再現率が閾値レベルを超えていれば、検索対象文書から検索文字列が検出されたと判定される。
【０２１３】
図３５は、第３の検索装置が備える検索部２９０３の動作を詳細に示すフローチャートである。なお、このフローチャートは、検索文字列が３文字である場合の処理を示している。
【０２１４】
ステップ３５０１〜３５０４は、基本的に、図２４に示すフローチャートのステップ２４０１〜２４０４と同じである。すなわち、ステップ３５０１において、検索文字列に対応するマスクテーブルＭが生成される。ステップ３５０２において、レジスタＲにゼロが設定され、検索対象文書の文字位置を表す変数ｉに「１」が設定される。そして、ステップ３５０３〜３５０４において、下式に従ってレジスタＲが更新され、さらにその更新結果と「３」との論理和が算出される。
Ｒ＝（（Ｒi-1 ＜＜２）＆Ｍ１）｜（（Ｒi-1 ＜＜４）＆Ｍ２）｜
（（Ｒi-1 ＜＜８）＆Ｍ３）
【０２１５】
ステップ３５０５において、検索部２９０３は、認識結果の候補番号を識別する変数ｊに「１」を設定する。ステップ３５０６〜３５０８において、検索部２９０３は、各候補文字について、レジスタＲとマスクＭ（Ｔj[i]）との論理積を算出する。すなわち、第１〜Ｋ候補について論理積を算出する。これにより、各候補に対応するレジスタＲj（ｊ＝１〜Ｋ）がそれぞれ算出される。
【０２１６】
ステップ３５０９において、検索部２９０３は、各レジスタＲj（ｊ＝１〜Ｋ）の論理積Ｒ’、および各レジスタＲj（ｊ＝１〜Ｋ）の論理和Ｒ”を算出する。また、ステップ３５１０において、検索部２９０３は、下式に従ってレジスタＲを更新する。なお、Ｍ４およびＭ５は、後で実施例を示すが、所定の定数である。
Ｒ＝（Ｒ’＆ Ｍ４）｜（Ｒ”＆ Ｍ５）
ステップ３５１１において、検索部２９０３は、ステップ３５１０により得られるレジスタＲの受理ビットをチェックする。このとき、いずれかの受理ビットに「１」が書き込まれていれば、検索部２９０３は、ステップ３５１４において、その受理ビットに対応する検索文字列を出力する。なお、いずれの受理ビットにも「１」が書き込まれていなければ、ステップ３５１４はスキップされる。
【０２１７】
ステップ３５１２において、変数ｉがＮに達したかがチェックされる。Ｎは、検索対象文書の最後の文字の位置を表す。そして、変数ｉがＮに達してなければ、ステップ３５１３において変数ｉをインクリメントしてステップ３５０３に戻る。すなわち、検索対象文書の各文字について、上述の処理が実行される。
【０２１８】
次に、図３５に示すフローチャートの処理の実施例を説明する。ここでは、説明を簡単にするために、検索文字列は「全額１」であるものとする。この場合、検索文字列に対応するオートマトンは、図３６に示すように、状態０〜１４を有する。また、図３０に示す検索対象文書が検索されるものとする。すなわち、各文字について第１および第２候補が用意されており、Ｋ＝２である。
【０２１９】
ステップ３５０１において生成されるマスクＭは、下記の通りである。
Ｍ（全）＝０ｂ１１１１００００１１０００１
Ｍ（額）＝０ｂ１１１１００００００１１１０
Ｍ（１）＝０ｂ００００１１１１１１００１０
Ｍ（全、額、１以外）＝０ｂ１１１１００００１１００１０
なお、マスクＭを生成する方法は、図１６〜図２４を参照しながら説明した通りである。ただし、Ｍ（全）、Ｍ（額）、Ｍ（１）、Ｍ（全、額、１以外）は、それぞれＭ（ａ）、Ｍ（ｂ）、Ｍ（ｃ）、Ｍｂに対応する。
【０２２０】
ここで、ステップ３５１０で使用されるマスクＭ４およびＭ５について説明する。マスクＭ４は、検索文字が一致したときに活性化される状態に対して「１」を割り当て、他の状態に対して「０」を割り当てるマスクパターンにより実現される。これに対して、マスクＭ５は、検索文字が不一致であったときに活性化される状態に対して「１」を割り当て、他の状態に対して「０」を割り当てるマスクパターンにより実現される。
【０２２１】
図３６においては、ある状態が活性化されているときに、検索文字が入力文字に一致すると二本線の矢印により指し示される状態が活性化され、検索文字が入力文字に一致しなければ一本線の矢印により指し示される状態が活性化される。この例では、検索文字が一致したときには、丸枠で囲まれている奇数番号（１、３、５、７、９、１１、１３）の状態が活性化されている。ここで、図２２に示すようにしてレジスタＲの各ビット位置に対応する状態が割り当てられるものとすると、検索一致に対しては、状態１に対応する第１ビット、状態３に対応する第３ビット、状態５に対応する第４ビット、状態７に対応する第７ビット、状態９に対応する第９ビット、状態１１に対応する第８ビット、状態１３に対応する第１０ビットに対して「１」を設定し、他のビットに対して「０」を設定すれば、マスクＭ４が実現される。すなわち、マスクＭ４は「０ｂ００００１１１１００１１０１」となる。同様に、検索文字が不一致であったときには、四角枠で囲まれている偶数番号（２、４、６、８、１０、１２、１４）の状態が活性化されている。よって、マスクＭ５は、「０ｂ１１１１００００１１００１０」となる。
【０２２２】
図３５に示すフローチャートの説明に戻る。この例では、まず、検索対象文書に対して「ｉ＝１」が設定され、「金（Ｔ1[1]）」および「全（Ｔ2[1]）」が入力される。
「金」および「全」が入力されると、ステップ３５０３において、Ｒ＝０ｂ００００００００００００００に対して下記のビット操作が行われる。
Ｒ＝（（０ｂ００００００００００００００＜＜２）
＆０ｂ００００００００００１１００）
｜（（０ｂ００００００００００００００＜＜４）
＆０ｂ００００１１１１１１００００）
｜（（０ｂ００００００００００００００＜＜８）
＆０ｂ１１１１００００００００００）
＝（０ｂ００００００００００００００＆０ｂ００００００００００１１００）
｜（０ｂ００００００００００００００＆０ｂ００００１１１１１１００００）
｜（０ｂ００００００００００００００＆０ｂ１１１１００００００００００）
＝０ｂ００００００００００００００｜０ｂ００００００００００００００
｜０ｂ００００００００００００００
＝０ｂ００００００００００００００
また、ステップ３５０４において、レジスタＲと「３」との論理和を計算することにより、Ｒ＝０ｂ００００００００００００１１が得られる。
【０２２３】
続いて、「金」に対してステップ３５０６の演算が実行される。この場合、レジスタＲは下記のように更新される。
Ｒ（金）＝０ｂ００００００００００００１１＆Ｍ（全、額、１以外）
＝０ｂ００００００００００００１１＆０ｂ１１１１００００１１００１０
＝０ｂ００００００００００００１０
【０２２４】
また、「全」に対してステップ３５０６の演算が実行される。この場合、レジスタＲは下記のように更新される。
Ｒ（全）＝０ｂ００００００００００００１１＆Ｍ（全）
＝０ｂ００００００００００００１１＆０ｂ１１１１００００１１０００１
＝０ｂ０００００００００００００１
【０２２５】
続いて、ステップ３５０９において、レジスタＲ’、Ｒ”が計算される。
Ｒ’＝Ｒ（金）｜Ｒ（全）
＝０ｂ００００００００００００１０｜０ｂ０００００００００００００１
＝０ｂ００００００００００００１１
Ｒ”＝Ｒ（金）＆Ｒ（全）
０ｂ００００００００００００１０＆０ｂ０００００００００００００１
＝０ｂ００００００００００００００
【０２２６】
さらに、ステップ３５１０において、レジスタＲ’、Ｒ”、マスクＭ４、Ｍ５に基づいて、レジスタＲが更新される。
Ｒ＝（Ｒ’＆Ｍ４）｜（Ｒ”＆Ｍ５）
＝（０ｂ００００００００００００１１＆０ｂ００００１１１１００１１０１）｜
（０ｂ００００００００００００００＆０ｂ１１１１００００１１００１０）
＝０ｂ００００００００００００００１｜０ｂ００００００００００００００
＝０ｂ００００００００００００００１
【０２２７】
このように、「金（Ｔ1[1]）」および「全（Ｔ2[1]）」が入力されると、レジスタＲの第１ビットが「１」に更新される。すなわち、図２２に示す対応関係によれば、状態１が活性化される。
【０２２８】
次に、状態１が活性状態であるときに、「額（Ｔ1[2]）」および「顎（Ｔ2[2]）」が入力される。そうすると、ステップ３５０３において、Ｒ＝０ｂ０００００００００００００１に対して上述したビット操作が行われ、レジスタＲは「０ｂ０００００００００１０１００」に更新される。また、ステップ３５０４において、レジスタＲと「３」との論理和を計算することにより、Ｒ＝０ｂ０００００００００１０１１１が得られる。
【０２２９】
続いて、「額」に対してステップ３５０６の演算が実行される。この場合、レジスタＲは下記のように更新される。
Ｒ（額）＝０ｂ０００００００００１０１１１＆Ｍ（額）
＝０ｂ０００００００００１０１１１＆０ｂ１１１１００００００１１１０
＝０ｂ０００００００００００１１０
【０２３０】
また、「顎」に対してステップ３５０６の演算が実行される。この場合、レジスタＲは下記のように更新される。
Ｒ（顎）＝０ｂ０００００００００１０１１１＆Ｍ（全、額、１以外）
＝０ｂ０００００００００１０１１１＆０ｂ１１１１００００１１００１０
＝０ｂ０００００００００１００１０
【０２３１】
続いて、ステップ３５０９において、レジスタＲ’、Ｒ”が計算される。
Ｒ’＝Ｒ（額）｜Ｒ（顎）
＝０ｂ０００００００００００１１０｜０ｂ０００００００００１００１０
＝０ｂ０００００００００１０１１０
Ｒ”＝Ｒ（額）＆Ｒ（顎）
０ｂ０００００００００００１１０＆０ｂ０００００００００１００１０
＝０ｂ００００００００００００１０
【０２３２】
さらに、ステップ３５１０において、レジスタＲ’、Ｒ”、マスクＭ４、Ｍ５に基づいて、レジスタＲが更新される。
Ｒ＝（Ｒ’＆Ｍ４）｜（Ｒ”＆Ｍ５）
＝（０ｂ０００００００００１０１１０＆０ｂ００００１１１１００１１０１）｜
（０ｂ００００００００００００１０＆０ｂ１１１１００００１１００１０）
＝０ｂ００００００００００００１００｜０ｂ００００００００００００１０
＝０ｂ００００００００００００１１０
【０２３３】
このように、「額（Ｔ1[2]）」および「顎（Ｔ2[2]）」が入力されると、レジスタＲの第２、３ビットが「１」に更新される。すなわち、図２２に示す対応関係によれば、状態２および状態３が活性化される。なお、状態１は、非活性状態に戻る。
【０２３４】
次に、状態２、３が活性状態であるときに、「ｌ（Ｔ1[3]、アルファベットの小文字のエル）」および「Ｉ（Ｔ2[3]、アルファベットの大文字のアイ）」が入力される。そうすると、ステップ３５０３において、Ｒ＝０ｂ０００００００００００１１０に対して上述したビット操作が行われ、レジスタＲは「０ｂ０００１０００１１０１０００」に更新される。また、ステップ３５０４において、レジスタＲと「３」との論理和を計算することにより、Ｒ＝０ｂ０００１０００１１０１０１１が得られる。
【０２３５】
続いて、「ｌ（エル）」に対してステップ３５０６の演算が実行される。この場合、レジスタＲは下記のように更新される。
Ｒ（ｌ）＝０ｂ０００１０００１１０１０１１＆Ｍ（全、額、１以外）
＝０ｂ０００１０００１１０１０１１＆０ｂ１１１１００００１１００１０
＝０ｂ０００１００００１０００１０
【０２３６】
また、「Ｉ（アイ）」に対してステップ３５０６の演算が実行される。この場合、レジスタＲは下記のように更新される。
Ｒ（Ｉ）＝０ｂ０００１０００１１０１０１１＆Ｍ（全、額、１以外）
＝０ｂ０００１０００１１０１０１１＆０ｂ１１１１００００１１００１０
＝０ｂ０００１００００１０００１０
【０２３７】
続いて、ステップ３５０９において、レジスタＲ’、Ｒ”が計算される。
Ｒ’＝Ｒ（ｌ）｜Ｒ（Ｉ）
＝０ｂ０００１００００１０００１０｜０ｂ０００１００００１０００１０
＝０ｂ０００１００００１０００１０
Ｒ”＝Ｒ（ｌ）＆Ｒ（Ｉ）
＝０ｂ０００１００００１０００１０＆０ｂ０００１００００１０００１０
＝０ｂ０００１００００１０００１０
【０２３８】
さらに、ステップ３５１０において、レジスタＲ’、Ｒ”、マスクＭ４、Ｍ５に基づいて、レジスタＲが更新される。
Ｒ＝（Ｒ’＆Ｍ４）｜（Ｒ”＆Ｍ５）
＝（０ｂ０００１００００１０００１０＆０ｂ００００１１１１００１１０１）｜
（０ｂ０００１００００１０００１０＆０ｂ１１１１００００１１００１０）
＝０ｂ０００００００００００００００｜０００１００００１０００１０
＝０ｂ０００１００００１０００１０
【０２３９】
このように、「ｌ（Ｔ1[3]、アルファベットの小文字のエル）」および「Ｉ（Ｔ2[3]、アルファベットの大文字のアイ）」が入力されると、レジスタＲの第２、６、１１ビットが「１」に更新される。すなわち、図２２に示す対応関係によれば、状態２、状態６、状態８が活性化される。ここで、レジスタＲの第１１ビット（すなわち、状態８）は、受理ビットである。したがって、検索部２９０３は、状態８が活性化されたときに、ステップ３５１４において、検索文字列「全額１」に対して検出された文字列を出力する。
【０２４０】
以上説明したように、第３の検索装置は、検索対象文書の各文字について複数の認識結果候補が用意されている構成を前提とし、これらの複数の候補についての論理和検索を行う。このため、検索文字の再現率についての閾値レベルを下げなくても、検索文字列に対応する文字列を検出することが可能であり、検索結果に含まれる雑音を小さくできる。
【０２４１】
また、第３の検索装置においては、検索文字列の中の一部の文字が検索対象文書から検出されない場合であっても、オートマトンの状態遷移は初期状態に戻ることなく継続されるので、検索文字の再現率を利用して検索文字列に対応する文字列が検出される。したがって、検索対象文書がＯＣＲ等により生成されている場合のように、検索対象文書が不正確な文字を多く含んでいる場合においても、検索文字列に対応する文字列を検索することができる。
【０２４２】
さらに、第３の検索装置は、ビットパラレル方式で検索を行うので、ＣＵＰの特性を最大限に利用することができ、高速検索が可能になる。すなわち、検索対象文書の各文字について用意されている複数の認識結果候補を利用して検索雑音を抑えながら、検索の高速化を図ることができる。
【０２４３】
図１、図２８、図２９に示す検索装置は、たとえば、図３７に示すような情報処理装置（コンピュータ）を用いて実現することが可能である。ただし、図３７の構成では、スキャナ１０１は省略されている。
【０２４４】
図３７の情報処理装置は、Central Processing Unit （ＣＰＵ）３７０１、メモリ３７０２、入力装置３７０３、出力装置３７０４、外部記憶装置３７０５、媒体駆動装置３７０６、及びネットワーク接続装置３７０７を備える。これらはバス３７０８により互いに接続されている。
【０２４５】
メモリ３７０２は、例えば、Read Only Memory（ＲＯＭ）、Random Access Memory（ＲＡＭ）等を含み、検索装置の処理に用いられるプログラム（検索プログラム）及びデータを格納する。メモリ３７０２は、文字格納部１０４、検索文字列格納部１０９、閾値格納部１１０、検索結果格納部１１２、及びレジスタＲとしても使用される。例えば、ＣＰＵ３７０１は、メモリ３７０２を利用してプログラムを実行することにより、派生文字列生成処理、検索処理、検証処理等を行う。
【０２４６】
入力装置３７０３は、例えば、キーボード、ポインティングデバイス等であり、オペレータからの指示や情報の入力に用いられる。出力装置３７０４は、例えば、ディスプレイ、プリンタ、スピーカ等であり、オペレータへの問い合わせや処理結果の出力に用いられる。入力装置３７０３は、入力部１０８及び編集部２８０２としても使用され、出力装置３７０４は、出力部１１３及び２８０１としても使用される。
【０２４７】
外部記憶装置３７０５は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。情報処理装置は、この外部記憶装置３７０５にプログラム及びデータを格納しておき、それらをメモリ３７０２にロードして使用することができる。外部記憶装置３７０５は、文書格納部１０３としても使用される。
【０２４８】
媒体駆動装置３７０６は、可搬記録媒体３７０９を駆動し、その記録内容にアクセスする。可搬記録媒体３７０９は、メモリカード、フレキシブルディスク、光ディスク、光磁気ディスク等のコンピュータ読み取り可能な記録媒体である。オペレータは、この可搬記録媒体３７０９にプログラム及びデータを格納しておき、それらをメモリ３７０２にロードして使用することができる。
【０２４９】
ネットワーク接続装置３７０７は、通信ネットワークに接続され、通信に伴うデータ変換を行う。情報処理装置は、プログラム及びデータを外部装置からネットワーク接続装置３７０７を介して受け取り、それらをメモリ３７０２にロードして使用することができる。
【０２５０】
図３８は、図３７の情報処理装置にプログラム及びデータを提供する方法を示している。可搬記録媒体３７０９や外部装置３８０１のデータベース３８１１に格納されたプログラム及びデータは、情報処理装置３８０２のメモリ３７０２にロードされる。外部装置３８０１は、そのプログラム及びデータを搬送する搬送信号を生成し、通信ネットワーク上の伝送媒体を介して情報処理装置３８０２に送信する。ＣＰＵ３７０１は、そのデータを用いてそのプログラムを実行し、上述した処理を行う。
【０２５１】
開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができるであろう。
【０２５２】
以上、図１から図３８までを参照しながら説明した実施形態に関し、さらに以下の付記を開示する。
（付記１）
第１の文字と該第１の文字に対応する第２の文字を格納する文字格納手段を参照して、検索文字列に含まれる該第１の文字を該第２の文字に置き換えた派生文字列を生成する生成ステップと、
文書格納手段に格納された検索対象文書から、前記検索文字列及び前記派生文字列を検索する検索ステップと、
前記検索文字列及び前記派生文字列の検索結果を出力する出力ステップと
をコンピュータに実行させることを特徴とする検索プログラム。
（付記２）
前記検索ステップは、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字に一致するとき、状態変数格納部に格納された状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索プログラムは、該検索文字列又は該派生文字列の末尾の文字に対応する第２の状態変数が活性化されたとき、該末尾の文字を含む入力文字列が該検索文字列又は該派生文字列のいずれであるかを検証する検証ステップを前記コンピュータにさらに実行させることを特徴とする付記１記載の検索プログラム。
（付記３）
前記検索ステップは、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字のいずれにも一致しないとき、前記状態変数列中の別の文字に対応する第３の状態変数を活性化する処理をさらに繰り返し、前記検証ステップは、前記第２の状態変数が活性化されたとき、前記末尾の文字を含む入力文字列が該検索文字列又は該派生文字列のいずれかと一致する文字数の割合を求め、得られた文字数の割合が閾値より大きければ、該検索文字列又は該派生文字列が検出されたと判断することを特徴とする付記２記載の検索プログラム。
（付記４）
前記検証ステップは、前記第２の状態変数が活性化された状態が表す文字列から、前記末尾の文字を含む入力文字列中の１つ以上の一致文字に対応する１つ以上の文字位置を特定し、該入力文字列中の該１つ以上の文字位置の文字と、前記検索文字列又は前記派生文字列中の該１つ以上の文字位置の文字を比較して、前記文字数の割合を求めることを特徴とする付記３記載の検索プログラム。
（付記５）
前記出力ステップは、前記検索対象文書から前記検索文字列が検出されたとき、該検索文字列を前記検索結果として出力し、前記検索対象文書から前記派生文字列が検出されたとき、該派生文字列を前記検索文字列に変換し、得られた検索文字列を前記検索結果として出力することを特徴とする付記１乃至４のいずれかに記載の検索プログラム。
（付記６）
各文字について複数の候補文字が用意されている検索対象文書から検索文字列を検索する処理において、前記検索対象文書から入力される文字に対応する複数の候補文字のいずれか１つが前記検索文字列に含まれる文字に一致するときに、状態変数格納部に格納されている状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索対象文書から入力される文字に対応する複数の候補文字がいずれも前記検索文字列に含まれる文字に一致しないときに、前記状態変数列中の別の文字に対応する第２の状態変数を活性化する処理を繰り返す、ことにより前記検索文字列を検索する検索ステップ、
前記状態変数列中の前記検索文字列の末尾の文字に対応する第３の状態変数が活性化されたときに、前記検索文字列の検索結果を出力する出力ステップ、
をコンピュータに実行させる検索プログラム。
（付記７）
コンピュータが、第１の文字と該第１の文字に対応する第２の文字を格納する文字格納手段を参照して、検索文字列に含まれる該第１の文字を該第２の文字に置き換えた派生文字列を生成する生成ステップと、
前記コンピュータが、文書格納手段に格納された検索対象文書から、前記検索文字列及び前記派生文字列を検索する検索ステップと、
前記コンピュータが、前記検索文字列及び前記派生文字列の検索結果を出力する出力ステップと
を備えることを特徴とする検索方法。
（付記８）
前記検索ステップは、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字に一致するとき、状態変数格納部に格納された状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索方法は、前記コンピュータが、該検索文字列又は該派生文字列の末尾の文字に対応する第２の状態変数が活性化されたとき、該末尾の文字を含む入力文字列が該検索文字列又は該派生文字列のいずれであるかを検証する検証ステップをさらに備えることを特徴とする付記７記載の検索方法。
（付記９）
前記検索ステップは、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字のいずれにも一致しないとき、前記状態変数列中の別の文字に対応する第３の状態変数を活性化する処理をさらに繰り返し、前記検証ステップは、前記第２の状態変数が活性化されたとき、前記末尾の文字を含む入力文字列が該検索文字列又は該派生文字列のいずれかと一致する文字数の割合を求め、得られた文字数の割合が閾値より大きければ、該検索文字列又は該派生文字列が検出されたと判断することを特徴とする付記８記載の検索方法。
（付記１０）
前記検証ステップは、前記第２の状態変数が活性化された状態が表す文字列から、前記末尾の文字を含む入力文字列中の１つ以上の一致文字に対応する１つ以上の文字位置を特定し、該入力文字列中の該１つ以上の文字位置の文字と、前記検索文字列又は前記派生文字列中の該１つ以上の文字位置の文字を比較して、前記文字数の割合を求めることを特徴とする付記９記載の検索方法。
（付記１１）
前記出力ステップは、前記検索対象文書から前記検索文字列が検出されたとき、該検索文字列を前記検索結果として出力し、前記検索対象文書から前記派生文字列が検出されたとき、該派生文字列を前記検索文字列に変換し、得られた検索文字列を前記検索結果として出力することを特徴とする付記７乃至１０のいずれかに記載の検索方法。
（付記１２）
コンピュータが、各文字について複数の候補文字が用意されている検索対象文書から検索文字列を検索する処理において、前記検索対象文書から入力される文字に対応する複数の候補文字のいずれか１つが前記検索文字列に含まれる文字に一致するときに、状態変数格納部に格納されている状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索対象文書から入力される文字に対応する複数の候補文字がいずれも前記検索文字列に含まれる文字に一致しないときに、前記状態変数列中の別の文字に対応する第２の状態変数を活性化する処理を繰り返す、ことにより前記検索文字列を検索し、
前記コンピュータが、前記状態変数列中の前記検索文字列の末尾の文字に対応する第３の状態変数が活性化されたときに、前記検索文字列の検索結果を出力する、
ことを特徴とする検索方法。
（付記１３）
第１の文字と該第１の文字に対応する第２の文字を格納する文字格納手段を参照して、検索文字列に含まれる前記第１の文字を前記第２の文字に置き換えた派生文字列を生成する生成部と、
文書格納手段に格納された検索対象文書から、前記検索文字列及び前記派生文字列を検索する検索部と、
前記検索文字列及び前記派生文字列の検索結果を出力する出力部、
を有する検索装置。
（付記１４）
前記検索部は、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字に一致するとき、状態変数格納部に格納された状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、
前記検索装置は、前記検索文字列又は前記派生文字列の末尾の文字に対応する第２の状態変数が活性化されたとき、前記末尾の文字を含む入力文字列が前記検索文字列又は前記派生文字列のいずれであるかを検証する検証部をさらに備える
ことを特徴とする付記１３に記載の検索装置。
（付記１５）
前記検索部は、前記検索対象文書から入力される文字が前記検索文字列又は前記派生文字列に含まれる文字のいずれにも一致しないとき、前記状態変数列中の別の文字に対応する第３の状態変数を活性化する処理をさらに繰り返し、
前記検証部は、前記第２の状態変数が活性化されたとき、前記末尾の文字を含む入力文字列が前記検索文字列又は前記派生文字列のいずれかと一致する文字数の割合を求め、得られた文字数の割合が閾値より大きければ、前記検索文字列又は前記派生文字列が検出されたと判断する
ことを特徴とする付記１４に記載の検索装置。
（付記１６）
前記検証部は、前記第２の状態変数が活性化された状態が表す文字列から、前記末尾の文字を含む入力文字列中の１つ以上の一致文字に対応する１つ以上の文字位置を特定し、前記入力文字列中の前記１つ以上の文字位置の文字と、前記検索文字列又は前記派生文字列中の前記１つ以上の文字位置の文字を比較して、前記文字数の割合を求める
ことを特徴とする付記１５に記載の検索装置。
（付記１７）
前記出力部は、前記検索対象文書から前記検索文字列が検出されたとき、前記検索文字列を前記検索結果として出力し、前記検索対象文書から前記派生文字列が検出されたとき、前記派生文字列を前記検索文字列に変換し、得られた検索文字列を前記検索結果として出力する
ことを特徴とする付記１３乃至１６のいずれかに記載の検索装置。
（付記１８）
各文字について複数の候補文字が用意されている検索対象文書から検索文字列を検索する処理において、前記検索対象文書から入力される文字に対応する複数の候補文字のいずれか１つが前記検索文字列に含まれる文字に一致するときに、状態変数格納部に格納されている状態変数列中の一致した文字に対応する第１の状態変数を活性化する処理を繰り返し、前記検索対象文書から入力される文字に対応する複数の候補文字がいずれも前記検索文字列に含まれる文字に一致しないときに、前記状態変数列中の別の文字に対応する第２の状態変数を活性化する処理を繰り返す、ことにより前記検索文字列を検索する検索部と、
前記状態変数列中の前記検索文字列の末尾の文字に対応する第３の状態変数が活性化されたときに、前記検索文字列の検索結果を出力する出力部、
を有する検索装置。
【符号の説明】
【０２５３】
１０１  スキャナ
１０２、２９０１  文字認識部
１０３、２９０２  文書格納部
１０４  文字格納部
１０５  派生文字列生成部
１０６  オートマトン生成部
１０７、２９０３  検索部
１０８  入力部
１０９  検索文字列格納部
１１０  閾値格納部
１１１  検証部
１１２  検索結果格納部
１１３、２８０１  出力部
２０１〜２１４  誤認識文字
２８０２  編集部
３７０１  ＣＰＵ
３７０２  メモリ
３７０３  入力装置
３７０４  出力装置
３７０５  外部記憶装置
３７０６  媒体駆動装置
３７０７  ネットワーク接続装置
３７０８  バス
３７０９  可搬記録媒体
３８０１  外部装置
３８０２  情報処理装置
３８１１  データベース
【図１】
2010225137.tif 000003
【図２】
2010225137.tif 000004
【図３】
2010225137.tif 000005
【図４】
2010225137.tif 000006
【図５】
2010225137.tif 000007
【図６】
2010225137.tif 000008
【図７】
2010225137.tif 000009
【図８】
2010225137.tif 000010
【図９】
2010225137.tif 000011
【図１０】
2010225137.tif 000012
【図１１】
2010225137.tif 000013
【図１２】
2010225137.tif 000014
【図１３】
2010225137.tif 000015
【図１４】
2010225137.tif 000016
【図１５】
2010225137.tif 000017
【図１６】
2010225137.tif 000018
【図１７】
2010225137.tif 000019
【図１８】
2010225137.tif 000020
【図１９】
2010225137.tif 000021
【図２０】
2010225137.tif 000022
【図２１】
2010225137.tif 000023
【図２２】
2010225137.tif 000024
【図２３】
2010225137.tif 000025
【図２４】
2010225137.tif 000026
【図２５】
2010225137.tif 000027
【図２６】
2010225137.tif 000028
【図２７】
2010225137.tif 000029
【図２８】
2010225137.tif 000030
【図２９】
2010225137.tif 000031
【図３０】
2010225137.tif 000032
【図３１】
2010225137.tif 000033
【図３２】
2010225137.tif 000034
【図３３】
2010225137.tif 000035
【図３４】
2010225137.tif 000036
【図３５】
2010225137.tif 000037
【図３６】
2010225137.tif 000038
【図３７】
2010225137.tif 000039
【図３８】
2010225137.tif 000040