(57)【要約】  コンピュータ化された方法および装置は、テキストのような記号情報を圧縮する。記号情報は、記号対（例えば、単語対または文字対）を再帰的に識別し、各記号対をそれぞれの置換記号で置き換えることによって圧縮される。各記号対がテキスト文書内に現れる回数が数えられ、出現回数が回数の閾値を超えた記号対のみが置き換えられる。再帰的パスにおいて、各置換記号は、以前に置換された置換記号を含むものであってもよい。この方法および装置によって、特に大きなデータセットに関して、高い圧縮率を達成することができる。文書の圧縮中に生成されるメタデータ（例えば、各記号対の出現回数）は、文書を分析し、２つの文書の類似性を見つけるために使用することができる。
2020521408.tif 000002
【特許請求の範囲】
【請求項１】
複数の文書に編成された記号情報を圧縮するコンピュータ化された方法であって、各文書は複数の記号を有しており、前記複数の文書のうちの最初の文書を入力文書として、コンピュータが自動的に、
（ａ）複数の記号対を識別することを含み、それぞれの前記記号対は２つの一連の記号からなり、さらに、
（ｂ）前記複数の記号対のうちの新出の記号対のそれぞれについて、該新出の記号対の出現数を特定する回数を更新すること、および、
（ｃ）前記新出の記号対の回数が閾値を超える場合、圧縮辞書により前記複数の記号対のうちの１つと一致する前記新出の記号対と関連付けられた置換記号を、圧縮文書の、前記入力文書からの前記複数の記号対のうちの１つに関連付けられた位置のそれぞれに、含めさせることによって、該圧縮文書を生成すること、
を、含んでいる方法。
【請求項２】
前記閾値は、２であることを特徴とする請求項１に記載の方法。
【請求項３】
前記圧縮辞書を、それぞれの前記新出の記号対の回数の順序に並べ替えることをさらに含む、ことを特徴とする請求項１に記載の方法。
【請求項４】
前記圧縮辞書から、前記閾値を超えない回数を有する全ての前記新出の記号対を除去し、前記圧縮辞書内に、前記閾値を超える回数を有する前記新出の記号対のそれぞれと置換記号との関連付けを作成することをさらに含む、ことを特徴とする請求項３に記載の方法。
【請求項５】
前記圧縮文書を前記入力文書として使用して（ａ）、（ｂ）および（ｃ）の部分を繰り返すことによって、追加のパスを実行することをさらに含む、ことを特徴とする請求項１に記載の方法。
【請求項６】
複数のパスのうちの１つにより作成された前記圧縮文書が、直前のパスによって作成された前記圧縮文書から変更されなくなるまで、追加のパスを実行することをさらに含む、ことを特徴とする請求項５に記載の方法。
【請求項７】
前記最初の文書からの記号のそれぞれは、単語を示すことを特徴とする請求項１に記載の方法。
【請求項８】
（ａ）の部分の前に、テキスト文書の各単語を前記複数の記号のうちの対応する１つに置き換えることによって、前記最初の文書を作成することをさらに含む、ことを特徴とする請求項７に記載の方法。
【請求項９】
前記最初の文書からの記号のそれぞれは、英数字を示すことを特徴とする請求項１に記載の方法。
【請求項１０】
前記置換記号のそれぞれは、前記圧縮辞書内の、前記置換記号に関連付けられた前記新出の記号対を保存する項目のアドレスを含む、ことを特徴とする請求項１に記載の方法。
【請求項１１】
前記複数の文書のうちの他の文書のそれぞれに対して、(ａ)、(ｂ)、および（ｃ）の部分を実行することをさらに含み、前記記号対のそれぞれの回数は、前記複数の文書のうちのいずれにも前記記号対が以前に出現した数に等しい、ことを特徴とする請求項１に記載の方法。
【請求項１２】
前記複数の文書の文章のそれぞれに対して、前記複数の文書のうちのいずれに対しても（ｃ）の部分が実行される前に、(ａ)、(ｂ)の部分が実行される、ことを特徴とする請求項１に記載の方法。
【請求項１３】
前記複数の文書のうちのいずれに対しても（ｃ）の部分が実行される前に、前記新出の記号対が前記閾値を超える回数を有するときおよびそのときに限り、前記圧縮辞書内に前記新出の記号対のそれぞれと前記置換記号との関連付けを作成することをさらに含む、ことを特徴とする請求項１２に記載の方法。
【請求項１４】
前記圧縮辞書を、それぞれの前記新出の記号対の回数の順序に並べ替えることをさらに含む、ことを特徴とする請求項１１に記載の方法。
【請求項１５】
前記圧縮辞書から、前記閾値を超えない回数を有する全ての前記新出の記号対を除去し、前記圧縮辞書内に、前記閾値を超える回数を有する前記新出の記号対のそれぞれと置換記号との関連付けを作成することをさらに含む、ことを特徴とする請求項１１に記載の方法。
【請求項１６】
処理によって以前に生成された前記圧縮文書を前記入力文書として使用して、複数のパスのうちの１つにより作成された前記圧縮文書が、直前のパスによって作成された前記圧縮文書から変更されなくなるまで、（ａ）、（ｂ）および（ｃ）の部分を繰り返すことによって少なくとも１つの追加のパスを作成するために、前記他の文書のそれぞれに対して（ａ）、（ｂ）および（ｃ）の部分を繰り返すことをさらに含む、ことを特徴とする請求項１１に記載の方法。
【請求項１７】
前記最初の文書に関連付けられた出力文書に現れる、新出の記号対に関連付けられた置換記号の頻度に基づいて、前記最初の文書に複数の属性のうちの少なくとも１つを割り当てることをさらに含む、ことを特徴とする請求項１６に記載の方法。
【請求項１８】
前記最初の文書の少なくとも１つの属性および関連する文書の少なくとも１つの属性に基づいて、前記関連する文書を提案することを更に含む、ことを特徴とする請求項１７に記載の方法。
【請求項１９】
複数の文書に編成された記号情報を圧縮できる少なくとも１つのプロセッサを有するコンピュータシステムであって、各文書は複数の記号を有しており、前記コンピュータシステムは、前記複数の文書のうちの最初の文書を入力文書として、
（ａ）複数の記号対を識別するようにプログラムされ、それぞれの前記記号対は２つの一連の記号からなり、さらに、
（ｂ）それぞれの新出の記号対について、該新出の記号対の出現数を特定する回数を更新する、および、
（ｃ）前記新出の記号対の回数が閾値を超える場合、圧縮辞書により前記複数の記号対のうちの１つと一致する前記新出の記号対と関連付けられた置換記号を、圧縮文書の、前記入力文書からの前記複数の記号対のうちの１つに関連付けられた位置のそれぞれに、含めさせることによって、該圧縮文書を生成する、ようにプログラムされている、コンピュータシステム。
【請求項２０】
複数の文書に編成された記号情報を圧縮するためのコンピュータ命令のセットを保存する、一時的な伝搬信号ではないコンピュータ可読記憶媒体であって、各文書は複数の記号を有しており、前記コンピュータ命令のセットは、コンピュータで実行されたとき、該コンピュータに対して、前記複数の文書のうちの最初の文書を入力文書として、自動的に、
（ａ）複数の記号対を識別することを実行させ、それぞれの前記記号対は２つの一連の記号からなり、さらに、
（ｂ）それぞれの新出の記号対について、該新出の記号対の出現数を特定する回数を更新すること、および、
（ｃ）前記新出の記号対の回数が閾値を超える場合、圧縮辞書により前記複数の記号対のうちの１つと一致する前記新出の記号対と関連付けられた置換記号を、圧縮文書の、前記入力文書からの前記複数の記号対のうちの１つに関連付けられた位置のそれぞれに、含めさせることによって、該圧縮文書を生成することを実行させる、コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の分野は、データの圧縮および分析に関する。特に、本発明は、記号で表すことが可能なテキストおよび他の情報の可逆圧縮に関する。
【背景技術】
【０００２】
従来のテキスト圧縮技術は、一度に１つのファイルまたは文書でのみ使用可能なものである。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
このような技術は、膨大なデータセット、すなわち「ビッグデータ」に対して、またはデータが多くの異なるコンテナに分散している場合に対して、簡単に拡張できない。また、従来の技術は、非圧縮テキストに中に特定の記号または記号列が出現する回数を追跡しない。特定の記号または記号列が出現する回数は、記憶空間の節約の改善、処理時間の短縮、およびコンテキスト分析の実施に役立つ貴重な情報である。
【課題を解決するための手段】
【０００４】
例示的な一実施形態は、複数の文書に編成される記号情報を圧縮する。非圧縮文書のそれぞれは、複数の記号を有する。文書は、任意の長さの記号列であり得る（例えば、文、段落、またはテキストファイル）。記号は、情報を構成するまたは保持する任意の符号であり得る（例えば、文字、数字、非英数字、音節、または単語）。
【０００５】
例示的な一実施形態は、文書内の２つの隣接する記号を１つの記号対として識別することにより、入力文書上で動作する。この例示的な一実施形態は、他例のない（新出の）記号対のそれぞれを圧縮辞書に保存する。圧縮辞書は、保存された各記号対をそれぞれ置換記号に関連付ける。この例示的な一実施形態は、それぞれの新出の記号対が入力文書に出現した回数も保持する。この例示的な一実施形態は、記号対の回数が閾値を超える場合、その記号対を関連する置換記号で置き換えることにより、圧縮された出力文書を生成する。
【０００６】
幾つかの実施形態は、出力文書を追加のパスに対する入力文書として使用することによって圧縮処理を繰り返すようにプログラムされている。幾つかの特定の実施形態は、さらなる置換を行うことができなくなるまで、再帰的に追加のパスを実行する（すなわち、最終パスにおいて、出力文書は入力文書と同一である）。再帰的なパスにおいて識別される記号対には、前のパスからの置換記号を含めることができる。
【０００７】
幾つかの実施形態は、複数の文書に適用されるようにプログラムされている。実際、非圧縮データのサイズが大きくなるほど、圧縮率は向上する。データセットが大きいほど、特定の記号対に関連付けられた回数が閾値を超える可能性が高くなり、その結果、置換が多くなり、圧縮率が高くなる。これらの実施形態の幾つかでは、さらなる置換が不可能になるまで全ての文書で処理が繰り返される場合に、圧縮が最適化される。
【０００８】
幾つかの実施形態は、圧縮辞書内の置換された記号対のアドレスを置換記号として使用することにより、記憶空間の節約を向上させ、また、圧縮辞書にアクセスするために必要な検索時間を短縮する。
【０００９】
幾つかの実施形態は、記号対が出現した回数に基づいて圧縮辞書の項目を並べ替える。この並べ替えは、頻繁に出現する記号対を、出現頻度が低い記号対よりもアクセスしやすいメモリ位置に配置するために行われる。この並べ替えにより、置換段階中の検索時間が短縮される。
【００１０】
幾つかの実施形態は、コンテンツを分析するために、置換記号のパターンと特定の記号対の出現回数を使用する。
【００１１】
データの圧縮および分析のコンピュータ化された方法の目的および利点は、図面に示され、以下の詳細な説明に記載された例示的な実施形態、または添付請求項を参照することにより明らかになるであろう。
【００１２】
この概要は、以下の詳細な説明でさらに説明される概念の抜粋を簡略化された形式で紹介するために提供されたものである。この概要は、請求項に記載された対象の主要な特徴または本質的な特徴を特定することを意図するものではなく、請求項に記載された対象の範囲を決定する際の補助として使用されること意図するものでもない。
【図面の簡単な説明】
【００１３】
【図１】図１は、一実施形態によって適用されるテキストの標準化処理を視覚的に表現する図である。
【図２】図２は、図１の実施形態で使用される圧縮辞書を視覚的に表現する図である。
【図３】図３は、図２の実施形態の動作を視覚的に表現する図である。
【図４】図４は、図２の実施形態の動作を示すフローチャートである。
【図５】図５は、実験的な実施形態によって達成された結果を示すグラフである。
【発明を実施するための形態】
【００１４】
図示された実施形態は、模式的に示されている。図示された実施形態は例にすぎず、本開示または添付請求項の範囲を限定するものとして解釈されるべきではない。
【００１５】
データの圧縮および分析の技術の実施形態は、コンピュータ命令のセットとしてコンピュータコードでプログラムすることができる。このコンピュータ命令は、コンピュータで実行されるとき、コンピュータのプロセッサを制御し、本明細書で説明される機能を実行させるものである。コンピュータ命令（たとえば、コンピュータソフトウェア）は、コンピュータにアクセス可能な任意のコンピュータメモリに保存するか、またはコンピュータハードウェアにエンコードすることができる。幾つかの実施形態は、特定用途向けコンピュータまたは専用コンピュータ機器として例示される。実施形態が動作対象とする文書は、コンピュータシステムにアクセス可能な同じまたは異なるコンピュータメモリに保存することができる。
【００１６】
例示的な一実施形態は、非圧縮テキストを分析して、一対の隣接する記号を識別する。この例示的な一実施形態は、所定の回数よりも多く現れる一対の記号の出現を、関連する置換記号で置き換える。記号は、英数字、複数の英数字の個別の複数のグループ（例えば、複数の音節または複数の単語）、または、情報を構成および保持する任意の符号であってもよい。
【００１７】
幾つかの実施形態において、非圧縮テキスト中の元の記号は、予備段階で標準記号に置き換えられる。図１は、例示的な一実施形態が、非圧縮テキストを標準化する方法を示している。特定の状況（例えば、元の記号の長さに大きなばらつきがある場合）では、標準化により後続の動作中の性能が向上する。
【００１８】
図１の例示的な一実施形態は、新出の元の記号の全ての出現を識別してその回数を数え、それぞれの新出の元の記号を保存する。それぞれの元の記号は、標準記号と関連付けられて標準化メモリに保存される。図１において、標準化メモリ１４０は、元の記号（列１６０）を、そのそれぞれの標準記号（列１５０）およびそれぞれの元の記号が非圧縮テキスト中に現れる回数（列１７０）と関連付ける。
【００１９】
幾つかの実施形態は、新出の元の記号を識別するために、特定の非英数字（例えば、スペース）を２つの記号の間の区切りを示すものとして解釈するようにプログラムされている。例示的な一実施形態は、スペースを記号間の区切りとして解釈するが、標準化された文書内にスペースを保持している。例えば、文書１１１は、標準記号を区切るスペースを伴って示されている。但し、他の実施形態は、スペースおよび他の特定の非英数字を完全に削除する。これは、そのような文字の位置は、復元するまたは文脈から判別することができるためである。例えば、記号間のスペースは、元の記号を識別するために使用されるアルゴリズムのルールに基づいて推定および再現することができる。同様に、特定の非英数字の存在は、テキストが書かれた言語の文法規則に基づいて推定することができる。
【００２０】
幾つかの実施形態は、特定の非英数字を記号の一部として解釈する。図１の例示的な一実施形態は、テキスト１０５を、それがアポストロフィを含んでいても、記号として識別するものである。他の実施形態は、非英数字を、それ自体で記号として識別する。
【００２１】
幾つかの実施形態は、記号の処理中に大文字を無視する。このような実施形態は、全ての元の記号の、大文字・小文字に関して均一なバージョン（例えば、小文字バージョン）のみを保存することにより記憶空間を節約する。このような実施形態は、文章構造および固有名詞に関する文法的および文脈的な規則を使用して、元のテキストを復元する（大文字の復元を含む）ことができる。
【００２２】
幾つかの実施形態は、選択された記号を文書の終了を知らせるものとして解釈する。図１の例示的な一実施形態は、１０７におけるピリオドを文書１０１と文書１０２との間の区切り記号として識別している。別の実施形態は、キャリッジリターン、段落、セル、フィールド、レコード、行、列、ページ、見出し、マークアップ言語のタグ、目次の情報、または、セクション（節）またはチャプタ（章）のマークに基づいて、テキストを複数の文書に分離する。人間が理解できる、またはコンピュータが読み取り可能な任意のマーカーまたはコンテナを使用して、テキストを複数の文書に分割することができる。他の実施形態は、個別のコンピュータファイルである文書に対して動作する。
【００２３】
例示的な一実施形態は、複数の文書に対して同時に動作する。したがって、この例示的な一実施形態は、標準化処理中に、文書中の元の記号のいずれかを置換する前に、全ての文書中の新出の非圧縮記号の全ての出現を識別し、その回数を数える。
【００２４】
例示的な一実施形態は、文書１０１の元の記号を、標準化メモリ１４０に保存された標準記号で置き換えて、標準化された文書１１１を生成する。標準化メモリ１４０は、入力文書の標準化中に作成されるものであってもよく、または、予め存在するものであってもよい。図１には、行列形式の標準化メモリ１４０が示されているが、他のデータ記憶構造を使用することもできる。
【００２５】
例示的な一実施形態は、列１７０に保存された回数に従って、標準化メモリ１４０の項目を並べ替える。例示的な一実施形態は、標準記号が割り当てられて列１５０に保存される前に項目を並べ替える。例示的な一実施形態は、標準化メモリ１４０を並べ替えることにより、最も頻繁に現れる記号に対して比較的短い標準記号を割り当てることができるため、記憶空間の節約が改善される。並べ替えにより、頻繁に使用される標準記号をアクセスしやすいメモリ位置に保存することもできるため、検索時間が短縮される。幾つかの実施形態は、並べ替えの後、回数を削除して記憶空間を節約するものであってもよい。
【００２６】
図１は、標準化メモリ１４０の列１７０に保存された回数を示している。別の実施形態は、標準化中に生成された回数を、標準化メモリとは別に保存する。
【００２７】
標準記号は、標準化メモリ１４０内の元の記号の位置を示すアドレスであってもよい。任意の記号ではなくアドレスを使用すると、外部からの記号を保存する必要がないため、必要な記憶空間が削減される。標準記号としてアドレスを使用すると、標準記号と置換記号との間の変換に必要な複数の検索を実行するのではなく、一度のメモリ検索を実行するだけで済むため、置換および解凍の処理時間も改善される。テキストを元の形式に復元するとき、それぞれの標準記号は、例示的な一実施形態に対して元の記号の正確なメモリ位置を指定する。
【００２８】
アドレスを標準記号として使用することは、並べ替え後に適用されると、検索時間がさらに向上する。これは、出現頻度の高い記号の方が、出現頻度の低い記号よりもアクセスしやすいメモリ位置に保存されることが確実になるためである。
【００２９】
図２には、圧縮辞書２００が示されている。圧縮辞書２００は、例示的な一実施形態によって、新出の記号対とその置換記号との間の関連付けを保存するために使用される。図１の標準化メモリ１４０は、図２の圧縮辞書２００とは別個に保存されるように示されている。別の実施形態は、標準化メモリを圧縮辞書の一部として保存するものであってもよい。
【００３０】
圧縮辞書２００は、行と列に構造化されて示されている。別の実施形態は、リレーショナルデータベース、ドキュメント指向データベース、グラフデータベース、キーバリューストア、オブジェクトデータベース、または階層ツリーなどの他のデータ構造を使用して、圧縮辞書（および、使用される場合は、標準化メモリ）を保持する。幾つかの実施形態は、既存の圧縮辞書を使用する。他の実施形態は、動作中に圧縮辞書を作成する。
【００３１】
図３には、図２の実施形態の動作対象である文書１１１が示されている。例示的な一実施形態は、圧縮が完了するまで（例えば、置換のための閾値を満たす記号対がなくなるまで）、再帰的に繰り返すようにプログラムされる。例示的な一実施形態は、文書１１１上で動作して、出力文書３５１を作成する。数字３２１、３３１、および３４１は、再帰的な実施形態によって実行される処理のパスの前の中間結果を指す。ここでは、参照しやすいようにこれらの中間結果を「文書」と呼ぶが、これらは、次のパス中に削除または上書され得るものである。文書１１２−１１４は、文書１１１と同じバッチで同様に処理され、それぞれの文書３５２−３５４を生成する。文書３２２−３２４、３３２−３３４、および３４２−３４４は、パスとパスの間の中間結果を表している。
【００３２】
例示的な一実施形態は、文書を通過させるそれぞれのパス中で、それぞれの新出の記号対の出現を識別し、その回数を数えて（「カタログ化段階」）、回数が置換閾値を超えるのにともない、記号対を置換する（「置換段階」）。例示的な一実施形態は、置換段階に移る前に、全ての文書に対してカタログ化段階を実行する。
【００３３】
別の実施形態は、各文書のテキストを順番に処理することにより、１つの動作で記号対を識別および置換する。このような実施形態では、文書を通過させることは、一連の記号対のそれぞれを圧縮辞書の項目と比較することを含んでいる。比較の結果が一致した場合、比較された記号対の回数が増加され、置換閾値に達すると、その記号対が置換記号に置き換えられる。比較の結果が一致しない場合、その記号対は、新出であると識別されて圧縮辞書に追加される。このような実施形態は、記号対の回数が置換閾値を超えるまで置換記号を使用しないため、記号対の回数が置換閾値を超えると、その記号対の以前の事例（インタンス）の置換を予定する。
【００３４】
例示的な一実施形態は、１つのパスの識別またはカタログ化段階において、文書内の最後の記号に到達するまで、文書内の各記号を隣接する次の記号とペアリングすることにより、入力文書内の記号対を識別する。したがって、入力文書内の最初と最後の記号を除く全ての記号は、２つの記号対に含まれることになる。すなわち、１つの記号対は、記号を前の記号とペアリングして形成され、１つの記号対は、記号を次の記号とペアリングして形成される。
【００３５】
例示的な一実施形態は、例えば文書１１１を処理するとき、記号３１１と記号３１２を第１の記号対として認識し、記号３１２と記号３１３を第２の記号対として認識する。例示的な一実施形態は、記号３１８と記号３１９をペアリングするまで記号のペアリングを継続する。最初の記号（記号３１１）と最後の記号（記号３１９）は、それぞれ１つの他の記号（つまり、それぞれ記号３１２および記号３１８）とのみ対になっている。文書内の他の全ての記号は、２つの記号対に含まれている。
【００３６】
別の実施形態は、隣接する文字のあらゆる可能な記号対を比較するわけではない。むしろ、このような実施形態は、以前に比較された記号対の記号を有する記号対を省略する。例えば、このような実施形態は、文書１１１上で動作する場合、記号３１１と記号３１２の記号対を認識し、記号３１２と記号３１３によって形成される記号対を省略し、記号対３１３と記号３１４の記号対を次の記号対として認識する。
【００３７】
例示的な一実施形態は、文書１１１−１１４内の記号について全ての記号対が作成されると、それぞれの新出の記号対が文書内に出現した回数を数える。例示的な一実施形態は、全ての記号対を配列（array）に挿入し、配列上で「ピボットテーブル」操作を実行してそれぞれの新出の記号対の出現回数を識別および数えることにより、新出の記号対を識別し、その回数を数える。
【００３８】
例示的な一実施形態は、各パスにおいて、圧縮辞書にパス関連セクションを生成する。例えば、図２を参照すると、圧縮辞書２００の列２１０および列２１１は、最初のパスのカタログ段階の結果である。列２１０には、最初のパスのカタログ化段階で処理されたテキストからのそれぞれの新出の記号対が保存されている。列２１１には、各記号対に関連付けられた回数が保存される。
【００３９】
図２には、圧縮辞書２００にフィールドとして保存されている回数が示されている。記号対に関連付けられた回数は、圧縮辞書の項目としてではなく、記号対の属性またはメタデータとして保存されるものであってもよい。別の実施形態は、各記号対に関連付けられた回数を圧縮辞書とは別に保存する。例示的な一実施形態は、一度だけ現れた記号対の回数を保存しない（圧縮辞書２００の項目２１６を参照）。記号対が存在することは、それが一度だけ現れたことを示すために十分である。
【００４０】
例示的な一実施形態は、記号の標準化に関連して上述した方法と同様の方法で、各記号対の回数に基づいて圧縮辞書２００の項目を並べ替えるようにプログラムされている。言い換えれば、例示的な一実施形態は、文書１１１−１１４の全ての記号対が識別された後、圧縮辞書２００（図２）の項目を並べ替えた後に、置換記号を割り当てるまたは置換を実行して文書３２１（図３）を生成する。例示的な一実施形態は、標準化メモリの並べ替えに関連して上記で説明したのと同様の理由で、圧縮辞書２００を並べ替えることにより記憶空間の節約および性能上の利点を達成するものである。
【００４１】
置換記号は、圧縮辞書中のその置換記号に関連付けられた記号対が保存されているアドレスとすることができる。図２の実施形態では、置換記号は、行識別子（列２０１を参照）と列識別子の組み合わせから形成される。列識別子は、記号対が識別されたパス（図２のＰ１、Ｐ２、Ｐ３）を示している。アドレスに基づく置換記号を使用すると、標準化に関連して説明したものと同様の利点が、同様の理由により得られる。別の実施形態は、記号対のアドレスに関係のない一意的な置換記号を割り当てる。
【００４２】
場合によっては、置換記号は、アドレスの行識別子に関連付けられた部分だけであってもよい。例えば、例示的な一実施形態の最初のパスからの置換記号は、その各記号対のアドレスの行識別子のみである。例示的な一実施形態は、それが文書を解凍するとき、パス識別子のない置換記号を最初のパスからのものとして関連付けるようにプログラムされる。例示的な一実施形態において、最初のパスからの置換記号は、出力文書に挿入され、（一連のパスで別の記号と対にされた場合）、パス識別子なしで圧縮辞書に保存される。
【００４３】
別の実施形態は、同様の方法でさらなる記憶空間の節約を達成する。一実施形態は、最初のパスの後の任意のパスについて、最も頻繁に別の記号と記号対を形成する置換記号のパス識別子を省略することができる。例えば、パスＸにおいて、パス１，・・・，Ｎ，・・・，Ｘ−１のうちのいずれかからの置換記号を別の記号とペアリングすることにより、記号対を形成できる。ここで、パスＸにおいて、パスＮからの置換記号が他の記号と最も頻繁にペアリングされるとする。この場合、一実施形態は、圧縮辞書にパスＮの完全な置換記号を保存するのではなく、パスＮの置換記号からパス識別子を省略し、単にパスＮがパスＸに対する最も頻繁なペアリングであるという指示を保存する。したがって、圧縮辞書のパスＸのパス関連セクションに保存されている記号対にパス識別子のない置換記号が含まれている場合、そのパス識別子はパスＮのものと見なされる。この方法では、パスＮのパス識別子を保存する必要があるのは、パスＸ中に圧縮辞書に保存される全ての項目に対して１回だけであるため、記憶空間が節約される。
【００４４】
図２の例示的な一実施形態は、関連する回数が所定の閾値を超える場合にのみ置換記号を使用する。文書内の圧縮辞書の項目に対応する全ての記号対を置換することは可能である（例えば、閾値を１とする）。但し、閾値を高くすると、性能が向上する。多数の記号対が１回だけまたは数回しか出現しない場合、それらの置換により文書の圧縮は改善せずまたは大幅には改善せず、圧縮辞書の記憶要件が増加することになる。閾値を高くすると、使用頻度の低い記号対を置き換える必要がなくなるため、処理時間が短縮される。
【００４５】
例示的な一実施形態は、圧縮辞書の、閾値を超える回数を有する記号対の項目のみを保持することにより、記憶空間の節約をさらに改善する。例示的な一実施形態は、置換段階を開始する前に全ての文書に対してカタログ化段階を実行するようにプログラムされているため、閾値を超えない記号対は置換されない。したがって、閾値未満の記号対を保存すると、何ら利点はなく圧縮辞書のサイズが増大する。その非効率性を回避するため、例示的な一実施形態は、圧縮辞書の、回数が閾値未満の項目を有する部分を切り捨てる（すなわち、削除する）。例えば、例示的な一実施形態は、最初のパスの閾値が４である場合、図２の部分２６０を保持しないであろう。
【００４６】
別の実施形態は、圧縮辞書の、閾値より小さい回数を有する項目を有する部分を、たとえそれが現在の文書の組で使用されない場合でも、保持する。文書の組に新しい文書が追加された場合、閾値未満の記号対の回数は、置換閾値を満たすレベルまで増加する可能性がある。幾つかの別の実施形態は、圧縮辞書の閾値未満の部分を、圧縮辞書ではなく別個のアーカイブに保存する。新しい文書が追加されたとき、このアーカイブにアクセスすることができる。
【００４７】
様々な実施形態において、置換記号は、記号対が最初に識別されたとき、または、記号対が置換閾値を満たしたときに、記号対に関連付けられるものであってもよい。例示的な一実施形態は、並べ替えおよび切り捨ての両方の後に置換記号を割り当てる。これによって、最も頻繁に使用される置換記号が最も短い長さを有することになり、また、最も頻繁に使用される置換記号を最もアクセスが容易なメモリ位置に配置することができる。置換記号が、それに関連する記号対のアドレスである場合、各置換記号は、並べ替え順での記号対の位置によって、その記号対に関連付けられる。
【００４８】
別の実施形態では、置換段階が始まる前の任意の時点で置換記号を割り当て得る。このような別の実施形態は、回数に基づいて圧縮辞書を並べ替えるか、元の順序で項目を維持することができる。幾つかの実施形態は、並べ替えの後、回数を削除して追加の記憶空間を節約する。
【００４９】
例示的な一実施形態は、パスの置換段階中に、入力文書内の記号対を圧縮辞書２００からの置換記号で置換することにより圧縮出力文書を作成する。別の実施形態は、元の記号の記号対の代わりに元の記号または置換記号を挿入することにより、入力文書とは異なる新しい出力文書を作成する。このような別の実施形態は、後に入力文書を削除する。例示的な一実施形態は、入力文書１１１内の記号対を置換記号で適切な場所に上書きすることにより、出力文書３２１（図３を参照）を作成する。
【００５０】
例示的な一実施形態の圧縮辞書は、閾値を超えない回数を有する項目が保持されなかったため、置換閾値を超える記号対の項目のみを含んでいる。したがって、例示的な一実施形態は、圧縮辞書の項目と一致する最初の記号対を置き換えるようにプログラムされる。文書１１１を処理するとき、例示的な一実施形態は、記号３１１と記号３１２（図３）の記号対を識別し、それを圧縮辞書２００（図２）の項目と比較する。記号３１１と記号３１２の記号対は、圧縮辞書２００に見出される（項目２１２を参照）。一致が見つかったため、記号３１１と記号３１２の記号対は、出力文書３２１において置換記号３２５に置き換えられる。圧縮辞書には、記号３１２と記号３１３の記号対（２１４を参照）も含まれており、回数は置換閾値を超えている（２１５を参照）。しかし、例示的な一実施形態は、既に記号３１２を置換しているため、記号３１２と記号３１３の記号対の置換は考慮されない。
【００５１】
圧縮辞書を切り捨てない実施形態は、置換前に、文書内の記号対を圧縮辞書と比較するとともに、回数を確認する必要もあります。別の実施形態は、複数の可能な置換を分析して、総置換数を最大化するか、または記憶空間の節約を最大化するかを決定する。別の実施形態は、置換対の長さまたは文書を解凍するために必要な検索時間を最小化することに基づいて、どの記号対を置換するかを決定する。さらに別の実施形態は、第１の記号対の置換を試み、置換が不可能な場合、第１の記号対の第２の記号を次の連続する記号と結合することにより、形成され得る記号対を省略する。
【００５２】
例示的な一実施形態は、記号対を置き換えることができない場合、次の記号対を検討することを継続する。例えば、記号３１５と記号３１６の記号対を圧縮辞書の項目と比較し、一致が見つからなかったとする。この場合、例示的な一実施形態は、次の記号対（記号３１６と記号３１７）に進む。入力文書の記号を上書きするのではなく新しい出力文書を作成する実施形態は、置換できない記号対の最初の記号を出力文書に挿入する。記号対の最後の記号が文書の最後の記号であり、その記号対が圧縮辞書の項目のいずれとも一致しない場合、出力文書に記号対の両方の記号を挿入する必要がある。
【００５３】
上述したように、例示的な一実施形態は、さらなる置換が不可能になるまで再帰的なパスを実行するようにプログラムされている。したがって、例示的な一実施形態は、カタログ化段階および置換段階を文書３２１に適用して文書３３１を生成することにより、第２のパスを開始する。図３の記号体系では、文書３３１の記号「Ｒ３Ｐ２」は、第２のパスの行３を指している。２２回目またはそれ以後のパスで識別される記号対は、２つの置換記号であり得る。置換記号３３５を参照すると、この置換記号は、置換記号Ｒ４（３２５を参照）の後に置換記号Ｒ３（文書３２１の最初のパスの３２６を参照）が続く並びを指すものである。あるいは、後のパスで識別される記号対は、置換記号と非圧縮記号の組み合わせであり得る。置換記号３３６を参照すると、この置換記号は、非圧縮記号Ｓ３００の後に置換記号Ｒ３が続く並びを指すものである。したがって、図２の圧縮辞書２００には、列２２０（Ｐ２）の行Ｒ３に、Ｒ４と後続のＲ３の並びの記号対がリストされる。列２１０を検討すると、Ｒ４と後続のＲ３の並びは、今度は、記号Ｓ１、次にＳ７９、次にＳ７５、次にＳ５の並びを表すことが分かる。したがって、この例では、例示的な一実施形態は、第２のパス（Ｐ２）の後、４つの記号の「フレーズ」Ｓ１−Ｓ７９−Ｓ７５−Ｓ５を、単一の記号Ｒ３Ｐ２に置き換えているものである。
【００５４】
例示的な一実施形態による一連のパスの結果、それぞれのパスからの記号対を保存する列２２０および２３０（図２）が追加される。例示的な一実施形態では、新出の記号対が発見される各パスの結果、新たに識別された記号対およびそれらのそれぞれの回数（列２２１および２３１を参照）を保存するために、圧縮辞書２００に追加の列が追加される。図２では、実施形態の再帰的性質の説明のため、後のパスで発見された記号が別々の列に示されている。
【００５５】
例示的な一実施形態は、現在のパス中で作成された圧縮辞書２００の列またはセクションからの置換のみを行う。パス固有のセクションに置換記号を保存することにより、実施形態が現在のパスで使用されない置換記号を有する項目を検索する必要がないため、検索時間が短縮される。
【００５６】
別の実施形態は、異なるパスで識別された記号対を共通の列または記憶領域に保存する。このような実施形態は、複雑性の少ない置換記号を使用するため、記憶空間の節約を向上させることができる。例えば、識別された全ての記号対を圧縮辞書の同じ列に保存する実施形態は、行識別子のみからなる置換記号を使用することができる。いずれの実施形態でも、置換記号の記号体系の選択に細心の注意を払うことで、圧縮率を高めることができる。
【００５７】
図３に示すように、文書３３１に対して実行される第３のパスは、文書３４１を生成し、文書３４１に対して実行される第４のパスは、文書３５１を生成する。第４のパスの出力（文書３５１）は、第３パスの出力（文書３４１）と同一であり、かつ、これが文書１１１と同時に圧縮されている他の全ての文書に当てはまると仮定すると、この例示的な一実施形態は、各文書の最終出力バージョン保存し、圧縮処理を終了する。図３に示した例では、テキストの例に適用された処理の４つのパスのみが示されている。但し、任意の数のパスを実行することができる。幾つかの実施形態では、パスの数は固定数であってもよい。他の実施形態では、パスの最大数を設定することができるが、その処理は、最大数の前にさらなる置換が行われない場合、終了するようにプログラムされる。
【００５８】
文書の組に対してより多くのパスが実行されると、識別された記号対の数と識別された各記号対の回数が減少する傾向があるため、追加の各パスによって提供される増分のサイズ削減が減少する。但し、追加されるパスのそれぞれは、追加の処理資源を消費する。処理資源に対するサイズの削減のバランスを取るために、特定の実施形態は、特定のパスから生じるサイズの削減が特定の制限を下回る場合（例えば、特定のパスで生じるサイズ削減が０．５％未満になる場合）、処理を終了するようにプログラムされる。他の実施形態は、異なる因子（例えば、発見された新しい記号対の数が一定量を下回ること、または最も頻繁に発生する記号対の回数が特定のレベルを下回ること）に基づいて処理を終了する。別の例として、実施形態は、パスで最も頻繁に発生する記号対の回数が、最初のパスで最も頻繁に発生する記号の回数に対する所定の割合を下回る場合、処理を終了するように構築されるものであってもよい。
【００５９】
幾つかの実施形態は、処理を終了するための基準が満たされると、終了条件のトリガーとなったパスで見つかった特定の記号対を置き換えるようにプログラムされる。他の実施形態は、最後のパスで見つかった記号対を置き換えることなく、終了条件を認識するとすぐに処理を終了する。さらなる実施形態は、結果として生じる記憶空間の節約が所定量を下回ると判断するのに十分なテキストを処理した後、不十分な数の記号対が見つかった場合、中間パスを終了する。置換されない記号対は、圧縮辞書に保存したり、置換記号を割り当てたりする必要はない。
【００６０】
圧縮辞書２００は、複数の文書に対して実行されるパスの数に応じて、任意の数の列を有するように成長し得る。したがって、図２は、文書３１０−３５０に関連する圧縮辞書２００の一部のみを示すものである。
【００６１】
例示的な一実施形態は、各カタログ段階の終わりに並べ替えおよび切り捨ての動作を実行する。但し、連続するパスで適用される閾値は、最初のパスの閾値と異なる場合がある。例示的な一実施形態は、追加のパスに対してより低い置換閾値を使用する。
【００６２】
幾つかの実施形態は、最良の圧縮が達成されるまで、一連の試行における文書の部分集合を各試行についてパスの異なる閾値で圧縮することにより、各パスの置換閾値の理想値を決定する。
【００６３】
図４は、例示的な一実施形態の動作を示すフローチャートである。パスのカタログ化段階４００は、全ての新出の記号を識別することから始まる（４０１）。次に、例示的な一実施形態は、それぞれの新出の記号の出現回数を数える（４０２）。次に、例示的な一実施形態は、新出の記号を圧縮辞書に取り込む（４０３）。圧縮辞書の作成には、回数に基づいて新出の記号対を並べ替え、閾値を超えない回数の記号対を省略し、それぞれの新出の記号対に置換記号を関連付けることが含まれる。例示的な一実施形態は、置換段階４５０に移行する前に、全ての文書のカタログ化段階４００を完了する。
【００６４】
置換段階４５０の間、例示的な一実施形態は、圧縮辞書内の項目と一致する記号対について入力文書を検索する（４５１）。置換が可能な場合、例示的な一実施形態は、記号対を関連する置換記号で置換する（４５２）。例示的な一実施形態は、閾値を超える記号対のみを圧縮辞書に取り込むことにより、４０３で閾値を適用する。但し、閾値を超えない回数を有する記号対を保持する他の実施形態は、閾値を超える回数を有する記号対を置き換えるだけで閾値を適用する。置換が行われた後（４５２）、例示的な一実施形態は、カタログ化段階４００に戻り、前のパスの出力を使用して後続のパスを開始することにより再帰的に動作する。再帰処理の一部として、例示的な一実施形態は、後続のパスの設定に従って置換閾値を調整する（図示せず）。パスにおいて置換が不可能な場合、例示的な一実施形態は、圧縮された出力文書を保存し、終了する（４９９）。必要な場合、例示的な一実施形態は、各パスの置換段階を逆行することにより圧縮文書を復元する。
【００６５】
例示的な一実施形態は、全ての圧縮文書を解凍し、圧縮辞書を削除し、複数の文書の一部として新しい文書を用い、非圧縮文書に処理（すなわち、４００−４９９）を再適用することによって、新しい文書を処理する。新しい文書の圧縮は、資源の需要が低いと予想される時間に実行されるように予定されるものであってもよく、または、ユーザが圧縮文書にアクセスするときに顕著な遅延が発生しないように、オフラインシステムによって予定されるものであってもよい。
【００６６】
別の実施形態は、新しい文書にカタログ段階及び置換段階のパスを適用することによって、文書を解凍することなく新しい文書を処理する。このような実施形態では、圧縮辞書で切り捨てが行われない場合、新しい文書で識別された記号対によって、以前に置換閾値を満たさなかった特定の置換記号の回数が閾値を超えて新しい文書で使用される可能性があるため、圧縮が改善されます。
【００６７】
他の実施形態は、置換段階のみを新しい文書に再帰的に適用する。このような実施形態の場合、文書の元の組内の文書は、トレーニングセットとして機能することができる。
【００６８】
この処理は、大量のデータで最適に機能する。圧縮されるデータが多いほど、記号の長いシーケンスが繰り返される可能性が高くなる。したがって、記号の数が増えると、より高い圧縮率を実現することができる。このようにして、上記の実施形態を参照して説明された処理は、「ビッグデータ」アプリケーションに好適なものである。実際、開示された実施形態は、非常に小さなデータセットに適用される場合、圧縮辞書に関連するオーバーヘッドを一部の理由として、既存の技術と比較してより大きなデータサイズをもたらす場合がある。
【００６９】
同様に、複数の文書に特定の知識分野の文書のみが含まれる場合、特定の知識分野にはその分野専用のテキストで頻繁に繰り返される共通の用語とフレーズがあるため、この処理は圧縮率を改善できる。一方、新しい知識分野の文書が複数の文書に組み込まれると、この処理に、達成可能な圧縮率が低下する学習曲線が現れる。最終的には、新しい分野で十分な数の文書を処理した後、システムは、新しい分野から用語を「学習」でき、圧縮率が向上する。
【００７０】
図５は、一実施形態の実験結果を要約するものである。実験した実施形態は、入力文書内の各単語を記号として識別するようにプログラムされた。実験した実施形態は、入力文書に標準化を適用し、特定のパスに関連する圧縮辞書のセクションを、そのパスのカタログ段階の後に並べ替えおよび切り捨て処理を実行した。実験で使用した文書は、無作為に選択された１５，０００の米国特許からの抄録である（１００万語強）。実験した実施形態が文書に適用される前に、全ての非英数字が削除され、全ての大文字が小文字に変換された。
【００７１】
データサイズが増加するにつれて圧縮率が向上するという前提をテストするために、実験した実施形態は、６つの異なるサイズの文書群に適用された。表１に、各群のサイズと達成された圧縮率が示されている。表１のデータは、図５にプロットされている。図５において、ｘ軸（ログスケール）は文字数、ｙ軸は圧縮率である。図５の破線は、表１のデータのべき乗回帰に基づく傾向線を表している。
【表１】
2020521408.tif 000003
【００７２】
実験結果の圧縮率はパーセンテージで表され、圧縮データのサイズは、非圧縮データのパーセンテージで示されている。つまり、圧縮率（パーセント）は、圧縮文字数を非圧縮文字数で割って１００を掛けた値に等しい。圧縮文字数には、出力文書の圧縮文字数と圧縮辞書の文字数が含まれる。
【００７３】
この実験的実施形態は、英語のテキストに適用した場合にせいぜい６０％であるバイトペアエンコーディングにより達成可能な圧縮率を改善することができた。Shibata Y. 等 （2000) 「テキスト圧縮によるパターンマッチングの高速化」 (Bongiovanni G., Petreschi R., Gambosi G.(編) 「アルゴリズムと複雑さ, CIAC 2000, コンピュータ科学における講義ノート, 1767巻, シュプリンガー, ベルリン, ハイデルベルク)（Shibata Y. et al. （2000) Speeding Up Pattern Matching by Text Compression (in:Bongiovanni G., Petreschi R., Gambosi G.(eds) Algorithms and complexity, CIAC 2000, Lecture Notes in Computer Science, vol 1767, Springer, Berlin Heidelberg)）を参照。最終的に、実験した実施形態は、約１００万語のサンプル全体に適用した場合、５６．０９％の圧縮率を達成した。
【００７４】
このシステムおよび処理は、電子メール、ニュース、その他のライブラリアーカイブなどのアーカイブの圧縮など、様々なアプリケーションに適用できる。このようなアプリケーションは、含まれる多数の記号が非常に多数の繰り返し文字列を生成する可能性が高いため、この処理に適しており、この処理によって高レベルの圧縮が促進される。アーカイブへの追加は、オフピーク時に発生するように予定することができ、必要な処理時間と追加された文書の圧縮によって達成される記憶空間の節約との最適なバランスをとるために、大きなバッチに構築できる。
【００７５】
図５の傾向線は、システムが十分に大きなデータセットに適用される場合、圧縮率が改善し続ける可能性が高いことを示唆するものである。傾向線は、約１０億文字で４０％を下回り、約１兆文字で３０％を下回っている。圧縮率が最も効果的である可能性が高いスケールの感覚を提供できる例に、Wikipedia（ウィキペディア）がある。２０１５年、Wikipediaの英語版には約２３０億文字が含まれると推定された。２００９年１１月（Wikipediaが全ての言語の単語数に関する統計を発表した最後の月）、Wikipedia（全ての言語）には約６０億の単語数があり、９か月ごとに１０億語の割合で成長していた。１単語当たり６文字と仮定すると、Wikipedia（全ての言語）は、２００９年１１月に３６０億文字となった。このような成長率が続いていると仮定すると、Wikipedia（全ての言語）は、２０１７年３月には、単語数で約１６０億または文字数で約１兆になると推定される。したがって、Wikipediaのスケールでデータセットをアーカイブすることを望む人は、この処理を使用した圧縮の恩恵を受けることができる。
【００７６】
クラウドベースの電子メールおよびメッセージングシステム向けのアプリケーションも、多くのユーザがいるため、この処理の恩恵を受けることができる。電子メールの多くは、他のユーザからの返信やメッセージである可能性がある。このようなメッセージには、多くの場合、元のメッセージの全てまたは一部が含まれている。この結果、この処理が単一の置換記号に置き換えることができる、重複した記号の非常に長い文字列が生じる。
【００７７】
多くの連続したパスの後に生成される特定の置換記号は、長いテキスト文字列を置換するものである。２つの圧縮された文書にこのような高次の置換記号が共通している場合、文書間の関係を推測することができる。上記のように、特定の分野の作品の著者は、その分野と作品に固有のフレーズと用語を繰り返す傾向がある。特定の著者は、その著者が頻繁に議論する多くの共通のフレーズ、概念、登場人物（物語のキャラクター）を使用する可能性がある。このような状況では、このような共通性に基づいて２つの作品が関連していると特定することができる。共通性を使用して、文書をコレクションとしてグループ化したり、特定の文書を他の文書の派生物として特定したり、特定の分野や特定の著者に対する読者の関心に基づいて読者に作品を提案したりすることができる。このような実施形態は、分野に精通していないユーザ、または実際の著者を特定するのが難しい状況（例えば、代筆者または盗作者）にとって特に有用である。
【００７８】
この処理は、符号化可能な任意のデータを分析するために適用することができる。例えば、人間の顔の特徴を、一連の測定値（それぞれの目のサイズ、両目の間隔、目の色、眉の長さ、等々）に体系化できる。これらの測定値は、一貫した順序を使用して、符号化または分類し、フォーマットし、そして文書に組み立てることができる。このような方法で、この圧縮処理は、各文書に特定の人の顔の構造の複数の測定値が含まれている文書の組に適用することができる。このシステムは、文書が圧縮された後、圧縮された文書内の置換記号を比較することにより、顔認識を実行することができる。高次の置換記号は、記号の長い連鎖を表すため、２つの文書の両方に同じ高次の置換記号が１つ以上あるという事実は、文書の測定値で表される顔が同じものである可能性が高いことを示すものである。
【００７９】
２つの文書間の一致は、閾値を超えて一致する高次の置換記号の総数に基づいて決定することができる。顔認識システムの別の実施形態は、最も近い１つまたは複数の一致、および各一致の信頼度を示す値を選択することができる。
【００８０】
このような顔認識システムは、例えば、安全な場所へのアクセスを制御するために使用できる。安全な場所は、物理的な場所（例えば、建物）またはデバイス（例えば、コンピュータシステム、データベース、またはそれらの保護された部分）である。別の用途として、未知の人物の身元を判別することもできる。さらに別の用途は、特定の測定値が人間の顔を表すかどうかを単に区別することである。
【００８１】
安全な場所へのアクセスを制御する場合、例示的な一実施形態は、まず、本明細書で説明された圧縮処理を使用して、それぞれが既知でありかつ権限が付与された人物からなるグループの１つを表す文書の組を圧縮し、圧縮辞書を作成する。後に未知の人物が安全な場所へのアクセスを要求するとき、その人物は、自分の顔の測定を行う処理を開始する。未知の人物の顔は、非侵襲的な方法（例えば、１つまたは複数のカメラで撮影された画像から必要な値を計算する方法）で測定できる。必要な値は、同じ圧縮辞書を使用して圧縮される新しい文書に配置される。システムは、新しい文書の圧縮バージョンの置換記号を、以前に圧縮された文書に含まれる置換記号と比較し、結果（例えば、単に一致が存在しており、アクセスを許可すべきであること、または、より具体的に、その未知の人物の認証された身元）を出力する。幾つかの実施形態では、システムは、未知の人物に対して音声アナウンスメントまたはカードスワイプなどの他の手段によって身元を明らかにするように促し、そして、その未知の人物の顔のキャプチャされた画像から得られた情報を含む文書を、未知の人物が主張した人物に関する事前に保存された情報を含む文書に対して検証するものであってもよい。他の実施形態では、システムは、人物の顔のキャプチャされた画像を含む文書を、権限が付与された全ての人物に関する事前に保存された情報を含む全ての文書と比較するものであってもよい。
【００８２】
顔認識システムにおいて、文書内の顔測定の記号体系は、正確な数値による測定値（例えば、瞳孔間隔＝６４．５７ｍｍ、または目の色（ＲＧＢ）＝（１６１，２０２，２４１）であってもよい。正確な測定値を使用すると、見つかった一致における高い確実性が得られるが、偽陰性も発生する可能性がある。時間の経過に伴う測定条件または機器の較正のわずかな変動により、誤認が生じる可能性がある。したがって、記号体系では、近似的な測定値または測定値が含まれる範囲を表す値を使用することが望ましい。範囲の記号体系には、範囲の数値、範囲の平均値、または範囲を表す任意の記号を含めることができる。
【００８３】
それぞれの顔認識文書には、誤認を防ぐために十分な数の測定値が必要である。測定値が少なすぎると、一致を誤って識別する危険性が生じる。顔認識処理の別の用途は、本明細書で説明された処理に基づいて顔認識システムを調査および改善することである。それは、既知の顔を表す十分に大きな文書の組を分析することにより、このシステムを使用して、必要な測定値の数、および十分な比較ポイントを生成するために必要な測定値の順序またはグループ化を決定することができるからである。
【００８４】
この処理の他の実用的なアプリケーションでは、圧縮された文書で認識されている共通性を使用して、文書のコンテンツを分析する。回数が数えられ、置換記号に関連付けられている記号対は、その基礎に意味を有している。したがって、文書の作成者または主題に関する考え、好み、またはその他の情報を、記号対から推測することができる。カタログ段階で収集されたデータは、このような情報から豊富に提供できるものである。
【００８５】
拡張機能を備えた実施形態は、特定の名詞または動詞に関連付けられた特定の置換記号に注目することにより、テキストの内容についてさらに学習する処理を利用できる。例えば、このようなシステムは、置換記号によって示される記号対に注目対象の単語を含む特定の置換記号を、タグ付けまたは記憶することができる。例えば、「love（愛する）」や「like（好む）」などの単語を含む記号対は、その記号対が肯定的な感情を表現していることを示す方法で、関連付けられた置換記号にタグ付けされる結果となり得る。対照的に、「hate（憎む）」や「despise（軽蔑する）」などの単語を含む記号対は、その記号対が否定的な感情を表現していることを示す方法で、関連する置換記号にタグ付けされる結果となり得る。別の例として、名詞を含む記号対は、関心のある領域（例えば、ペット、家族、製品など）に従って分類することができる。
【００８６】
このようなタグ付けを使用すると、圧縮テキスト内に現れる一対または一組のタグ付きの置換記号の近接性、または、これらの置換記号の連鎖に基づいて、著者が特定の実体または概念について表現する感情を推測することができる。例えば、肯定的な感情を示すタグ付きの置換記号が、ペットを示すタグ付きの置換記号の近く、または単に「犬」などの特定の単語の近くで見つかった場合、システムは、著者がペットを好む、または犬を好むと推測できる。特定の説明的な単語を追跡することで、特定の著者が表現する概念をよりきめ細かく理解できる（例えば、大きさに関係のない一般的な犬への愛着に対して小型犬への愛着）。このような実施形態では、後のパス中に割り当てられる置換記号は、後に割り当てられる置換記号に関連付けられる記号対を構成する以前に割り当てられた置換記号に割り当てられた属性を継承できる。例えば、Ｐ２の１つの置換記号が「肯定的な感情」を示すものとしてタグ付けされ、Ｐ２の別の置換記号が「ペット」を示すものとしてタグ付けされている場合、パス３では、両方のP２の置換記号を含むＰ３の置換記号を「ペットが好き」としてタグ付けすることができる。このように、異なる著者間で高次の置換記号が繰り返し出現することは、共通の関心を示している可能性がある。２人の異なる著者の作品に同じＰ３の置換記号が含まれている場合、これらの著者は、ペットへの共通の愛着を共有している可能性がある。
【００８７】
一実施形態の実装の一例は、電子メールアーカイブに関連して使用される。特定の作成者またはワーキンググループによって作成された電子メールの分析は、作成者が好きな製品、レストラン、都市など、作成者またはグループの好みを識別するために使用される。肯定的な感情を表す単語と特定の種類の動物を参照する単語を頻繁に組み合わせる著者は、そのような動物を所有している可能性があると特定され得る。次いで、例示的な一実施形態は、このような分析から決定された関連付けを、製品の推奨またはユーザへの広告を行うためのシステムに提供する。
【００８８】
開示された例示的な実施形態および方法の均等物は、本開示または添付の特許請求の範囲に含まれるものとする。開示された例示的な実施形態および方法、並びにそれらの均等物は、本開示または添付の特許請求の範囲内にとどまりながら修正され得ることが意図されている。
【００８９】
上述した詳細な説明において、開示を簡素化する目的で、様々な特徴を幾つかの実施形態の例にグループ化することができる。この開示の方法は、請求された実施形態が、対応する請求項に明示的に列挙されているよりも多くの特徴を必要とするという意図を反映するものとして解釈されるべきではない。むしろ、添付の特許請求の範囲が反映するように、発明の主題は、単一の開示された例示的な実施形態の全ての特徴よりも少ない特徴にある可能性がある。したがって、添付の特許請求の範囲は、詳細な説明に組み込まれ、各請求項は、別個に開示された実施形態として独立している。「実施形態」という用語の使用は、他の実施形態に関連して説明された特徴の除外を意味することも意図していない。むしろ、一実施形態または実施形態のグループの特徴は、明らかに矛盾しない限り、他の実施形態または実施形態のグループの特徴と組み合わせることができる。したがって、本開示はまた、いずれの特定の実施形態に組み合わせて明示的には開示されていない可能性のある特徴の組み合わせを含む、本開示または添付の特許請求の範囲に現れる１つまたは複数の開示または特許請求される特徴（すなわち、非互換的でも相互に排他的でもない特徴の組）のうちの任意の適切な組を有する実施形態を暗黙的に開示すると解釈されるものとする。添付の特許請求の範囲は、本明細書に開示される主題の全体を必ずしも包含するわけではないことにさらに留意されたい。
【００９０】
本開示および添付の特許請求の範囲では、接続詞「または」は包含的に解釈されるべきである（例えば、「犬または猫」は、「犬、または猫、またはその両方」と解釈される。「犬、猫、または鼠」は、「犬、または猫、または鼠、または任意の２つ、または３つ全て」と解釈される。ただし、次の場合を除く。すなわち、（ｉ）（例えば、「いずれか一方」、「・・・のうちの１つのみ」、または同様の言葉で）明示的に述べられている場合、または、（ii）２つ以上の列挙された選択肢が特定の文脈内で相互に排他的である場合(この場合、「または」は相互に排他的でない選択肢を含む組み合わせのみを含む)である。本開示および添付の特許請求の範囲において、「含む」、「有する」、およびそれらの変化形は、それらが現れる場合はどこでも、これらの用語例に対して「少なくとも」という句が追加された場合と同じ意味を有する、追加可能な形式の用語として解釈されるものとする。
【００９１】
添付の特許請求の範囲において、米国特許法第１１２条第６項の規定が装置の請求項で実施されることが望まれる場合、その装置の請求項で「手段」という用語が使用される。これらの規定が方法の請求項で実施されることが望まれる場合、その方法の請求項で「ステップ」という用語が使用される。逆に、「手段」または「ステップ」という用語が請求項に現れない場合、米国特許法第１１２条第６項の規定が、その請求項に対して実施されることは意図されていない。
【００９２】
１つまたは複数の開示が参照により本明細書に組み込まれており、このような組み込まれた開示が本開示と部分的または全体的に矛盾する、または範囲が本開示と異なる場合、矛盾、より広い開示、またはより広い用語の定義について、本開示が優先する。このような組み込まれた開示の一部または全体が互いに矛盾する場合、後の日付の開示が優先する。
【００９３】
要約は、特許文献内での特定の主題の検索を支援するために必要に応じて提供される。但し、この要約は、そこに記載されている要素、機能、または制限が特定の請求項に必ず含まれることを意味するものではない。
【００９４】
この段落には、動作対象の記号が単語である圧縮処理の１つの実装であるコンピュータコード（Ｍｉｃｒｏｓｏｆｔ（登録商標）  Ｅｘｃｅｌ（登録商標）  ２０１６の Ｍｉｃｒｏｓｏｆｔ（登録商標）  Ｖｉｓｕａｌ  Ｂａｓｉｃ（登録商標）  ｆｏｒ  Ａｐｐｌｉｃａｔｉｏｎｓ  ７．１）が含まれる。
Sub f_clean_up_Final_Memory_text_independent_data()
'Final Memory (text, independent)をクリーンアップするモジュール
'小文字変換のための第１の数式を作成
Range("B4") = "=LOWER(RC[-1 ])"
'列Aで下方向のデータセットの終了を検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, 1))
a = a + 1
Loop
a = a - 1
'次の行の第１の数式をコピー
Range("B4").Copy
Range(Cells(5, 2), Cells(a, 2)).Select
ActiveSheet. Paste
'列Ｂの数式セット全体を列Aにコピー
Range(Cells(4, 2), Cells(a, 2)).Copy
Range("A4").PasteSpecial Paste:=xlPasteValues
'列Bの内容を削除
Range(Cells(4, 2), Cells(a, 2)).CIearContents
'幾つかの記号を "(nothing)" または "(space)"に置換
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:=";", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:=":", Replacements"",LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:=",", Replacements"",LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:=".", Replacements"", LookAtsxIPart,
SearchOrdersxIByRows 
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="~?", Replacements"",
LookAt:=xlPart, SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="!", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="+", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="-", Replacements" ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="-", Replacements" ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"-", Replacements" ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"/", Replacements" / ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"'s", Replacements" 's",
LookAtsxIPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"'s", Replacements" 's",
LookAtsxIPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats , Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats""" , Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"'" , Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"'", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="'", Replacements"", LookAt:=xlPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="[", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="]", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="{", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="}", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"(", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats")", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"≫", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats" ≪", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats">", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"<", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"@", Replacements"(c) ",
LookAtsxIPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"%", Replacements" percent",
LookAtsxIPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats'T, Replacements! ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats'T, Replacements^ ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats'T, Replacements"* ", LookAtsxIPart,
SearchOrder:=xlByRows 
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="~*", Replacements"",LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="~* ", Replacements"", 
LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="~*", Replacements"",
LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="=", Replacements ", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"'", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"' ", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:=" ", Replacements" ", LookAt:=xlPart,
SearchOrder:=xlByRows
End Sub
Sub a_for_mem01 ()
' a_for_mem01
'Imem シートの以前の項目を削除
Range("C4:BYB1048576").CIearContents
'pro01 シートの以前の項目を削除
Sheets("pro01 ").Select
Cells.Delete
'pro02 シートの以前の項目を削除
Sheets("pro02"). Select
Cells.Delete
'pro03 シートの以前の項目を削除
Sheets("pro03"). Select
Cells.Delete
'Imem シートに戻る
Sheets("lmem").Select
'Final Memory (text, independent) の下方向の長さを決定
a = 3
Do Until lsEmpty(Cells(a, 1 ))
a = a + 1
Loop a = a - 1
'Final Memory を pro01 シートにコピー
Range("A3:A"&a&"").Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet. Paste
'単語を分割
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True,
Semicolon :=True, Comma:=True, Tab:=True, Space:=True, Other:=True, OtherChar:= _
Field lnfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)),
TrailingMinusNumbers:=True
'最長の行を見つける
e = 1
d = 2
Do Until lsEmpty(Cells(d, 1))
c = 1
Do Until lsEmpty(Cells(d, c))
c = c + 1
Loop
c = c- 1
If c > e Then
e = c
End If
d = d + 1
Loop
e = e '最大列数の最後の数
'ヘッダを付加
f=1
Do Until f = e + 1
Cells(1,f) = ""&f&""
f = f+1
Loop
'最左に列を挿入
Columns("A:A"). Insert Shift:=xlToRight 
'データセットの下方向の終了を決定
a = 1
Do Until lsEmpty(Cells(a, 2))
a = a + 1
Loop
a = a - 1
'ピボットテーブル (統合)
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
Array("pro01 !R1 C1 :R" & a & "C" & e + 1 & "", "Iteml "),
Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="'pro01 '!R1 C" & e + 4 & "", _
TableName:="PivotTable1 ", DefaultVersion:=xlPivotTableVersion14
ActiveSheet.PivotTables("PivotTable1 ").DataPivotField.Pivotltems("Count of Value").
Position = 1
With ActiveSheet. PivotTables(" Pi votTablel ") . PivotFields(" Value")
.Orientation = xIRowField
.Position = 2
End With
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Page1 ").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Column").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Row").Orientation =xlHidden
'ピボットテーブルの下方向の終了を検出
i = 3
Do Until lsEmpty(Cells(i, e + 4))
i = i + 1
Loop
i = i - 1
'ピボットテーブルの内容を右隣にコピー
Range(Cells(3, e + 4), Cells(i - 1 , e + 5)).Copy
Cells(3, e + 6). Select
ActiveSheet. Paste
'コピーされたテーブルを回数の大から小へ並べ替え
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add
Key:=Range(Cells(4, e + 7), Cells(i - 1 , e +)), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(3, e + 6), Cells(i - 1 , e + 7)) 
.Header = xlYes
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
'(blank) が存在する場合削除する
If Cells(i - 1 , e + 6) = "(blank)" Then
j = i - 2
Else: j = i - 1
End If
'並べ替えられたテーブルを Imem シートにコピー
Range(Cells(4, e + 6), Cellsfl, e + 7)).Copy
Sheets("lmem").Select
Range("E4").PasteSpecial Paste:=xlPasteValues
End Sub
Sub b_replace_word_to_address()
'単語をアドレスに変換するモジュール
'pro01 シートの以前の項目を削除
Sheets("pro01 ").Select
Cells.Delete
'pro02 シートの以前の項目を削除
Sheets("pro02"). Select
Cells.Delete
'pro03 シートの以前の項目を削除
Sheets("pro03"). Select
Cells.Delete
'Imem シートに戻る
Sheets("lmem").Select
'Final Memory (text, independent) の下方向の長さを決定
a = 3
Do Until lsEmpty(Cells(a, 1 ))
a = a + 1
Loop
a = a - 1 
'Final Memory を Imem シートにコピー
Range("A3:A" & a & "").Copy
Sheets("pro01 ").Select
Range("A1 ").Select
ActiveSheet. Paste
'単語の分割
Selection.TextToColumns Destination:=Range("A1 "), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Semicolon :=True,
Comma:=True, Tab:=True, Space:=True, Other:=True, OtherChar:= _
"-", Field lnfo:=Array(Array(1 , 1 ), Array(2, 1 ), Array(3, 1 ), Array(4, 1 ), Array(5, 1 )),
TrailingMinusNumbers:=True
'Imem シートに戻る
Sheets("lmem").Select
'MemoryOI データの下方向の終了を決定
b = 3
Do Until lsEmpty(Cells(b, 5))
b = b + 1
Loop
b = b - 1
'MemoryOI データを pro02 シートにコピー
Range(Cells(2, 5), Cells(b, 6)).Copy
Sheets("pro02"). Select
Cells(2, 1).PasteSpecial Paste:=xlPasteValues
'アドレス列を作成
c = 4
Do Until lsEmpty(Cells(c, 1 ))
Cells(c, 3) = ("R" & c & "C5")
c = c + 1
Loop
'pro01 シートへ行く
Sheets("pro01 ").Select
'データセットの下方向の終了を決定
d = 1
Do Until lsEmpty(Cells(d, 1 ))
d = d + 1
Loop
d = d - 1
'初期長の数を作成
Sheets("pro03").Cells(1 , 1) = 1
g = Sheets("pro03").Cells(1 , 1 )
'シート pro01 へ行く
Sheets("pro01 ").Select
'データセットの右方向の最大長さを決定
e = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(e, 1))
f = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(e, f))
f = f + 1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1 , 1 ) = f
g = Sheets("pro03").Cells(1 , 1 )
End If
e = e + 1
Loop
h = g '右方向の最大長さ値
'単語をアドレス番号に置換
k = 4
Do Until lsEmpty(Sheets("pro02").Cells(k, 1))
'アドレス名を定義
i = Sheets("pro02").Cells(k, 3)
'単語名を定義
j = Sheets("pro02").Cells(k, 1 )
'単語からアドレスへの実際の置換
Range(Cells(2, 1 ), Cells(d, h)).Replace What:="" & j & "", Replacements"" 
& i & "", LookAt: =xl Whole, Search Order :=xl By Rows
k = k + 1
Loop
'結合アドレスの作成
p = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(p, 1))
'pro03 シートの以前の項目を削除
Sheets("pro03").Cells.Delete
'全ての結合アドレスのシーケンスを作成
Sheets("pro03").Cells(1 , 1 ) = Sheets("pro01 ").Cells(p, 1 )
m = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(p, m))
Sheets("pro03").Cells(m, 1).FormulaR1 C1 = "='pro03'!R" & m - 1
& "C1 & &'pro01 '!R" & p & "C" & m & ""
m = m + 1
Loop
'データセットの終了を検出
n = 1
Do Until lsEmpty(Sheets("pro03").Cells(n, 1))
n = n + 1
Loop
n = n - 1
'数式から値へシーケンスを変換し、pro01へコピー
Sheets("pro03").Cells(n, 1 ).Copy
Sheets("pro01 ").Cells(p, h + 2).PasteSpecial Paste :=xlPasteValues
p = p + 1
Loop
'結合アドレスデータセットの終了を検出
q = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(q, h + 2))
q = q + 1
Loop
q = q - 1
'結合アドレスセットを Imem シートにコピー
Range(Cells(2, h + 2), Cells(q, h + 2)).Copy
Sheets("lmem").Select
Range("C4").Select
ActiveSheet. Paste
End Sub
Sub c_find_2_same_sequence()
'このプログラムセットの中核部!!!
For x = 2 To 1000
y = 2 * x + 3
'pro01 シートの以前の項目を削除
Sheets("pro01 "). Select
Cells.Delete
'pro03 シートの以前の項目を削除
Sheets("pro03"). Select
Cells.Delete
'タイトル "combined" を付加
Cells(1 , 1) = "combined"
'Imem シートに戻る
Sheets("lmem").Select
'C列データエンドの下方向の終了を検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'それを pro01 シートにコピー
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01 "). Select
Range("A1 ").PasteSpecial Paste:=xlPasteValues
'データセットを分割
Selection TextToColumns Destination:=Range("A1 "),
DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote,
ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon :=True,
Comma:=True, Space:=True, Other:=True, OtherChar:=_
"-", Field lnfo:=Array(Array(1 , 1 ), Array(2, 1 ), Array(3, 1 ), Array(4, 1 )), _
TrailingMinusNumbers:=True
'初期 g 値を入力
Sheets("pro03").Cells(1 , 1 ) = 1
g = Sheets("pro03").Cells(1 , 1 )
'データセットの右方向の最大長を決定
e=2
Do Until lsEmpty(Sheets("pro01").Cells(e, 1))
f=1
Do Until lsEmpty(Sheets("pro01").Cells(e, f))
f = f+1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
'アドレス対を配置
i = 2
Do Until lsEmpty(Sheets("pro01").Cells(i, 1))
t = 1
Do Until lsEmpty(Sheets("pro01").Cells(i, t))
t = t + 1
Loop
t = t - 1
If t > 1 Then
h = 2
Do Until lsEmpty(Sheets("pro01").Cells(i, h))
Cells(i, (g + 2) + (h - 2)) = "=R" & i & "C" & h - 1 & "& &R" & i & "C" & h & ""
h = h + 1
Loop
Else: Cells(i, g + 2) = "zzz"
End If
i = i + 1
Loop
'ヘッダを付加
f=1
Do Until f = g
Cells(1,g + 1 + f) = ""&f&""
f = f+1
Loop
'データセットの下方向の終了を検出
j = 1
Do Until lsEmpty(Cells(j, g+2))
j=j + 1
Loop
j=j - 1
'ピボットテーブル（結合）
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation,
SourceData:=_
Array("pro01!R1C" & g + 1 & ":R" &j & "C" & g + 1 + g - 1 &"",
"Iteml"), Version:=6). _
CreatePivotTableTableDestination:="'pro01'!R1C" & g + 1 + g - 1
+ 2 &"", TableName:=_ "PivotTable1",DefaultVersion:=6
ActiveSheet.PivotTables("PivotTable1").DataPivotField.Pivotltems("Count of Value").
Position = 1
ActiveSheet.PivotTables("PivotTable1").PivotFields("Page1").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Column").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Row").Orientation = xlHidden
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Value")
.Orientation =xlRowField
.Position = 1
End With
'2 つの空の行を削除
Range(Cells(1 , 2 * g + 2), Cells(2, 2 * g + 3)).Delete Shift:=xlUp
'ピボットテーブルの終了を検出
p = 1
Do Until lsEmpty(Sheets("pro01").Cells(p, 2 * g + 3))
p = p + 1
Loop
P = P - 1
If Cells(p, 2 * g + 2) = "Grand Total" Then
P = P - 1
End If
'ピボットテーブルを右側にコピー
If Cells(p, 2 *g +2) = "zzz" Then
Range(Cells(1 , 2 * g + 2), Cells(p - 1 , 2 * g + 3)).Copy
Else: Range(Cells(1 , 2 * g + 2), Cells(p, 2 * g + 3)).Copy
End If
Cells(1,2*g+5).Select
ActiveSheet. Paste
Selection. Columns.AutoFit
'降順に並べ替え
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add
Key:=Range(Cells(2, 2 * g * g + 6)), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(1 , 2 * g + 5), Cells(p, 2 * g + 6))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
'名前変更
q = 2 *g +5
'データセットの下方向の終了を検出
aa = 1
Do Until lsEmpty(Cells(aa, q + 1))
aa = aa + 1
Loop
aa = aa - 1
'頻度制限の数を定義
w = Sheets("para").Cells(x+4,2)
'頻度 X セル未満の開始を見つける
If aa = 2 Then
If w>=2Then
If Cells(aa, q + 1 ) <= w - 1 Then
r = 2
Else: r = 3
End If
Else: r = 3
End If
End If
If aa>2 Then
If w>=2Then
For bb = 1 To aa
If Cells(bb, q + 1) <= w - 1 Then
cc = bb
bb = aa
Else: cc = aa + 1
End If
Next bb
r = cc
Else: r = aa + 1
End If
End If
'If x = 2 Then
'Stop
'End If
If r > 2 Then
'頻度 X セルの終了を見つける
s = r
Do Until lsEmpty(Cells(s, q + 1))
s = s + 1
Loop
s = s- 1
'不要な頻度を削除
If w>=2 Then
Range(Cells(r, q), Cells(s + 500, q + 1)).Delete
Shift:=xlUp '< 500は単なる余分のバッファ
End If
'レイヤ ID 検索テーブルのヘッダを付加
Cells(1,q +3) = "1st C Position"
Cells(1,q+4) = "Space Position"
Cells(1,q +5) = "2nd C Position"
Cells(1, q + 6) = "End Position"
Cells(1,q+7) = "1stlayer#"
Cells(1, q +8) = "2nd Layer#"
'最初の行の数式を入力
Cells(2, q+3) = '=Find(""C"", rc[-3], 1)"
Cells(2, q+4) = '=find( ,rc[-4],1)"
Cells(2, q+5) = '=find(""C"",rc[-5],rc[-1])"
Cells(2, q + 6) = '=len(rc[-6])"
Cells(2, q + 7) = '=mid(rc[-7],rc[-4]+1 ,rc[-3]-(rc[-4]+1))
Cells(2, q + 8) = '=mid(rc[-8],rc[-3]+1 ,rc[-2]-rc[-3])"
'データセットの終了を検出
t = 1
Do Until lsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t-1
'最初の行を他の行にコピー
If t > 2 Then
Range(Cells(2, q +3), Cells(2, q +8)). Copy
Range(Cells(3, q +3), Cells(t, q +3)).PasteSpecial Paste:=xlAII
End If
'レイヤ番号を数式からテキストに変換
Range(Cells(1, q +7), Cells(t, q +8)).Select
Selection. Copy
Selection. PasteSpecial Paste:=xlPasteValues
'レイヤ番号をテキストから値に変換
Range(Cells(1, q +7), Cells(t, q +7)).Select
Selection TextToColumns Destination:=Cells(1, q +7),
DataType:=xlFixedWidth, _ OtherChar:="-", Field lnfo:=Array(0, 1),
TrailingMinusNumbers:=True
Range(Cells(1, q +8), Cells(t, q +8)).Select
Selection TextToColumns Destination:=Cells(1, q +8),
DataType:=xlFixedWidth, _ OtherChar:="-", Field lnfo:=Array(0, 1),
TrailingMinusNumbers:=True
'データセットを1st layer#で次に2nd layer#で並べ替え
If x > 2 Then
Range(Cells(1, q), Cells(t, q +8)).Select
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add Key:=Range(Cells(2,
q + 7) , Cells(t, q + 7)), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add Key:=Range(Cells(2,
q + 8) , Cells(t, q + 8)), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(1 , q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
'データセットの終了を検出
aa = 1
Do Until lsEmpty(Cells(aa, q + 7))
aa = aa + 1
Loop
aa = aa - 1
'1st layer# でより小さいレイヤ番号の終了を検出
For gg = 2 To aa
If Cells(gg, q + 7) = 2 * x + 1 Then
dd = gg
gg = aa
End If
Next gg
If dd = Empty Then
dd = 3000000000000#
End If
'2nd layer# でより小さいレイヤ番号の終了を検出
For hh = 2 To aa
If Cells(hh, q + 8) = 2 * x + 1 Then
ee = hh
hh = aa
End If
Next hh
If ΘΘ = Empty Then
ΘΘ = 3000000000000#
End If
'dd と ee で小さい方を見つける
If dd >= ee Then
cc = ee
Else: cc = dd
End If
'以前のレイヤの行のみを削除
If cc > 2 Then
Range(Cells(2, q), Cells(cc - 1 , q + 8)).Delete
End If
'データセットの終了を検出
t = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(t, q))
t = t + 1
Loop
t = t - 1
'データセットが空の場合、t 値が失敗。プログラムを強制終了する
If t = 1 Then
t = 0
End If
'対の回数（対の頻度）によりデータを並べ替え
Range(Cells(1 , q), Cells(t, q + 8)).Select
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add Key:=Range(Cells(2, q
+ 1), Cells(t, q + 1 )), SortOn:=xlSortOnValues, Order:=xlDescending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(1 , q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
End If
'データセットの終了を検出
t = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(t, q))
t = t + 1
Loop
t = t - 1
'並べ替えられたテーブルを Imem シートにコピー
Range(Cells(2, q), Cells(t, q + 1 )).Copy
Sheets("lmem").Select
Cells(4, y).Select '< ここ!!!
ActiveSheet. Paste
' 2つの単語セルを１つに置換するモジュール
'pro01 シートの以前の項目を削除
Sheets("pro01 "). Select
Cells.Delete
'Imem シートに戻る
Sheets("lmem").Select
'Final Memory (associated) 列でデータセットの終了を決定
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'Final Memory (associated) を pro01 シートにコピー
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01 ").Cells(1 , 1 ).PasteSpecial Paste:=xlPasteValues
'pro01 シートに行く
Sheets("pro01 "). Select
'列A の列幅を調整
Columns("A:A").ColumnWidth = 240
'Imem シートに戻る
Sheets("lmem").Select
'MemoryXX でデータセットの終了を決定
b = 3
Do Until lsEmpty(Sheets("lmem").Cells(b, y)) 
'< 9 は可変でなければならない
b = b + 1
Loop
b = b - 1
'MemoryXX を pro01 シートにコピー
Range(Cells(3, y), Cells(b, y + 1 )).Copy
'< 9 および 10 は可変でなければならない
Sheets("pro01 ").Cells(1 , 3).PasteSpecial Paste:=xlPasteValues
'pro01 シートに行く
Sheets("pro01 "). Select
'列A の列幅を調整
Columns("C:D").Columns.AutoFit
'タイトルを付加
Cells(1 , 5) = "MemoryXX address"
' MemoryXX 終了の下方向の終了を検出
c = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(c, 3))
c = c + 1
Loop
c = c - 1
'MemoryXX アドレスを付加
d = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(d, 3))
Cells(d, 5) = "R" & d + 2 & "C" & y &
< 9 は変数でなければならない
d = d + 1
Loop
'列A でデータセットの終了を検出
e = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(e, 1))
e = e + 1
Loop
e = e - 1
'ホーム位置に行く
Range("A1 ").Select
'２つの単語を１つに置換
f = 2
Do Until lsEmpty(Sheets("pro01").Cells(f, 5))
g = Sheets("pro01").Cells(f, 3)
h = Sheets("pro01").Cells(f, 5)
Range("A2:A" & e & ""). Replace What:="" & g & "", Replacements"" & h & "",
LookAt: =xl Part, SearchOrder :=xl By Rows
f = f+1
Loop
'列A でデータセットの終了を検出
i = 1
Do Until lsEmpty(Sheets("pro01").Cells(i, 1))
i = i + 1
Loop
i = I - 1
'列A を Imem シートにコピー
Range(Cells(1, 1), Cells(i, 1)).Copy
Sheets("lmem").Select
Range("C3").PasteSpecial Paste:=xlPasteValues
Else: x = 1000
End If
Next x
'Imeme シートに行く
Sheets("lmem").Select
Range("A1").Select
End Sub
Sub d_text_to_formula()
' formulatext Macro
For c = 1 To 1000
'場合分け Final memory cooking および Mem02< cooking
If c = 1 Then
d = 3
Else:d=2*c + 3
End If
'データセットの終了の検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, d))
a = a + 1
Loop
a = a - 1
'space を &" "&で置換
Range(Cells(4, d), Cells(a, d)).Replace What:=" ", Replacement:="& &",
LookAt:=xlPart, SearchOrder:=xlByRows
'pro01 シートの以前の項目を削除
Sheets("pro01 ").Select
Cells.Delete
'Imem データを pro01 シートにコピー
Sheets("lmem").Select
Range(Cells(3, d), Cells(a, d)).Copy
Sheets("pro01 ").Select
Range("A1 ").Select
ActiveSheet. Paste
'列幅を調整
Selection. Columns.AutoFit
'列Bにタイトルを付加
Range("B1 ") = "with ="
'データセットの下方向の終了を検出
b = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(b, 1))
b = b + 1
Loop
b = b - 1
If Not b = 1 Then
'第１の数式を付加
Range("B2").FormulaR1 C1 = "=""=""&RC[-1]"
Range("B2").Copy
Range(Cells(2, 2), Cells(b, 2)).Select
ActiveSheet. Paste
'列B全体を選択
Columns("B:B").Select
'数式から値へ変換
Selection. Copy
Selection. PasteSpecial Paste:=xlPasteValues
'テキストから新たな数式へ変換
Selection TextToColumns Destination:=Range("B1 "),
DataType:=xlFixedWidth, OtherChar:- '-", Field lnfo:=Array(0, 1 ),
TrailingMinusNumbers:=True 
'新たな数式を Imem シートにコピー
Range(Cells(2, 2), Cells(b, 2)).Copy
Sheets("lmem").Select
Cells(4, d).Select
ActiveSheet. Paste
Else: c = 1000
End If
Next c
'Imem シートに戻る
Sheets("lmem").Select
Range("A1 ").Select
End Sub
Sub e_formula_to_text()
'アドレスが見えるように数式をテキストに変換するモジュール
For b = 1 To 1000
If b = 1 Then
c = 3
Else: c = 2 * b + 3
End If
'データセットの下方向の終了を検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, c))
a = a + 1
Loop
a = a - 1
If Not a = 3 Then
'ターゲットのデータセットを選択
Range(Cells(4, c), Cells(a, c)).Select
'セル内容の表示を結果から数式へ変更
ActiveWindow.DisplayFormulas = True
'"=" を"(nothing)" で置換
Selection. Replace What:="=", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows 'replace &" "& with "(space)"
Selection. Replace What:="& &", Replacements" ", LookAt:=xlPart,
SearchOrder:=xlByRows
'セルの内容を数式から結果に戻す
ActiveWindow.DisplayFormulas = False
Else: b = 1000
End If
Next b
'Imem シートに戻る
Sheets("lmem").Select
Range("A1 ").Select
End Sub
【００９５】
この段落には、動作対象の英数字である圧縮処理の１つの実装であるコンピュータコード（Ｍｉｃｒｏｓｏｆｔ（登録商標）  Ｅｘｃｅｌ（登録商標）  ２０１６の Ｍｉｃｒｏｓｏｆｔ（登録商標）  Ｖｉｓｕａｌ  Ｂａｓｉｃ（登録商標）  ｆｏｒ  Ａｐｐｌｉｃａｔｉｏｎｓ  ７．１）が含まれる。
Sub f_clean_up_Final_Memory_text_independent_data()
'Final Memory (text, independent)をクリーンアップするモジュール
'小文字変換のための第１の数式を作成
Range("B4") = "=LOWER(RC[-1 ])"
'列Aでデータセットの下方向の終了を検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, 1))
a = a + 1
Loop
a = a - 1
'第１の数式を以下の行にコピー
Range("B4").Copy
Range(Cells(5, 2), Cells(a, 2)).Select
ActiveSheet. Paste
'列Bの数式セットの全体を列Aにコピー
Range(Cells(4, 2), Cells(a, 2)).Copy
Range("A4").PasteSpecial Paste:=xlPasteValues
'列Bの内容を削除
Range(Cells(4, 2), Cells(a, 2)).CIearContents
'幾つかの記号を"(nothing)" または "(space)"に置き換える
Range(Cells(4, 1), Cells(a, 1)).Replace What:=";", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=":", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=",", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=".", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~?", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"!", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"+", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"-", Replacements" ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"-", Replacements" ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"-", Replacements" ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"/", Replacements" / ", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"'s", Replacements" 's", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"'s", Replacements" 's", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats"""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace Whats""", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:= """, Replacements"", LookAt:=xlPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="'", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="'" , Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="'", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="'", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="[", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="]", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="{", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="}", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:="(", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace What:=")", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace Whats"≫", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace Whats"≪", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace Whats">", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace Whats"<", Replacements"", LookAtsxIPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace Whats"@", Replacements"(c) ",
LookAtsxIPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1)).Replace Whats"%", Replacements" percent",
LookAtsxIPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="$", Replacements! ",
LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="£", Replacements ", LookAt:=xlPart,
SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace What:="#", Replacements"* ",
LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"-*", Replacements"", LookAtsxIPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"-* ", Replacements"", LookAtsxIPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"=", Replacements'^ ", LookAtsxIPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"'", Replacements"", LookAtsxIPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats"' ", Replacements"", LookAtsxIPart,
SearchOrdersxIByRows
Range(Cells(4, 1 ), Cells(a, 1 )).Replace Whats" ", Replacements" ", LookAtsxIPart,
SearchOrdersxIByRows
End Sub
Sub a_for_mem01 ()
' a_for_mem01
'Imem シートの以前の項目を削除
Range("C4:BYB1048576").CIearContents
'pro01 シートの以前の項目を削除
Sheets("pro01 ").Select
Cells.Delete
'pro02 シートの以前の項目を削除
Sheets("pro02"). Select
Cells.Delete
'pro03 シートの以前の項目を削除
Sheets("pro03"). Select
Cells.Delete
'Imem シートに戻る
Sheets("lmem").Select
'Final Memory (text, independent) の下方向の長さを決定
a = 3
Do Until lsEmpty(Cells(a, 1))
a = a + 1
Loop
a = a - 1
'Final Memory をImem シートにコピー
Range("A3:A"&a&"").Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet. Paste
'アルファベットを分割
Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth,
Fieldlnfo:= _
Array(Array(0, 1), Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), 
Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1) _
, Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), 
Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1) _
, Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1),
Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1) _
, Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1),
Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1) _
, Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1),
Array(45, 1), Array(46, 1), Array(47, 1), Array(48, 1), Array(49, 1) _
, Array(50, 1), Array(51, 1), Array(52, 1), Array(53, 1), Array(54, 1),
Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array(59, 1), Array(60, 1)) _
, TrailingMinusNumbers:=True
'データセットの下方向の終了を見つける
b = 1
Do Until lsEmpty(Cells(b, 1))
b = b + 1
Loop
b = b - 1
'初期長さの数を作成する
Sheets("pro03").Cells(1, 1) = 1
m = Sheets("pro03").Cells(1, 1)
'シート pro01 へ行く
Sheets("pro01").Select
'最長の列長を有する行番号を見つける
e = 2
Do Until lsEmpty(Cells(e, 1))
c = 1
Do Until lsEmpty(Cells(e, c))
c = c + 1
Loop
c = c - 1
If c >= m Then
Sheets("pro03").Cells(1, 1) = c
m = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
e = m
'第１行をクリア
Rows("1:1"). Clear
'ヘッダを付加
f=1
Do Until f = e + 1
Cells(1,f) = ""&f&""
f = f+1
Loop
'最左に列を挿入
Columns("A:A"). Insert Shift:=xlToRight
'データセットの下方向の終了を決定
a = 1
Do Until lsEmpty(Cells(a, 2))
a = a + 1
Loop
a = a - 1
'ピボットテーブル (結合)
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
Array("pro01!R1C1:R" & a&"C" & e + 1 &"", "Iteml"),
Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="'pro01 '!R1 C" & e + 4 & "", _
TableName:="PivotTable1 ", DefaultVersion:=xlPivotTableVersion 14
ActiveSheet.PivotTables("PivotTable1 ").DataPivotField.Pivotltems("Count of Value").
Position = 1
With ActiveSheet. PivotTables(" Pi votTablel ") . PivotFields(" Value")
.Orientation = xIRowField
.Position = 2
End With
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Page1 ").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Column").Orientation =xlHidden
ActiveSheet.PivotTables("PivotTable1 ").PivotFields("Row").Orientation = xlHidden
'ピボットテーブルの下方向の終了を検出
i = 3
Do Until lsEmpty(Cells(i, e + 4))
i = i + 1
Loop
i = i - 1
'不使用 (blank)
If Cells(i - 1 , e + 4) = "(blank)" Then
j = i - 2
Else: j = i - 1
End If
'ピボットテーブルの内容を右隣にコピー
Range(Cells(3, e + 4), Cellsfl, e + 5)).Copy
Cells(3, e + 6). Select
ActiveSheet. Paste
'コピーされたテーブルを回数の大から小へ並べ替え
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add 
Key:=Range(Cells(4, e + 7), Cells(j, e + 7)), SortOn:=xlSortOnValues, 
Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(3, e + 6), Cells(j, e + 7))
.Header = xlYes
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
'並べ替えられたテーブルを Imem シートにコピー
Range(Cells(4, e + 6), Cellsfl, e + 7)).Copy
Sheets("lmem").Select
Range("E4").PasteSpecial Paste:=xlPasteValues
End Sub
Sub b_replace_word_to_address()
'単語をアドレスへ置き換えるモジュール
'pro01 シートの以前の項目を削除
Sheets("pro01 ").Select
Cells.Delete
' pro02 シートの以前の項目を削除
Sheets("pro02"). Select
Cells.Delete
'pro03 シートの以前の項目を削除
Sheets("pro03"). Select
Cells.Delete
'Imem シートに戻る
Sheets("lmem").Select
'Final Memory (text, independent) の下方向の長さを決定
a = 3
Do Until lsEmpty(Cells(a, 1 ))
a = a + 1
Loop
a = a - 1
'Final Memory を Imem シートにコピー
Range("A3:A" & a & "").Copy
Sheets("pro01 ").Select
Range("A1 ").Select
ActiveSheet. Paste
'アルファベットを分割
Columns("A:A").TextToColumns Destination:=Range("A1 "), DataType:=xlFixedWidth, _
OtherChar:="-", Fieldlnfo:=Array(Array(0, 1), Array(1 , 1), Array(2, 1 ), Array(3, 1),
Array(4, 1 ), Array(5, 1 ), Array(6, 1), Array(7, 1 ), Array(8, 1), Array(9, 1 ) _ 
, Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1),
Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1) _
, Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1),
Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1) _
, Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1),
Array(36, 1 Array(37, 1), Array(38, 1), Array(39, 1) _
, Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1),
Array(46, 1), Array(47, 1), Array(48, 1), Array(49, 1) _
, Array(50, 1), Array(51, 1), Array(52, 1), Array(53, 1), Array(54, 1), Array(55, 1),
Array(56, 1), Array(57, 1), Array(58, 1), Array(59, 1), Array(60, 1)) _
, TrailingMinusNumbers:=True
'Imem シートに戻る
Sheets("lmem").Select
'MemoryOI データの下方向の終了を決定
b = 3
Do Until lsEmpty(Cells(b, 5))
b = b + 1
Loop
b = b - 1
'MemoryOI データを pro02 にコピー
Range(Cells(2, 5), Cells(b, 6)).Copy
Sheets("pro02"). Select
Cells(2, 1).PasteSpecial Paste:=xlPasteValues
'アドレス列を作成
c = 4
Do Until lsEmpty(Cells(c, 1))
Cells(c, 3) = ("R" & c & "C5")
c = c + 1
Loop
'pro01 シートへ行く
Sheets("pro01").Select
'データセットの下方向の終了を決定
d = 1
Do Until lsEmpty(Cells(d, 1))
Loop
d = d - 1
'初期長さの数を作成
Sheets("pro03").Cells(1, 1) = 1
g = Sheets("pro03").Cells(1,1)
'シート pro01 へ行く
Sheets("pro01").Select
'データセットの右方向の最大長を決定
e = 2
Do Until lsEmpty(Sheets("pro01").Cells(e, 1))
f=1
Do Until lsEmpty(Sheets("pro01").Cells(e, f))
f = f+1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1,1)
End If
e = e + 1
Loop
h = g '右方向の最大長の値
'単語をアドレス番号に置換
k = 4
Do Until lsEmpty(Sheets("pro02").Cells(k, 1))
'アドレス名を定義
i = Sheets("pro02").Cells(k, 3)
'単語名を定義
j = Sheets("pro02").Cells(k, 1)
'単語からアドレスへの実施の置換
Range(Cells(1, 1), Cells(d, h)).Replace What:="" &j &"", Replacements"" & i
& "", LookAt: =xl Whole, Search Order :=xl By Rows
k = k + 1
Loop
'結合アドレス作成
p = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(p, 1))
'pro03 シートの以前の項目を削除
Sheets("pro03").Cells.Delete
'全ての結合アドレスシーケンスを作成
Sheets("pro03").Cells(1 , 1 ) = Sheets("pro01 ").Cells(p, 1 )
m = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(p, m))
Sheets("pro03").Cells(m, 1).FormulaR1 C1 = "='pro03'!R" & m - 1
& "C1 & &'pro01 '!R" & p & "C" & m & ""
m = m + 1
Loop
'データセットの終了を検出
n = 1
Do Until lsEmpty(Sheets("pro03").Cells(n, 1))
n = n + 1
Loop
n = n - 1
'シーケンスを数式から値に変換し、prov01に貼り付ける
Sheets("pro03").Cells(n, 1 ).Copy
Sheets("pro01 ").Cells(p, h + 2).PasteSpecial Paste:=xlPasteValues
p = p + 1
Loop
'結合アドレスのデータセットの終了を検出
q = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(q, h + 2))
q = q + 1
Loop
q = q - 1
'結合アドレスのセットを Imem シートにコピー
Range(Cells(2, h + 2), Cells(q, h + 2)).Copy
Sheets("lmem").Select
Range("C4").Select
ActiveSheet. Paste
End Sub
Sub c_find_2_same_sequence()
'このプログラムセットの中核部!!!
For x = 2 To 1000
y = 2 * x + 3
'pro01 シートの以前の項目を削除
Sheets("pro01 "). Select
Cells.Delete
'pro03 シートの以前の項目を削除
Sheets("pro03"). Select
Cells.Delete
'タイトル "combined" を付加
Cells(1 , 1) = "combined"
'Imem シートに戻る
Sheets("lmem").Select
'C列データ終了の下方向の終了を検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'それを pro01 シートにコピー
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01 "). Select
Range("A1 ").PasteSpecial Paste:=xlPasteValues
'データセットを分割
Selection TextToColumns Destination:=Range("A1 "), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ 
Semicolon :=True, Comma:=True, Space:=True, Other:=True, OtherChar: _
"-", Field lnfo:=Array(Array(1 , 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
TrailingMinusNumbers:=True
'初期の g 値を付加
Sheets("pro03").Cells(1 , 1) = 1
g = Sheets("pro03").Cells(1 , 1)
'データセットの右方向の最大長を決定
e = 2
Do Until lsEmpty(Sheets("pro01").Cells(e, 1))
f=1
Do Until lsEmpty(Sheets("pro01").Cells(e, f))
f = f+1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
'アドレス対を配置
i = 2
Do Until lsEmpty(Sheets("pro01").Cells(i, 1))
t = 1
Do Until lsEmpty(Sheets("pro01").Cells(i, t))
t = t + 1
Loop
t = t - 1
If t > 1 Then
h = 2
Do Until lsEmpty(Sheets("pro01").Cells(i, h))
Cells(i, (g + 2) + (h - 2)) = "=R" & i & "C" & h - 1 & "& &R"
& i & "C" & h & 
h = h + 1
Loop
Else: Cells(i, g + 2) = "zzz"
End If
i = i + 1
Loop
'ヘッダを付加
f=1
Do Until f = g
Cells(1,g + 1 + f) = ""&f&""
f = f+1
Loop
'データセットの下方向の終了を検出
j = 1
Do Until lsEmpty(Cells(j, g+2))
j=j + 1
Loop
j=j - 1
'ピボットテーブル（結合）
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:=_
Array("pro01!R1C"&g + 1 & ":R" &j & "C" &g + 1 + g-1 & "", "Iteml"),
Version:=xlPivotTableVersion14). _
CreatePivotTableTableDestination:="'pro01'!R1C" & g + 1 + g - 1 + 2 &"",
TableName:=_ " PivotTable 1 " , Defau ItVersion : =xl Pi votTableVersion 14
ActiveSheet.PivotTables("PivotTable1").DataPivotField.Pivotltems("Count of
Value").Position = 1
ActiveSheet.PivotTables("PivotTable1").PivotFields("Page1").Orientation =xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation =xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation =xlHidden
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Value")
.Orientation =xlRowField
.Position = 1
End With
'2 つの空の行を削除
Range(Cells(1 , 2 * g + 2), Cells(2, 2 * g + 3)).Delete Shift:=xlUp
'ピボットテーブルの終了を検出
p = 1
Do Until lsEmpty(Sheets("pro01").Cells(p, 2 * g + 3))
p = p + 1
Loop
P = P - 1
If Cells(p, 2 * g + 2) = "Grand Total" Then
p = p-1
Else: p = p
End If
'ピボットテーブルを右側にコピー
If Not Cells(p, 2 * g + 2) = "zzz" Then 
Range(Cells(1 , 2 * g + 2), Cells(p, 2 * g + 3)).Copy
Else: Range(Cells(1 , 2 * g + 2), Cells(p - 1 , 2 * g + 3)).Copy
End If
Cells(1 , 2 * g + 5).Select
ActiveSheet. Paste
Selection. Columns.AutoFit
'降順に並べ替え
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add
Key:=Range(Cells(2, 2 * g g + 6)), SortOn:=xlSortOnValues, Order:=xlDescending,
DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(1 , 2 * g + 5), Cells(p, 2 * g + 6))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
'名前変更
q = 2 * g + 5
'データセットの下方向の終了を検出
aa = 1
Do Until lsEmpty(Cells(aa, q + 1 ))
aa = aa + 1
Loop
aa = aa - 1
'頻度制限の数を定義
w = Sheets("para").Cells(x + 4, 2)
'頻度の X セル未満の開始を見つける
If aa = 2 Then
If w >= 2 Then
If Cells(aa, q + 1 ) <= w - 1 Then
r = 2
Else: r = 3
End If
Else: r = 3
End If
End If
If aa>2 Then
If w>=2 Then
For bb = 1 To aa
If Cells(bb, q + 1) <= w - 1 Then
cc = bb
bb = aa
Else: cc = aa + 1
End If
Next bb
r = cc
Else: r = aa + 1
End If
End If
If r >2 Then
'頻度の X セルの終了を見つける
s = r
Do Until lsEmpty(Cells(s, q + 1))
s = s + 1
Loop
s = s- 1
'不要な頻度を削除
If w>=2 Then
Range(Cells(r, q), Cells(s + 500000, q + 1)).Delete
Shift:=xlUp '<- 50000 は単なる余分のバッファ
End If
'レイヤ ID 検索テーブルのヘッダを付加
Cells(1, q + 3) = "1st C Position"
Cells(1,q+4) = "Space Position"
Cells(1,q +5) = "2nd C Position"
Cells(1, q + 6) = "End Position"
Cells(1,q+7) = "1stlayer#"
Cells(1, q +8) = "2nd Layer#"
'第１行の数式を入力
Cells(2, q+3) = '=Find(""C"", rc[-3], 1)"
Cells(2, q+4) = '=find( ,rc[-4],1)"
Cells(2, q+5) = '=find(""C"",rc[-5],rc[-1])"
Cells(2, q + 6) = '=len(rc[-6])"
Cells(2, q + 7) = '=mid(rc[-7],rc[-4]+1 ,rc[-3]-(rc[-4]+1))
Cells(2, q + 8) = '=mid(rc[-8],rc[-3]+1 ,rc[-2]-rc[-3])"
'データセットの終了を検出
t = 1
Do Until lsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t-1
'第１行を他の行にコピー
If t > 2 Then
Range(Cells(2, q +3), Cells(2, q +8)). Copy
Range(Cells(3, q +3), Cells(t, q +3)).PasteSpecial Paste:=xlAII
End If
'レイヤ番号を数式からテキストに変換
Range(Cells(1, q +7), Cells(t, q +8)).Select
Selection. Copy
Selection. PasteSpecial Paste:=xlPasteValues
'レイヤ番号をテキストから値に変換
Range(Cells(1, q +7), Cells(t, q +7)).Select
Selection TextToColumns Destination:=Cells(1, q +7),
DataType:=xlFixedWidth,_ OtherChar:="-", 
Field lnfo:=Array(0, 1),TrailingMinusNumbers:=True
Range(Cells(1, q +8), Cells(t, q +8)).Select
Selection TextToColumns Destination:=Cells(1, q +8),
DataType:=xlFixedWidth, _ OtherChar:="-",
Field lnfo:=Array(0, 1), TrailingMinusNumbers:=True
'1st layer # で次に 2nd layer# でデータセットを並べ替え
If x > 2 Then
Range(Cells(1, q), Cells(t, q +8)).Select
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add
Key:=Range(Cells(2, q +) , Cells(t, q + 7)), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add
Key:=Range(Cells(2, q +) , Cells(t, q + 8)), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(1 , q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
'1st layer# でより小さいレイヤ番号の終了を検出する
aa = 1
Do Until Cells(aa, q + 7) = 2 * x + 1
aa = aa + 1
If aa = t Then
Cells(aa, q + 7) = 2 * x + 1
End If
Loop
aa = aa - 1
'2nd layer# でより小さいレイヤ番号の終了を検出する
bb = 1
Do Until Cells(bb, q + 8) = 2 * x + 1
bb = bb + 1
If bb = t Then
Cells(bb, q + 8) = 2 * x + 1
End If
Loop
bb = bb - 1
'aa と bb の小さい方を見つける
If aa >= bb Then
cc = bb
Else: cc = aa
End If
'以前のレイヤの行のみを削除する
If Not cc = 1 Then
Range(Cells(2, q), Cells(cc, q + 8)).Delete
End If
'データセットの終了を検出する
t = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(t, q))
t = t + 1
Loop
t = t - 1
'対の回数（対の頻度）によりデータセットを並べ替える
Range(Cells(1 , q), Cells(t, q + 8)).Select
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01 ").Sort.SortFields.Add
Key:=Range(Cells(2, q +), Cells(t, q + 1 )), SortOn:=xlSortOnValues, Order:=xlDescending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01 ").Sort
.SetRange Range(Cells(1 , q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xIPinYin
.Apply
End With
End If
'≪≪≪≪≪≪≪≪
'データセットの終了を検出する
t = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(t, q))
t = t + 1
Loop
t = t - 1
'並べ替えられたテーブルを Imem シートにコピー
Range(Cells(2, q), Cells(t, q + 1 )).Copy
Sheets("lmem").Select
Cells(4, y).Select '< ここ!!!
ActiveSheet. Paste
' ---- 2 つの単語セルを１つに置換するモジュール----
'pro01 シートの以前の項目を削除
Sheets("pro01 "). Select
Cells.Delete
'Imem シートに戻る
Sheets("lmem").Select
'Final Memory (associated) 列のデータセットの終了を決定
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'Final Memory (associated) を pro01 シートにコピー
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01 ").Cells(1 , 1 ).PasteSpecial Paste:=xlPasteValues
'pro01 シートへ行く
Sheets("pro01 "). Select
'列A の列幅を調整
Columns("A:A").Columns.AutoFit
'Imem シートに戻る
Sheets("lmem").Select
'MemoryXX でデータセットの終了を決定
b = 3
Do Until lsEmpty(Sheets("lmem").Cells(b, y)) 
'< 9 は可変でなければならない
b = b + 1
Loop
b = b - 1
'MemoryXX を pro01 シートにコピー
Range(Cells(3, y), Cells(b, y + 1 )).Copy
'< 9 および 10 は可変でなければならない
Sheets("pro01 ").Cells(1 , 3).PasteSpecial Paste:=xlPasteValues
'pro01 シートへ行く
Sheets("pro01 "). Select
'列A の列幅を調整
Columns("C:D").Columns.AutoFit
'タイトルを付加
Cells(1 , 5) = "MemoryXX address"
'MemoryXX 終了の下方向の終了を検出する
c = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(c, 3))
c = c + 1
Loop
c = c - 1
'MemoryXX アドレスを付加
d = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(d, 3))
Cells(d, 5) = "R" & d + 2 & "C" & y & 
'< 9 は可変でなければならない
Loop
'列Aでデータセットの終了を検出する
e = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(e, 1))
e = e + 1
Loop
e = e - 1
'2 つの単語を１つの置換
f = 2
Do Until lsEmpty(Sheets("pro01 ").Cells(f, 5))
g = Sheets("pro01 ").Cells(f, 3)
h = Sheets("pro01 ").Cells(f, 5)
Range("A2:A" & e & ""). Replace What:="" & g & "",
Replacements"" & h & "", LookAt: =xl Part, SearchOrder :=xl By Rows
f = f + 1
Loop
'列Aでデータセットの終了を検出する
i = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(i, 1))
i = i + 1
Loop
i = i - 1
'列A を Imem シートにコピー
Range(Cells(1 , 1 ), Cells(i, 1)).Copy
Sheets("lmem").Select
Range("C3").PasteSpecial Paste:=xlPasteValues
Else: x = 1000
End If
Next x
'Imeme シートに行く
Sheets("lmem").Select
Range("A1 ").Select
End Sub
Sub d_text_to_formula()
' formulatext Macro
For c = 1 To 1000
'場合分け Final memory cooking および Mem02< cooking
If c = 1 Then
d = 3
Else: d = 2 * c + 3
End If
'データセットの終了を検出
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, d))
a = a + 1
Loop
a = a - 1
'space を &" "& で置換
Range(Cells(4, d), Cells(a, d)).Replace What:=" ", Replacement:= "&""&",
LookAt:=xlPart, "SearchOrder:=xlByRows
'pro01 シートの以前の項目を削除
Sheets("pro01 ").Select
Cells.Delete
'Imem データを pro01 シートにコピー
Sheets("lmem").Selec
Range(Cells(3, d), Cells(a, d)).Copy
Sheets("pro01 ").Select Range("A1 ").Select
ActiveSheet. Paste
'列幅を調整
Selection. Columns.AutoFit
'列B にタイトルを付加
Range("B1 ") = "with ="
'データセットの下方向の終了を検出する
b = 1
Do Until lsEmpty(Sheets("pro01 ").Cells(b, 1))
b = b + 1
Loop
b = b - 1
If Not b = 1 Then
'第１の数式を付加
Range("B2").FormulaR1 C1 = "=""=""&RC[-1]"
Range("B2").Copy
Range(Cells(2, 2), Cells(b, 2)).Select
ActiveSheet. Paste
'列B 全体を選択
Columns("B:B").Select
'数式から値へ変換
Selection. Copy
Selection. PasteSpecial Paste:=xlPasteValues
'テキストから新たな数式へ変換
Selection TextToColumns Destination:=Range("B1 "),
DataType:=xlFixedWidth,_ OherChar:- '-", Field lnfo:=Array(0, 1 ),
TrailingMinusNumbers:=True
'新たな数式を Imem シートにコピー
Range(Cells(2, 2), Cells(b, 2)).Copy
Sheets("lmem").Select
Cells(4, d).Select
ActiveSheet. Paste
Else: c = 1000
End If
Next c
'Imem シートに戻る
Sheets("lmem").Select
Range("A1 ").Select
End Sub
Sub e_formula_to_text()
'アドレスを見えるように数式をテキストに変換するモジュール
For b = 1 To 1000
If b = 1 Then
c = 3
Else: c = 2 * b + 3
End If
'データセットの下方向の終了を検出する
a = 3
Do Until lsEmpty(Sheets("lmem").Cells(a, c))
a = a + 1
Loop
a = a - 1
If Not a = 3 Then
'ターゲットのデータセットを選択
Range(Cells(4, c), Cells(a, c)).Select
'セルの内容表示を結果から数式に変更
ActiveWindow.DisplayFormulas = True
' "=" を "(nothing)" で置換
Selection. Replace What:="=", Replacements"", LookAt:=xlPart,
SearchOrder:=xlByRows 
' "=" を "(space)" で置換
Selection. Replace What:= "&"" ""&", Replacements" ", LookAt:=xlPart,
SearchOrder:=xlByRows
'セルの内容を数式から結果に戻す
ActiveWindow.DisplayFormulas = False
Else: b = 1000
End If
Next b
'Imem シートに戻る
Sheets("lmem").Select
Range("A1 ").Select
End Sub
【図１】
2020521408.tif 000004
【図２】
2020521408.tif 000005
【図３】
2020521408.tif 000006
【図４】
2020521408.tif 000007
【図５】
2020521408.tif 000008
【国際調査報告】
2020521408.tif 000009
2020521408.tif 000010