Skip to main content

NLP の実装

Important:

インターシステムズは、InterSystems IRIS® 自然言語処理 (NLP) を非推奨Opens in a new tabにしました。インターシステムズ製品の今後のバージョンから削除される可能性があります。以下のドキュメントは、既存ユーザのみに向けたリファレンスとしています。代替のソリューションを見いだすためのサポートを必要とする既存ユーザはインターシステムズのサポート窓口Opens in a new tabにお問い合わせください。

NLP 意味分析エンジンは、InterSystems IRIS データ・プラットフォームの完全に統合されたコンポーネントです。別途インストールする必要はありません。構成の変更も不要です。

NLP を使用できるかどうかは、InterSystems IRIS ライセンスによって管理されます。ほとんどの標準 InterSystems IRIS ライセンスが NLP へのアクセスを提供しています。NLP をサポートするどの InterSystems IRIS ライセンスでも、NLP の全コンポーネントを制限なしで完全に使用できます。

NLP は、ObjectScript プログラムから呼び出すことが可能なクラス・オブジェクト・メソッドとプロパティを含む API のコレクションとして提供されます。InterSystems IRIS から NLP 処理を呼び出すための API が提供されています (API クラス)。また、SQL (QAPI クラス) と SOAP Web サービス (WSAPI クラス) から NLP 処理を呼び出すための同等の API が提供されています。これらの API は、"インターシステムズ・クラス・リファレンス" の "%iKnow" パッケージで説明されています。NLP は InterSystems IRIS のコア・テクノロジであるため、アプリケーションのようなインタフェースは備えていません。ただし、NLP はいくつかの一般的なサンプル出力インタフェースを %iKnow.UI パッケージで提供しています。

InterSystems IRIS NLP を使用してテキスト・ソースを分析するには、InterSystems IRIS ネームスペースに NLP ドメインを定義し、そのドメインにテキストをロードする必要があります。単一のネームスペースに (複数のコンテキストに対する) 複数のドメインを作成できます。ドメインを作成すると、そこにある一連のテキスト・ソースのインデックスが NLP によって生成されます。すべての NLP クエリと他のテキスト処理では、このデータにアクセスするためのドメインを指定する必要があります。

サンプル・プログラムに関するメモ

このドキュメント内のサンプルの多くで、Aviation.Event SQL テーブルからのデータが使用されています。このサンプル・データを使用する場合、https://github.com/intersystems/Samples-AviationOpens in a new tab で入手できます(GitHub の知識や GitHub アカウントは必要ありません)。 README.md ファイルの内容を確認します。このファイルは、GitHub リポジトリに含まれるファイル名とディレクトリの下に表示されています。README.md ファイルの下部にある “Setup instructions” セクションまでスクロールして、その手順を完了します。

このドキュメントのサンプル・プログラムの多くでは、最初にドメイン (またはそのデータ) を削除してから、元のテキスト・ファイルから空のドメインにすべてのデータをロードしています。これにより、サンプル・プログラムの目的に沿って、NLP がインデックスを作成したソース・データが、ロード元のファイルや SQL テーブルのコンテンツと正確に一致することが保証されます。

この削除および再ロード手法は、多数のテキスト・ソースを処理する実際のアプリケーションには推奨されません。現実のアプリケーションでは、ドメインの全ソースのロードという時間のかかる作業は、一度だけ実行するべきです。その後で個々のソースを追加または削除して、インデックスが作成されたソース・データを元のテキスト・ファイルや SQL テーブルのコンテンツで最新の状態に保つことができます。

%Persistent オブジェクト・メソッドに関するメモ

NLP では、ドメインや構成などのオブジェクト・インスタンスの作成と削除を行うために、標準の %Persistent オブジェクト・メソッドをサポートしています。これらの %Persistent メソッドの名前は、%New()Opens in a new tab などの % 記号で始まります。%Persistent オブジェクト・メソッドの使用は、Create() などの旧式の非永続メソッドを使用する際に推奨されます。新しいコードに対しても、%Persistent オブジェクト・メソッドを使用することをお勧めします。このドキュメント全体を通じたプログラム例は、それら推奨 %Persistent メソッドの使用のために改訂されています。

