手動による NLP 環境の作成
インターシステムズは、InterSystems IRIS® 自然言語処理 (NLP) を非推奨Opens in a new tabにしました。インターシステムズ製品の今後のバージョンから削除される可能性があります。以下のドキュメントは、既存ユーザのみに向けたリファレンスとしています。代替のソリューションを見いだすためのサポートを必要とする既存ユーザはインターシステムズのサポート窓口Opens in a new tabにお問い合わせください。
ドメイン・アーキテクトを使用して InterSystems NLP ドメインを作成または編集するときは、InterSystems NLP によって 3 つのオブジェクトのインスタンスが自動的に作成されます。これら 3 つのオブジェクトをまとめて、テキスト・ソースをロードする環境を定義します。これらのオブジェクトは以下のとおりです。
-
ドメイン : InterSystems NLP によるオペレーションで使用する論理空間を確立します。ドメインの指定は必須です。
-
構成 : ソース・ドキュメント・コンテンツのための言語環境を確立します。構成の指定はオプションです。ドメインを指定しない場合のために、InterSystems NLP には既定値が用意されています。ドメイン・アーキテクトでは、ドメインの言語環境を定義できます。この章では、追加の機能およびオプションと共に、ドメイン非依存の構成を作成する方法について説明します。
-
ユーザ・ディクショナリ : ソース・テキストを InterSystems NLP にロードするときに適用する代入と置き換えのカスタム・セットを確立します。ユーザ・ディクショナリは、例えば意味的属性マーカやフィールド固有のコンセプトとして文字列を特定することで、エンジンの既定の動作を拡張します。1 つ以上の構成にユーザ・ディクショナリが提供されます。ユーザ・ディクショナリの指定は任意です。指定しない場合、ユーザ・ディクショナリは使用されません。
これらのオブジェクトのインスタンスを手動で作成することで InterSystems NLP 環境を作成することもできます。ドメイン、構成、およびユーザ・ディクショナリの複数のインスタンスを作成できます。これらの環境オブジェクトは互いに依存しておらず、特定セットのソース・データに依存することもありません。
このページでは、ドメイン、構成、およびユーザ・ディクショナリのオブジェクトについて詳しく説明し、これらのオブジェクトを使用して InterSystems NLP 環境を手動で作成する方法を説明します。
NLP ドメイン
InterSystems NLP のすべてのオペレーションはドメイン内部で発生します。ドメインは、InterSystems IRIS® データ・プラットフォームのネームスペースの中で InterSystems NLP によって定義したユニット (単位) です。InterSystems NLP が使用するすべてのソース・データは、ドメインにリストされ、ロードされます。1 つのネームスペースに複数のドメインを設定できます。
ネームスペースの作成時にそれが別のネームスペースからコピーされた場合、それらのネームスペース間でドメインが共有されます。ネームスペースを作成するときには、ドメインがそのネームスペースで一意になるように、グローバルの新しいデータベースを作成する必要があります。
InterSystems NLP ドメインは以下の 3 つの方法で、定義、変更および削除できます。
-
ドメイン・アーキテクトを使用したドメインの定義。これは、ドメインを定義して、そのドメインの言語、メタデータ、およびロードするデータを指定するための最も簡単な方法です。
-
%iKnow.DomainDefinitionOpens in a new tab のサブクラスとしてのドメインの定義。このオプションは、ドメインを定義して、そのドメインの構成設定、メタデータ、およびロードするデータを指定するための強力で完全な機能を備えた方法になります。
-
%iKnow.DomainOpens in a new tab クラス・メソッドおよびプロパティを使用したプログラムによるドメインの定義。
DomainDefinition を使用したドメインの定義
%iKnow.DomainDefinitionOpens in a new tab から継承したクラスを作成およびコンパイルすると、そのクラスのドメイン XData ブロックで XML 表現によって指定した設定に対応する InterSystems NLP ドメインがコンパイラによって自動的に作成されます。ユーザは、ドメイン・パラメータ、メタデータ・フィールド定義、割り当て済みの構成などの静的要素を指定できます。これらはすべてコンパイル時に自動的に作成されます。また、ユーザは、ドメインにロードするテキスト・データのソースを指定することも可能です。InterSystems IRIS は、このソース情報を使用して、[classname].Domain という新しいクラスに専用の %Build() メソッドを生成します。この %Build() メソッドを使用して、指定されたデータをこのドメインにロードできます。
以下に、この種のドメイン定義の例を示します。
Class Aviation.MyDomain Extends %iKnow.DomainDefinition
{
/// An XML representation of the domain this class defines.
XData Domain [ XMLNamespace = "http://www.intersystems.com/iknow" ]
{
<domain name="AviationEvents">
<parameter name="Status" value="1" />
<configuration name="MyConfig" detectLanguage="1" languages="en,es" />
<parameter name="DefaultConfig" value="MyConfig" />
<metadata>
<field name="EventDate" dataType="DATE"/>
<field name="Type" dataType="STRING" />
</metadata>
<data dropBeforeBuild="true">
<files path="C:\MyDocs\" encoding="utf-8" recursive="1" extensions="txt"
configuration="MyConfig" />
<query sql="SELECT %ID,EventDate,Type,NarrativeFull
FROM Aviation.Event"
idField="ID" groupField="ID" dataFields="NarrativeFull"
metadataFields="EventDate,Type" metadataColumns="EventDate,Type" />
</data>
</domain>
}
}
コンパイル時、この定義はドメイン "AviationEvents" (Status パラメータを 1 に設定) および 2 つのメタデータ・フィールドを作成します。これは、英語 (en) およびスペイン語 (es) のテキストを処理する構成 "MyConfig" を定義し、上記のドメインに割り当てます。
この定義は、ロードするファイルをこのドメインに指定します。テキスト (.txt) ファイルが C:\MyDocs\ ディレクトリからロードされ、InterSystems SQL データが Aviation.Event テーブルからロードされます。詳細は、%iKnow.Model.listFilesOpens in a new tab クラス・プロパティおよび %iKnow.Model.listQueryOpens in a new tab クラス・プロパティを参照してください。
依存クラス Aviation.MyDomain.Domain の %Build()Opens in a new tab メソッドが生成されます。このメソッドには、C:\MyDocs ディレクトリおよび Aviation.Event テーブルからデータをロードするロジックがあります。
指定したテキスト・データ・ソースをドメインにロードするには、以下のように行います。
SET stat=##class(Aviation.MyDomain).%Build()
%Build() を使用後には、以下のようにエラーをチェックできます。
DO $SYSTEM.iKnow.ListErrors("AviationEvents",0)
これにより、3 タイプのエラー (エラー、障害のあるソース、警告) がリストされます。
現在のネームスペースで定義されたドメイン、および各ドメインに対してロードされたソースの数を表示するには、以下のようにします。
DO $SYSTEM.iKnow.ListDomains()
このドメインに対して定義されたメタデータ・フィールドを表示するには、以下のようにします。
DO $SYSTEM.iKnow.ListMetadata("AviationEvents")
InterSystems NLP では、すべてのドメインに 1 つのメタデータ・フィールド (DateIndexed) を割り当てます。追加のメタデータ・フィールドも定義することができます。
このドメイン定義で、<matching> 要素を指定できます。<matching> 要素は、ディクショナリ情報を記述し、ロードしたソースをこれらのディクショナリに自動的にマッチングするかどうかを指定します。InterSystems IRIS は、クラスのコンパイル中にこれらのオブジェクトに関して基本的な検証を実行しますが、これらのオブジェクトが %Build() メソッドの一部としてロードされるため、実行時にのみ名前の重複が発生します。詳細は、%iKnow.Model.matchingOpens in a new tab クラス・プロパティを参照してください。
このドメイン定義で、<metrics> 要素を指定できます。<metrics> 要素は、カスタム・メトリックをドメインに追加します。%iKnow.Metrics.MetricDefinition.Register() を呼び出す必要はありません。これは、コンパイル時にドメイン定義のコードで自動的に実行されます。詳細は、%iKnow.Model.metricsOpens in a new tab クラス・プロパティを参照してください。
プログラムによるドメインの定義
クラス・メソッドを使用して新規ドメインを定義するには、%iKnow.Domain.%New() 永続メソッドを呼び出して、ドメイン名をメソッド・パラメータとして指定します。ドメイン名には、任意の有効な文字列を指定できます。ドメイン名では、大文字と小文字は区別されません。このドメインに割り当てる名前は、現在のネームスペースで一意のものでなければなりません。このメソッドは、InterSystems IRIS インスタンスの全ネームスペースで一意であるドメイン・オブジェクト参照 (oref) を返します。%Save() メソッドを使用して、このインスタンスを永続的に保存する必要があります。ドメインの ID プロパティ (整数値) は、以下の例で示すように、インスタンスを永続オブジェクトとして保存するまで定義されません。
CreateDomain
SET domOref=##class(%iKnow.Domain).%New("FirstExampleDomain")
WRITE "Id before save: ",domOref.Id,!
DO domOref.%Save()
WRITE "Id after save: ",domOref.Id,!
CleanUp
DO ##class(%iKnow.Domain).%DeleteId(domOref.Id)
WRITE "All done"
NameIndexExists()Opens in a new tab を使用して、ドメインが既に存在しているかどうかを確認します。ドメインが存在する場合、NameIndexOpen()Opens in a new tab を使用して、そのドメインを開きます。ドメインが存在しない場合は、%New() を使用してドメインを作成した後、%Save() を使用します。
以下の例では、ドメインが存在するかどうかをチェックします。ドメインが存在しない場合は、プログラムによって作成されます。ドメインが存在する場合は、それが開かれます。デモンストレーションのため、このプログラムでは、ランダムにドメインが削除されたり削除されなかったりします。
DomainCreateOrOpen
SET domn="mydomain"
IF (##class(%iKnow.Domain).NameIndexExists(domn))
{ WRITE "The ",domn," domain already exists",!
SET domo=##class(%iKnow.Domain).NameIndexOpen(domn)
SET domId=domo.Id
}
ELSE {
SET domo=##class(%iKnow.Domain).%New(domn)
DO domo.%Save()
SET domId=domo.Id
WRITE "Created the ",domn," domain",!
WRITE "with domain ID ",domId,! }
ContainsData
SET x=domo.IsEmpty()
IF x=1 {WRITE "Domain ",domn," contains no data",!}
ELSE {WRITE "Domain ",domn," contains data",!}
CleanupForNextTime
SET rnd=$RANDOM(2)
IF rnd {
SET stat=##class(%iKnow.Domain).%DeleteId(domId)
IF stat {WRITE "Deleted the ",domn," domain" }
ELSE { WRITE "Domain delete error:",stat }
}
ELSE {WRITE "No delete this time" }
ドメインを作成または開く %iKnow.DomainOpens in a new tab クラス・メソッドは、出力 %Status パラメータと共に提供されます。このパラメータは、現在のシステムに InterSystems NLP へのライセンス・アクセスがないために、InterSystems NLP ドメインを作成することや開くことができない場合に設定されます。
ドメイン・パラメータの設定
さまざまな InterSystems NLP オペレーションの動作をドメイン・パラメータで制御します。個々のパラメータは、該当する場所に記載されています。使用可能なすべてのドメイン・パラメータは、付録 “ドメイン・パラメータ” を参照してください。
以下の例のドメイン・パラメータは、パラメータ名 (FullMatchOnly など) ではなく、マクロ・パラメータ ($$$IKPFULLMATCHONLY など) によって参照されます。プログラミングの方法としては、パラメータ名ではなく、このような %IKPublic マクロを使用することをお勧めします。
すべてのドメイン・パラメータに既定値が取得されています。一般的に、InterSystems NLP では、任意のドメイン・パラメータを特に設定しなくても最適な結果が得られます。InterSystems NLP では以下のように各パラメータの値が決まります。
-
現在のドメインのパラメータ値を指定している場合は、その値が使用されます。データをドメインにロードする前にのみ設定可能なパラメータと、常時設定可能なパラメータがあることに注意します。IsEmpty()Opens in a new tab メソッドを使用することで、データが現在のドメインにロードされているか判断できます。
-
システム全体のパラメータ値を指定している場合は、その値がすべてのドメインの既定値として使用されますが、ドメイン固有の値が設定されているドメインはその対象外となります。
-
ドメイン・レベルでもシステム・レベルでもパラメータの値を指定していない場合、InterSystems NLP ではそのパラメータの既定値が使用されます。
現在のドメインのパラメータ設定
ドメインを作成すると、SetParameter()Opens in a new tab インスタンス・メソッドを使用して、個々のドメインのドメイン・パラメータを設定できます。SetParameter() によって、指定したパラメータが有効で設定されていたことを示すステータスが返されます。GetParameter()Opens in a new tab によって、パラメータ値とそのパラメータが設定されていたレベル (DEFAULT、DOMAIN または SYSTEM) が返されます。GetParameter() は、パラメータ名の有効性をチェックすることなく、ドメイン・レベルまたはシステム・レベルで設定されている際に識別できないすべてのパラメータ名に対して DEFAULT を返すことに注意します。
以下の例では、SortField ドメイン・パラメータの既定値を取得し、現在のドメインにそのパラメータを設定してから、設定した値と設定された時点でのレベル (DOMAIN) を取得します。
#include %IKPublic
DomainCreate
SET domn="paramdomain"
SET domo=##class(%iKnow.Domain).%New(domn)
WRITE "Created the ",domn," domain",!
DO domo.%Save()
DomainParameters
SET sfval=domo.GetParameter($$$IKPSORTFIELD,.sf)
WRITE "SortField before SET=",sfval," ",sf,!
IF sfval=0 {WRITE "changing SortByFrequency to SortBySpread",!
SET stat=domo.SetParameter($$$IKPSORTFIELD,1)
IF stat=0 {WRITE "SetParameter failed" QUIT} }
WRITE "SortField after SET=",domo.GetParameter($$$IKPSORTFIELD,.str)," ",str,!!
CleanupForNextTime
SET stat=##class(%iKnow.Domain).%DeleteId(domo.Id)
IF stat {WRITE "Deleted the ",domn," domain" }
ELSE { WRITE "Domain delete error:",stat }
システム全体のパラメータの設定
SetSystemParameter()Opens in a new tab メソッドを使用して、すべてのドメインのドメイン・パラメータをシステム全体で設定できます。このメソッドを使用して設定したパラメータは、その時点で、すべてのネームスペースにおける既存およびそれ以降に作成されるすべてのドメインの既定パラメータ値となります。このシステム全体の既定値は、SetParameter()Opens in a new tab インスタンス・メソッドを使用して、個々のドメインについてオーバーライドされます。
ドメイン・パラメータがシステムの既定として設定されているかどうかを確認するには、GetSystemParameter()Opens in a new tab メソッドを使用できます。システム全体のパラメータの初期値は常に NULL 文字列です (既定値なし)。
ドメイン・パラメータのシステム全体の既定の設定を削除する場合は、UnsetSystemParameter()Opens in a new tab メソッドを使用します。システム全体のパラメータ設定が設定された後、新しい値に設定するには、まず設定を解除する必要があります。設定を解除するパラメータに既定値がなかった場合でも、UnsetSystemParameter() はステータス 1 (成功) を返します。
以下の例では、FullMatchOnly のシステム全体のパラメータ値を設定します。システム全体の既定値が設定されていない場合、プログラムによってこのシステム全体のパラメータが設定されます。システム全体の既定値が設定されている場合は、このシステム全体のパラメータが設定解除された後で設定されます。
#include %IKPublic
SystemwideParameterSet
/* Initial set */
SET stat=##class(%iKnow.Domain).SetSystemParameter($$$IKPFULLMATCHONLY,1)
IF stat=1 {
WRITE "FullMatchOnly set system-wide to: "
WRITE ##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!
QUIT }
ELSE {
/* Unset and Reset */
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
IF stat=1 {
SET stat=##class(%iKnow.Domain).SetSystemParameter($$$IKPFULLMATCHONLY,1)
IF stat=1 {
WRITE "FullMatchOnly was unset system-wide",!,"then set to: "
WRITE ##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!!
GOTO CleanUpForNextTime }
ELSE {WRITE "System Parameter set error",stat,!}
}
ELSE {WRITE "System Parameter set error",stat,!}
}
CleanUpForNextTime
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
IF stat '=1 {WRITE " Unset error status:",stat}
以下の例は、システム全体のパラメータ値を設定するとすぐに、すべてのドメインについてそのパラメータ値が設定されることを示しています。システム全体のパラメータ値を設定した後、個々のドメインについてこの値をオーバーライドできます。
#include %IKPublic
SystemwideParameterUnset
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
WRITE "System-wide setting FullMatchOnly=",##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!!
Domain1Create
SET domn1="mysysdomain1"
SET domo1=##class(%iKnow.Domain).%New(domn1)
DO domo1.%Save()
SET dom1Id=domo1.Id
WRITE "Created the ",domn1," domain ",dom1Id,!
WRITE "FullMatchOnly=",domo1.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!!
SystemwideParameterSet
SET stat=##class(%iKnow.Domain).SetSystemParameter($$$IKPFULLMATCHONLY,1)
IF stat=0 {WRITE "SetSystemParameter failed" QUIT}
WRITE "Set system-wide FullMatchOnly=",##class(%iKnow.Domain).GetSystemParameter($$$IKPFULLMATCHONLY),!!
Domain2Create
SET domn2="mysysdomain2"
SET domo2=##class(%iKnow.Domain).%New(domn2)
DO domo2.%Save()
SET dom2Id=domo2.Id
WRITE "Created the ",domn2," domain ",dom2Id,!
WRITE "Domain setting FullMatchOnly=",domo2.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!!
DomainParameters
WRITE "New domain ",dom2Id," FullMatchOnly=",domo2.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!
WRITE "Existing domain ",dom1Id," FullMatchOnly=",domo1.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!!
OverrideForOneDomain
SET stat=domo1.SetParameter($$$IKPFULLMATCHONLY,0)
IF stat=0 {WRITE "SetParameter failed" QUIT}
WRITE "Domain override FullMatchOnly=",domo1.GetParameter($$$IKPFULLMATCHONLY,.str)," ",str,!
CleanupForNextTime
SET stat=##class(%iKnow.Domain).%DeleteId(dom1Id)
SET stat=##class(%iKnow.Domain).%DeleteId(dom2Id)
SET stat=##class(%iKnow.Domain).UnsetSystemParameter($$$IKPFULLMATCHONLY)
ドメインへの割り当て
ドメインを作成し、そのドメイン・パラメータを指定 (オプション) すれば、各種コンポーネントをそのドメインに割り当てることができます。
-
ソース・データ : ドメインの作成後、通常はいくつかの (大概は大量の) テキスト・ソースをドメインにロードすることになります。これにより、InterSystems NLP がインデックスを作成したデータがドメイン内に生成されます。テキスト・ソースのロードは、ほとんどの InterSystems NLP オペレーションで必要になる前提条件です。ファイル、SQL フィールドおよびテキスト文字列を含む、各種のテキスト・ソースがサポートされています。データ型 %String または %Stream.GlobalCharacter (文字ストリーム・データ) の SQL フィールドを指定できます。InterSystems NLP によってデータ・ソースのインデックスが作成されれば、以降のオペレーションに影響することなく、元のデータ・ソースを削除できます。データ・ソースの変更は、InterSystems NLP のオペレーションに影響しませんが、そのデータ・ソースをリロードして、インデックス付きのデータをドメインで更新した場合は例外です。
-
フィルタ : ドメインの作成後、必要に応じて、そのドメインに 1 つまたは複数のフィルタを作成できます。フィルタでは、ロードされたソースのいくつかをクエリから除外するために使用する条件を指定します。したがって、フィルタを使用すると、ドメインにロードしたデータのサブセットに対して InterSystems NLP オペレーションを実行できます。
-
メタデータ : ドメインの作成後、必要に応じて、ソースをフィルタ処理するための条件として使用できるメタデータ・フィールドを 1 つまたは複数指定できます。メタデータ・フィールドは、インデックスが作成されていないデータであるソースに関連付けたデータです。例えば、テキスト・ソースがロードされた日時は、そのソースのメタデータ・フィールドです。メタデータ・フィールドは、テキスト・ソースをドメインにロードする前に定義する必要があります。
-
skiplist : ドメインの作成後、必要に応じて、そのドメインに 1 つまたは複数の skiplist を作成できます。skiplist は、クエリから返されることを望まないエンティティ (単語や語句など) のリストです。したがって、skiplist を使用すると、ドメインにロードしたデータ・ソースにある特定のデータ・エンティティを無視する InterSystems NLP オペレーションを実行できます。
-
スマート・マッチング・ディクショナリ : ドメインの作成後、必要に応じて、そのドメインに 1 つまたは複数のスマート・マッチング・ディクショナリを作成できます。ディクショナリには、インデックス付きのデータとの照合に使用されるエンティティが記述されています。
これらのコンポーネントは、各種の InterSystems NLP クラスおよびメソッドを使用して定義します。InterSystems IRIS ドメイン・アーキテクトを使用して、メタデータ・フィールドを定義したり、ソースをロードしたり、skiplist やディクショナリを定義したりすることもできます。
メタデータ・フィールドは、ソースをロードする前に定義する必要があります。フィルタ、skiplist およびディクショナリは、いつでも定義または変更することができます。
ドメインからの全データの削除
元のソース・テキストの削除または変更が、そのテキストから InterSystems NLP ドメインにリストおよびロードされたソース・データに影響を及ぼすことはありません。インデックス作成済みのソース・セットへのソースの追加や削除は、明示的に行う必要があります。
%DeleteId() 永続メソッドでは、ドメインとそのドメインにリストおよびロードされた全ソース・データを削除します。また、DropData()Opens in a new tab メソッドを使用すると、ドメイン自体を削除せずに、そのドメインにロードされた全ソース・データを削除できます。いずれのメソッドでもインデックスが作成された全ソース・データが削除され、新しいデータ・ソース・セットを使用して初めからやり直すことが可能になります。
膨大な数のソースを含んだドメインを削除する場合は、%DeleteId() を使用してドメインを削除する前に、DropData() を使用してデータを削除します。%DeleteId() を使用して、データを内包させたままドメインを削除する場合、InterSystems IRIS はデータ削除を行いますが、ジャーナリングが無効化されているときにおいても、それぞれのデータ削除についてジャーナリングを実行します。データを削除してからのドメイン削除によって、これらの大規模ジャーナル・ファイルの生成を防ぎます。
IsEmpty()Opens in a new tab メソッドを使用することで、データがドメインにロードされているか判断できます。
以下の例は、ドメインからのデータの削除を示しています。指定のドメインが存在しない場合は、プログラムによってそのドメインが作成されます。指定のドメインが存在する場合、プログラムがデータの存在をテストします。ドメインにデータが存在する場合は、プログラムによりそのドメインが開かれて、データが削除されます。
DomainCreateOrOpen
SET dname="mytestdomain"
IF (##class(%iKnow.Domain).NameIndexExists(dname))
{ WRITE "The ",dname," domain already exists",!
SET domoref=##class(%iKnow.Domain).NameIndexOpen(dname)
IF domoref.IsEmpty() {GOTO RestOfProgram}
ELSE {GOTO DeleteData }
}
ELSE
{ WRITE "The ",dname," domain does not exist",!
SET domoref=##class(%iKnow.Domain).%New(dname)
DO domoref.%Save()
WRITE "Created the ",dname," domain with domain ID ",domoref.Id,!
GOTO RestOfProgram }
DeleteData
SET stat=domoref.DropData()
IF stat { WRITE "Deleted the data from the ",dname," domain",!
GOTO RestOfProgram }
ELSE { WRITE "DropData error",!
QUIT}
RestOfProgram
WRITE "The ",dname," domain contains no data"
全ドメインのリスト
すべてのネームスペースにおける現在のすべてのドメインをリストするには、GetAllDomainsOpens in a new tab クエリを使用できます。詳細は、以下の例を参照してください。
SET stmt=##class(%SQL.Statement).%New()
SET status=stmt.%PrepareClassQuery("%iKnow.Domain","GetAllDomains")
IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
SET rset= stmt.%Execute()
WRITE !,"Domains in all namespaces",!
DO rset.%Display()
domainId:domainName:namespace:version という形式を使用して、各ドメインが別々の行にリストされます。
VersionOpens in a new tab プロパティは、ドメインの作成時に使用された InterSystems NLP データ構造のバージョンを示す整数になっています。システム・バージョン番号は、InterSystems NLP データ構造の変更がリリースにある場合に変更されます。したがって、InterSystems IRIS の新しいバージョンや新規 InterSystems NLP 機能の導入では、システム・バージョン番号が変わらない場合があります。ドメインの Version プロパティの値が現行の InterSystems NLP システム・バージョンではない場合、ドメインをアップグレードして InterSystems NLP の最新機能を利用することになります。詳細は、“InterSystems NLP の実装” のページの "NLP データ・アップグレード・ユーティリティ" を参照してください。
既定では、GetAllDomains は、全ネームスペースの現在のドメインをすべてリストします。以下の例に示されているように、%Execute() でブーリアン引数を指定して、現在のネームスペースにドメインのリストを制限できます。
SET stmt=##class(%SQL.Statement).%New()
SET status=stmt.%PrepareClassQuery("%iKnow.Domain","GetAllDomains")
IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
SET rset= stmt.%Execute(1)
WRITE !,"Domains in all namespaces",!
DO rset.%Display()
ブーリアン値の 1 を指定すると、現在のネームスペースのドメインにリストが制限されます。ブーリアン値の 0 (既定値) を指定すると、全ネームスペースの全ドメインがリストされます。(メモ : リストされる Version プロパティ値は現在のドメイン以外では正しくない場合があります。)
以下を使用すると、現在のネームスペースのすべてのドメインをリスト表示できます。
DO ##class(%SYSTEM.iKnow).ListDomains()
ドメイン名の変更
以下の例に示すように、Rename()Opens in a new tab クラス・メソッドを使用して、現在のネームスペース内の既存ドメインの名前を変更できます。
SET stat=##class(%iKnow.Domain).Rename(oldname,newname)
IF stat=1 {WRITE "renamed ",oldname," to ",newname,!}
ELSE {WRITE "no rename",oldname," is unchanged",! }
ドメイン名の変更により、ドメインを開くときに使用する名前が変わり、既存のドメイン ID が新規の名前に割り当てられます。Rename() では、ドメインの現在のインスタンス名は変更されません。名前を変更するには、古いドメイン名が存在して、新しいドメイン名は存在していないことが必要です。
ドメインのコピー
既存のドメインを現在のネームスペースの新規ドメインにコピーするには、%iKnow.Utils.CopyUtilsOpens in a new tab クラスの CopyDomain()Opens in a new tab メソッドを使用できます。CopyDomain() メソッドは、ドメインの定義を新規ドメインにコピーして、一意のドメイン名およびドメイン ID を割り当てます。既存のドメインの変更はありません。新規のドメインが存在しない場合、このメソッドにより新規ドメインが作成されます。既定では、このメソッドはドメイン・パラメータ設定および割り当てられたドメイン・コンポーネント (存在する場合) を、既存のドメインからコピーのドメインにコピーします。
また、既定では、CopyDomain() メソッドはソース・データを既存のドメインからコピーのドメインにコピーします。ただし、ソース・データのコピーを要求しても、ソース・データが既存のドメインに存在しない場合、CopyDomain() の処理は失敗します。
以下の例では、“mydomain“ という名のドメインおよびそのパラメータ設定とソース・データを “mydupdomain“ という名の新規ドメインにコピーします。“mydomain“ にソース・データが含まれていないため、(ソース・データをコピーするかどうかを指定する) 3 番目の引数は 0 に設定されています。
DomainMustExistToBeCopied
SET olddom="mydomain"_$PIECE($H,",",2)
SET domo=##class(%iKnow.Domain).%New(olddom)
DO domo.%Save()
IF (##class(%iKnow.Domain).NameIndexExists(olddom))
{WRITE "Old domain exists, proceed with copy",!!}
ELSE {WRITE "Old domain does not exist" QUIT}
CopyDomain
SET newdom="mydupdomain"
IF (##class(%iKnow.Domain).NameIndexExists(newdom))
{WRITE "Domain copy overwriting domain ",newdom,!}
ELSE {WRITE "Domain copy creating domain ",newdom,!}
SET stat=##class(%iKnow.Utils.CopyUtils).CopyDomain(olddom,newdom,0)
IF stat=1 {WRITE !!,"Copied ",olddom," to ",newdom," copying all assignments",!!}
ELSE {WRITE "Domain copy failed with status ",stat,!}
CleanUp
SET stat=##class(%iKnow.Domain).%DeleteId(domo.Id)
WRITE "Deleted the old domain"
CopyDomain() メソッドにより、既存ドメインのドメイン設定、ソース・データ、および割り当てられたコンポーネントをすべて新規ドメインにすばやくコピーできます。このメソッドでは、割り当てられたドメイン・コンポーネントすべてをコピーするかまったくコピーしないかに対して、ブーリアン・オプションが用意されています。%iKnow.Utils.CopyUtilsOpens in a new tab クラスの他のメソッドでは、割り当てられたコンポーネントのどれを既存ドメイン間でコピーするかの指定において、より高度な制御が可能です。
InterSystems NLP 構成
InterSystems NLP 構成は、ソース・ドキュメントを扱う際の動作を指定します。これは、ソース・データのロード処理時のみ使用されます。構成はそのネームスペースに固有で、1 つのネームスペース内に複数の構成を作成できます。InterSystems NLP はネームスペースの各構成に、一意の整数である構成 ID を割り当てます。構成 ID 値は再利用されません。同じ構成を異なるドメインやソース・テキストのロードに適用できます。InterSystems NLP 構成の定義や使用はオプションで、構成を指定しないと、プロパティの既定値が使用されます。
InterSystems NLP 構成は、以下の 2 つの方法で定義できます。
-
%iKnow.ConfigurationOpens in a new tab クラス・メソッドおよびプロパティを使用する方法 (この章で説明)。
-
ドメイン・アーキテクトを使用して、サポートする言語をドメイン定義の一部として指定する方法。
構成の定義
構成を定義するには、%iKnow.ConfigurationOpens in a new tab クラスの %New()Opens in a new tab 永続メソッドを使用できます。
Exists()Opens in a new tab メソッドを呼び出すことで、目的の名前の InterSystems NLP 構成が既に存在しているかどうかを判断できます。構成が存在する場合、以下の例に示すように、Open()Opens in a new tab メソッドを使用して、その構成を開くことができます。
IF ##class(%iKnow.Configuration).Exists("EnFr") {
SET cfg=##class(%iKnow.Configuration).Open("EnFr") }
ELSE { SET cfg=##class(%iKnow.Configuration).%New("EnFr",1,$LB("en","fr"))
DO cfg.%Save() }
構成プロパティの設定
構成では以下のプロパティを定義します。
-
Name : 構成名には、任意の有効な文字列を指定できます。構成名では、大文字と小文字は区別されません。この構成に割り当てる名前は、現在のネームスペースで一意のものでなければなりません。
-
DetectLanguage : Languages プロパティに複数の言語が指定されている場合に自動言語識別を使用するかどうかを指定するブーリアン値。このオプションはパフォーマンスに大きな影響を与える可能性があるため、必要な場合以外は設定しないでください。既定値は 0 です (自動言語識別を使用しません)。
-
Languages : ソース・ドキュメントに含まれる言語、つまり、テストする言語と適用する言語モデルを指定します。使用可能なオプションは、Czech/cs (チェコ語)、Dutch/nl (オランダ語)、English/en (英語)、French/fr (フランス語)、German/de (ドイツ語)、Japanese/ja (日本語)、Portuguese/pt (ポルトガル語)、Russian/ru (ロシア語)、Spanish/es (スペイン語)、Swedish/sv (スウェーデン語)、および Ukrainian/uk (ウクライナ語) です。既定値は、English (en) です。言語は、常に、その言語の ISO 639-1 の 2 文字の省略形式を使用して指定します。このプロパティ値は、($LISTBUILD を使用して) 文字列の InterSystems IRIS リストとして指定します。
-
ユーザ・ディクショナリ : 定義された ユーザ・ディクショナリ・オブジェクトの名前、または定義されたユーザ・ディクショナリ・ファイルのファイル・パスのいずれかです。ユーザ・ディクショナリには、InterSystems NLP によるロード・オペレーションの際にソース・テキスト・エンティティに適用されるユーザ定義の置換語ペアが記述されています。このプロパティはオプションで、既定値は NULL 文字列です。
-
Summarize : ソース・テキストのロード時に要約情報を格納するかどうかを指定するブーリアン値。1 に設定すると、InterSystems NLP が要求するソース情報が生成されて、ロードされたソース・テキストの要約が生成されます。0 に設定すると、この構成オブジェクトで処理されたソースについては、要約を生成できません。通常、このオプションは 1 に設定することをお勧めします。既定値は 1 です。
すべての構成プロパティ (Name は除く) は既定値を割り当てられます。プロパティのディスパッチを使用することで、構成プロパティを取得または設定することができます。
IF cfgOref.DetectLanguage=0 {
SET cfgOref.DetectLanguage=1
DO cfgOref.%Save() }
プロパティ・ディスパッチを使用してプロパティを変更する前に、最初に新規作成した構成に対して %Save() を実行する必要があり、さらにプロパティ値の変更後、構成に対して %Save() を実行する必要があります。
以下の例では、英語とフランス語を自動言語識別によりサポートする構成を作成しています。その後、英語とスペイン語をサポートする構成に変更しています。
OpenOrCreateConfiguration
SET myconfig="Bilingual"
IF ##class(%iKnow.Configuration).Exists(myconfig) {
SET cfg=##class(%iKnow.Configuration).Open(myconfig)
WRITE "Opened existing configuration ",myconfig,! }
ELSE { SET cfg=##class(%iKnow.Configuration).%New(myconfig,1,$LB("en","fr"))
DO cfg.%Save()
WRITE "Created new configuration ",myconfig,! }
GetLanguages
WRITE "that supports ",$LISTTOSTRING(cfg.Languages),!
SetConfigParameters
SET cfg.Languages=$LISTBUILD("en","sp")
DO cfg.%Save()
WRITE "changed ",myconfig," to support ",$LISTTOSTRING(cfg.Languages),!
CleanUpForNextTime
SET rnd=$RANDOM(2)
IF rnd {
SET stat=##class(%iKnow.Configuration).%DeleteId(cfg.Id)
IF stat {WRITE "Deleted the ",myconfig," configuration" }
}
ELSE {WRITE "No delete this time",! }
複数言語と自動言語識別の使用方法の詳細は、“言語の識別” のページを参照してください。
構成の使用
以下のいずれかの方法で定義された構成を適用できます。
-
DefaultConfig ドメイン・パラメータの定義
-
構成を Init()Opens in a new tab インスタンス・メソッドの 1 番目の引数に指定して、リスタ・インスタンスを初期化し、構成の既定値をオーバーライドします。
-
構成を loader.ProcessBuffer()Opens in a new tab または loader.ProcessVirtualBuffer()Opens in a new tab メソッドの引数として指定します。
全構成のリスト
GetAllConfigurationsOpens in a new tab クエリを使用して、現在のネームスペース内の定義された全構成をリストできます。詳細は、以下の例を参照してください。
SET stmt=##class(%SQL.Statement).%New()
SET status=stmt.%PrepareClassQuery("%iKnow.Configuration","GetAllConfigurations")
IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
SET rset= stmt.%Execute()
WRITE "The current namespace is: ",$NAMESPACE,!
WRITE "It contains the following configurations: ",!
DO rset.%Display()
1 行に 1 つの構成がリストされ、構成 ID の後に構成パラメータ値が示されます。リストされる値はコロンで区切られます。サポートされる言語のリストを使用して構成が定義されている場合は、GetAllConfigurations はこれらの言語の省略形をコンマで区切って表示します。
以下を使用すると、現在のネームスペースのすべての構成をリスト表示できます。
DO ##class(%SYSTEM.iKnow).ListConfigurations()
文字列を正規化する構成の使用法
定義された InterSystems NLP 構成を使用すると、Normalize()Opens in a new tab メソッドにより、文字列に対してテキストの正規化を実行できます。このメソッドは、以下の例に示すように、文字列の正規化とユーザ・ディクショナリの適用 (任意) の両方を行います。
DefineUserDictionary
SET time=$PIECE($H,",",2)
SET udname="Abbrev"_time
SET udict=##class(%iKnow.UserDictionary).%New(udname)
DO udict.%Save()
DO udict.AddEntry("Dr.","Doctor")
DO udict.AddEntry("Mr.","Mister")
DO udict.AddEntry("\&\","and")
DisplayUserDictionary
DO udict.GetEntries(.dictlist)
SET i=1
WHILE $DATA(dictlist(i)) {
WRITE $LISTTOSTRING(dictlist(i),",",1),!
SET i=i+1 }
WRITE "End of UserDictionary",!!
DefineConfiguration
SET cfg=##class(%iKnow.Configuration).%New("EnUDict"_time,0,$LB("en"),udname)
DO cfg.%Save()
NormalizeAString
SET mystring="...The Strange Case of Dr. Jekyll & Mr. Hyde"
SET normstring=cfg.Normalize(mystring)
WRITE normstring
CleanUp
DO ##class(%iKnow.UserDictionary).%DeleteId(udict.Id)
DO ##class(%iKnow.Configuration).%DeleteId(cfg.Id)
構成に依存しない文字列に対して InterSystems NLP テキスト正規化を実行するには、NormalizeWithParams()Opens in a new tab メソッドを使用できます。
これらのメソッドは、以下の順序で処理を実行します。
-
指定されたユーザ・ディクショナリがあれば、それを適用
-
InterSystems NLP 言語モデル処理を実行
-
すべてのテキストを小文字に変換
-
複数の空白スペース文字を単一の空白文字で置換
InterSystems NLP ユーザ・ディクショナリ
ユーザ・ディクショナリを使用すると、InterSystems NLP エンジンの既定の動作を拡張できます。ユーザ・ディクショナリは一連の定義ペアで構成され、各定義ペアは文字列を以下の対応するものと関連付けます。
-
意味的属性ラベル (UDNegation や UDPositiveSentiment) など。この属性に対して文字列は属性マーカとして機能します。意味的属性ラベルを割り当てることで、例えば "tremendous" という単語を、肯定的な感情を表す用語として指定できます。
-
文字列の出現ごとに割り当てられるエンティティ・ラベル (UDConcept や UDRelation など)。エンティティ・ラベルを割り当てることで、例えば業界外の人には馴染みのないコンセプトを認識してそのインデックスを作成することを InterSystems NLP に指示できます。
-
文区切りトークン : \end (本来は文区切りしない箇所で文区切りすることをエンジンに指示)、または \noend (本来は文区切りする箇所で文区切りを抑制することをエンジンに指示)。
-
使用されている特定の文字列を置き換える置換文字列。置換語のペアを使用して、例えば、使用されているある省略形をすべて、その省略形が表すエンティティに置き換えることができます。
ユーザ・ディクショナリで意味的属性のマーカとしてカスタム用語を定義すると、InterSystems NLP によってその用語の各使用箇所が検出され、ディクショナリの中でその用語に続く属性ラベルに対応する属性によるフラグが、その用語 (およびその用語が使用されている文の一部) に設定されます。確実性属性のマーカとして用語を指定する場合は、その用語が使用されている各語句のメタデータとして、確実性レベル c も割り当てる必要があります。
InterSystems NLP の他のすべてのコンポーネントとは異なり、ユーザ・ディクショナリでは、リストしてロードする前のソース・コンテンツが変更されます。つまり、ユーザ・ディクショナリに置換語のペアがあると、以降のオペレーションでは、置換された用語のみが参照されます。例えば、ユーザ・ディクショナリで省略形 "Dr." が "Doctor" に置き換えられていると、InterSystems NLP によってインデックスが作成されたデータに使用されているすべての "Dr." は単語 "Doctor" に置き換えられます。
ユーザ・ディクショナリの置換でソース・テキストの入力ファイルが変更されることはありませんが、InterSystems NLP の環境で表現されるすべてのソース・テキストは変更され、元に戻すことはできません。元のコンテンツが分析目的で保存されることはないので、元に戻すには、環境を再構築してソースを再ロードする必要があります。このことから、語の置き換えの目的でユーザ・ディクショナリを使用することは通常お勧めできません。
置換語のペアは、NLP テキスト正規化の前に適用されます。ここで、NLP の内部テキスト表現は小文字に変換されます。これにより、置換語のペアでは大文字と小文字が区別されます。したがって、“physician“ のインスタンスすべてを “doctor“ で置き換えるには、"physician","doctor"、"Physician","Doctor"、そして "PHYSICIAN","DOCTOR" といった置換語のペアが必要になります。
ユーザ・ディクショナリの定義は任意です。ユーザ・ディクショナリはすべての固有の構成やドメインから独立しています。定義されたユーザ・ディクショナリは構成プロパティとして割り当てることができます。1 つの構成に対して割り当て可能なユーザ・ディクショナリは 1 つのみです。ただし、同じユーザ・ディクショナリを複数の構成に割り当てることはできます。
また、定義されたユーザ・ディクショナリを、あらゆる構成から独立して、NormalizeWithParams()Opens in a new tab メソッドに対して指定することもできます。
ユーザ・ディクショナリはソースがリストされるときにソースに適用されます。ユーザ・ディクショナリを変更しても、既にインデックスが作成されているソースは影響を受けません。
ドメイン・アーキテクトでのユーザ・ディクショナリの定義
対話型のドメイン・アーキテクト・ツールを使用してドメインを作成する際に、ドメイン設定の過程でユーザ・ディクショナリを定義できます。
オブジェクト・インスタンスとしてのユーザ・ディクショナリの定義
最初にユーザ・ディクショナリ・オブジェクトを作成してから、そのインスタンスを生成します。
SET udict=##class(%iKnow.UserDictionary).%New("MyUserDict")
DO udict.%Save()
DO udict.AddEntry("Dr.","Doctor")
DO udict.AddEntry("physician","doctor")
DO udict.AddEntry("Physician","Doctor")
ユーザ・ディクショナリ・オブジェクトを生成するには、追加する定義ペアに適した %iKnow.UserDictionary クラスのメソッドを使用します。例えば、AddConcept() を使用すると文字列をコンセプトのエンティティとして特定でき、AddSentenceNoEnd() を使用すると、文字列の出現によって文区切りが発生しないことを指定できます。
感情属性など、ユーザ定義の属性用語を追加するには、以下の例のように、適切なインスタンス・メソッドを使用します。
SET udict=##class(%iKnow.UserDictionary).%New("SentimentUserDict")
DO udict.%Save()
DO udict.AddNegativeSentimentTerm("bad")
DO udict.AddNegativeSentimentTerm("horrible")
DO udict.AddPositiveSentimentTerm("good")
DO udict.AddPositiveSentimentTerm("excellent")
AddCertaintyTerm()Opens in a new tab メソッドを使用して確実性属性を割り当てる場合は、以下の例に示すように 2 番目の引数として確実性レベルの整数を指定します。
SET udict=##class(%iKnow.UserDictionary).%New("CertaintyUserDict")
DO udict.%Save()
DO udict.AddCertaintyTerm("absolutely", 9)
DO udict.AddCertaintyTerm("presumably", 0)
いずれかの汎用属性ラベルを使用してカスタム属性を割り当てるには、汎用の AddAttribute()Opens in a new tab メソッドを使用します。このメソッドは、属性ラベルを 2 番目の引数の文字列として受け入れます。例 :
SET udict=##class(%iKnow.UserDictionary).%New("CustomAttrUserDict")
DO udict.%Save()
DO udict.AddAttribute("patient", "UDGeneric1")
大文字と小文字を区別する置換語のペアを追加するには、AddEntry() を AddEntry(oldstring,newstring) の形式で使用します。必要に応じて、ユーザ・ディクショナリのエントリを追加する位置を指定できます (position の既定はユーザ・ディクショナリ末尾へのエントリ追加です)。InterSystems NLP はユーザ・ディクショナリの順で置換語のペアを適用するので、position を使用すると追加的な置換ができます。例えば、最初に “PA“ を “physician’s assistant“ で置換してから、“physician“ を “doctor“ で置換します。
ユーザ・ディクショナリ・オブジェクトを割り当てるには、%New() 構成メソッドの 4 番目の引数にユーザ・ディクショナリ名を指定します。
SET cfg=##class(%iKnow.Configuration).%New("MyConfig",0,$LISTBUILD("en"),"MyUserDict",1)
DO cfg.%Save()
ファイルとしてのユーザ・ディクショナリの定義
ユーザ・ディクショナリ・ファイルを生成してから、そのファイルを構成に割り当てることでユーザ・ディクショナリを作成することもできます。
ユーザ・ディクショナリ・ファイルは UTF-8 形式のエンコードのテキスト・ファイルとする必要があります。
ユーザ・ディクショナリ・ファイルを生成するには、定義ペアごとに別々の行に記述します。
エンティティ・ラベルまたは属性ラベルの割り当ては、@<markerTerm>,<label> の形式に従っている必要があります。確実性属性の場合、その行には @<markerTerm>,UDCertainty,c=<number> の形式で確実性レベルの割り当ても記述する必要があります。
置換語のペアは、<oldString>,<replacementString> の形式に従う必要があります。文字列の前後に空白がある場合にのみ代入や置き換えが適用されるように指定するには、空白の代わりに \ 文字を使用します。指定した文字列の位置で文区切りを適用することを指定するには、<replacementString>.の代わりに /end を指定します。文区切りを適用しないことを指定するには /noend を指定します。
以下にユーザ・ディクショナリ・ファイルのサンプルを示します。
Mr.,Mister Dr.,Doctor Fr.,Fr \UK,United Kingdom @outstanding,UDPosSentiment @absolutely,UDCertainty,c=9 @patient,UDGeneric
ユーザ・ディクショナリ・ファイルを割り当てるには、そのファイルのフル・パス名を %New() 構成メソッドの 4 番目の引数として指定します。
SET cfg=##class(%iKnow.Configuration).%New(myconfig,0,$LISTBUILD("en"),"C:\temp\udict.txt",1)
DO cfg.%Save()