%New() 永続メソッドでは、%Save() メソッドが必要になることに注意してください。旧式の Create() メソッドでは、個別の保存操作が必要ありません。

%iKnow と %SYSTEM.iKnow に関するメモ

このドキュメント全体で参照されるすべての NLP クラスは %iKnow パッケージ内にあります。ただし、%SYSTEM.iKnowOpens in a new tab クラスには、NLP の一般的な処理のコーディングを簡素化するために使用可能な、複数の NLP ユーティリティも含まれています。これらのユーティリティにはショートカットが作成されているため、%SYSTEM.iKnowOpens in a new tab クラス・メソッドによって実行されるすべてのオペレーションは、%iKnow パッケージ API でも実行できます。

%SYSTEM.iKnowOpens in a new tab クラス・メソッドの情報を表示するには、Help() メソッドを使用します。すべての %SYSTEM.iKnowOpens in a new tab メソッドの情報を表示するには、%SYSTEM.iKnow.Help("") を呼び出します。特定の %SYSTEM.iKnowOpens in a new tab メソッドの情報を表示するには、以下の例に示すように、メソッド名を Help() メソッドに指定します。

  DO ##class(%SYSTEM.iKnow).Help("IndexDirectory")

詳細は、"インターシステムズ・クラス・リファレンス" を参照してください。

必要なディスク容量と NLP グローバル

ネームスペースの NLP グローバルは ^IRIS.IK という接頭語を持ちます。

  • ^IRIS.IK.* は最終グローバルで、NLP データを含む永続的グローバルです。この NLP データは、元のソース・テキストの約 20 倍のサイズになります。

  • ^IRIS.IKS.* はステージング・グローバルです。データのロード時に、これは元のソース・テキストの 16 倍のサイズに増大する可能性があります。ステージング・グローバルは、ジャーナルされていないデータベースにマッピングしてください。ソースのロードと処理が完了すると、NLP はこれらのステージング・グローバルを自動的に削除します。

  • ^IRIS.IKT.* は一時グローバルです。データのロード時に、これは元のソース・テキストの 4 倍のサイズに増大する可能性があります。一時グローバルは、ジャーナルされていないデータベースにマッピングしてください。ソースのロードと処理が完了すると、NLP はこれらの一時グローバルを自動的に削除します。

  • ^IRIS.IKL.* はログ・グローバルです。これらはオプションで、無視できるほど小さなサイズです。

Caution:

これらのグローバルは内部使用専用です。いかなる場合も、NLP ユーザは NLP グローバルとの直接の対話を試みてはいけません。

例えば、30GB のソース・ドキュメントをロードする場合は、NLP の永続的なデータ ストレージでは 600GB が必要になります。データのロード時には、1.17TB の使用可能なスペースが必要で、そのうちの 600GB が NLP によるインデックス作成の完了時に自動解放されます。

さらに、Mgr ディレクトリの iristemp サブディレクトリは、ファイルのロード時およびインデックス作成時に元のソース・テキストの 4 倍のサイズに増大する可能性があります。

元のソース・テキストのサイズに基づいて、InterSystems IRIS のグローバル・バッファのサイズを増やす必要があります。詳細は、このドキュメントの “テキスト・ロード時のパフォーマンスに関する考慮事項” の章を参照してください。

バッチ・ロードのスペース割り当て

InterSystems IRIS では、ソース・テキストのバッチ・ロードを処理するために、各 NLP ジョブに 256MB の追加メモリが割り当てられます。既定では、NLP によってシステム上の各プロセッサ・コアにジョブが 1 つ割り当てられます。$$$IKPJOBS ドメイン・パラメータでは NLP ジョブの数を設定し、通常は既定の設定で最適な結果が示されます。ただし、NLP ジョブの最大数は、16 またはプロセッサ・コアの数のうち小さいほうにすることをお勧めします。

入力データ

NLP は構造化されていないデータの分析に使用されます。一般的には、このデータは複数のテキスト・ソース (多くの場合は多数のテキスト) から構成されます。テキスト・ソースは以下のような任意のタイプにすることが可能です。

  • 構造化されていないテキスト・データを含むディスク上のファイル (例 : txt ファイル)。

  • 構造化されていないテキスト・データを含む 1 つ以上のフィールドを持つ SQL 結果セットのレコード。

  • 構造化されていないテキスト・データを含む RSS Web フィード。

  • 構造化されていないテキスト・データを含む InterSystems IRIS グローバル。

NLP は元のテキスト・ソースの変更や、これらのテキスト・ソースのコピーの作成は行いません。NLP はその代わりに、元のテキスト・ソースの分析結果を正規化およびインデックス付けされた項目として格納し、それぞれの項目に ID を割り当てます。この ID によって、NLP はそのソースを参照できます。ソース、文、パス、CRC、およびエンティティの各レベルで、別個の ID が項目に割り当てられます。

NLP は、Czech/cs (チェコ語)、Dutch/nl (オランダ語)、English/en (英語)、French/fr (フランス語)、German/de (ドイツ語)、Japanese/ja (日本語)、Portuguese/pt (ポルトガル語)、Russian/ru (ロシア語)、Spanish/es (スペイン語)、Swedish/sv (スウェーデン語)、および Ukrainian/uk (ウクライナ語) のテキストをサポートしています。テキストに含まれる言語を指定する必要はありません。また、すべてのテキストや個々のテキストのすべての文が同じ言語である必要もありません。NLP は各テキストの各文の言語を自動的に識別できます。そして、その文に適した言語モデルを適用します。テキストが含む言語および自動言語識別の実行可否を指定する NLP 構成を定義できます。NLP 構成を使用することで、NLP のパフォーマンスを大幅に向上させることができます。

テキスト・コンテンツの種類 (例 : 医師の診断書、新聞記事など) を指定する必要はありません。NLP は、あらゆるコンテンツ・タイプのテキストを自動的に処理します。

ファイル形式

NLP はあらゆる拡張子 (接尾語) を持つあらゆる形式のソース・ファイルを受け入れます。既定では、ソース・テキスト・ファイルはフォーマットされていないテキスト (例 : .txt ファイル) から構成されていると想定されます。他の形式のソース・ファイル (.rtf、.doc など) も処理されますが、一部のフォーマット要素がテキストとして処理される可能性があります。これを回避するために、ソース・ファイルを .txt ファイルに変換してこれらの .txt ファイルをロードするか、NLP コンバータを作成して NLP ロード時にソース・テキストからフォーマットを除去することができます。

ファイル拡張子のリストを リスタ・パラメータとして指定します。すると、これらの拡張子を持つファイルのみがロードされます。例えば、このファイル拡張子のリストは、AddListToBatch() メソッド・パラメータとして指定できます。

SQL レコード形式

NLP は SQL 結果セットのレコードをソースとして受け入れます。NLP は NLP ソース ID として各レコードに一意の整数値を生成します。NLP では一意の値を含む SQL フィールドを指定でき、NLP はこれを使用してソース・レコードの外部 ID を作成します。NLP ソース ID と外部 ID は、しばしば両方とも一意の整数値になりますが、NLP ソース ID は NLP によって割り当てられ、外部 ID ではないことに注意してください。一般的に、NLP ソース・テキストは結果セット・レコードのフィールドの一部のみ (多くの場合、構造化されていないテキスト・データを含む 1 つのフィールド) から取得されます。レコードの他のフィールドは無視できます。または、それらの値をメタデータとして使用してフィルタ処理 (包含または除外) したり、ソースにアノテーションを付けることもできます。

テキストの正規化

NLP は元のソース・テキストへのリンクを維持します。これにより、元の大文字の使用や句読点などのままで文を返すことが可能となっています。NLP 内では、マッチングを容易にするために、エンティティに対して以下のような正規化処理が実行されます。

  • 大文字と小文字は区別されません。NLP マッチングでは大文字と小文字が区別されません。エンティティ値は、すべて小文字で返されます。

  • 余分な空白は無視されます。NLP はすべての単語を 1 つの空白で区切られているものとして扱います。

  • 複数のピリオド (...) は 1 つのピリオドに削減され、このピリオドは NLP によって文の終了文字として扱われます。

  • ほとんどの句読点は、文、概念、関係を識別するために言語モデルで使用された後で破棄されて、さらなる分析からは除外されます。句読点は一般的にエンティティ内に保持されません。ほとんどの句読点は、句読点記号の前または後に空白がない場合のみ、エンティティに保持されます。ただし、スラッシュ (/) およびアット記号 (@) は、前後の空白の有無に関係なく、エンティティに保持されます。

  • 特定の言語特有文字は正規化されます。例えば、ドイツ語の eszett (ß) 文字は “ss” として正規化されます。

NLP エンジンは、ソース・テキストのインデックスが作成されると、自動的にテキスト正規化を実行します。また、NLP は自動的にディクショナリの項目や用語のテキスト正規化を実行します。

また、いずれの NLP データ・ロードにも依存せずに文字列の NLP テキスト正規化を実行するには、Normalize()Opens in a new tab または NormalizeWithParams()Opens in a new tab メソッドを使用できます。詳細は、以下の例を参照してください。

   SET mystring="Stately plump Buck Mulligan   ascended the StairHead,  bearing a shaving bowl"
   SET normstring=##class(%iKnow.Configuration).NormalizeWithParams(mystring)
   WRITE normstring

ユーザ定義のソースの正規化

ユーザはソースの正規化を行うために何種類かのツールを定義できます。

  • コンバータは、ロード時にソース・テキストを処理してフォーマット・タグや他のテキスト以外のコンテンツを除去します。

  • UserDictionary では、ロード時に特定の入力テキスト・コンテンツ要素を書き換える方法または使用する方法についてユーザが指定できます。例えば、UserDictionary では、既知の省略形や頭文字の置換を指定できます。これは変形や同義語を除去することでテキストを標準化するためによく使用されます。また、NLP による標準の句読点処理に対するテキスト固有の例外を指定するためにも使用できます。

出力構造

NLP は、その処理の結果を格納するためにグローバル構造を作成します。これらのグローバル構造は、NLP クラス API のみによって使用されることを意図されています。ユーザがこれらを見ることはできず、ユーザがこれらを変更することはできません。

NLP がインデックスを作成したデータは、InterSystems IRIS リスト構造として格納されます。各 NLP リスト構造には、その項目に対して生成された ID (一意の整数値) が含まれます。NLP エンティティには、値または整数値の ID によってアクセスできます。

NLP はインデックス付けされたエンティティ間の関係を保持して、各エンティティが関連するエンティティ、そのエンティティ・シーケンスのパス、そのパスを含む元の文、およびソース・テキスト内でのその文の位置を参照できるようにしています。元のソース・テキストには、常に NLP からアクセスできます。NLP の処理によって元のソース・テキストが変更されることは一切ありません。

定数

NLP は %IKPublic.inc ファイルに定数値を定義します。以下の例に示されているように、このインクルード・ファイルを指定した後で、$$$ マクロ呼び出しを使用して、これらの定数を呼び出すことができます。

#include %IKPublic
  WRITE "The $$$FILTERONLY constant=",$$$FILTERONLY

これらの定数には、ドメイン・パラメータ名、クエリ・パラメータ値、および他の定数が含まれます。

エラー・コード

一般的なエラー・コードの 8000 ~ 8099 は、NLP での使用に予約されています。詳細は、"InterSystems IRIS エラー・リファレンス" の "一般的なエラー・メッセージ" を参照してください。

FeedbackOpens in a new tab