ディクショナリおよびドメイン
作成する各ディクショナリは、ドメイン固有にするか、ドメイン非依存にして現在のネームスペースの任意のドメインで使用できるようにすることができます。
-
ドメイン固有のディクショナリは、CreateDictionary() メソッドで domainId を指定することでドメインに割り当てられます。ディクショナリの項目、用語、および形式に対して同じ domainId を指定します。このメソッドは、連続する正の整数として dictId を返します。このディクショナリを使用するマッチング・メソッドは、この dictId によってこれを参照します。
-
ドメイン非依存のディクショナリはドメインに割り当てられません。代わりに CreateDictionary() メソッドで 0 の domainId を指定します。ディクショナリの項目、用語、および形式に対しても domainId を 0 に指定します。このメソッドは、連続する正の整数として dictId を返します。このディクショナリを使用するマッチング・メソッドは、負の dictId によってこれを参照します。例えば、dictId 8 で識別されるディクショナリは dictId 値 -8 で参照されます。
ドメイン非依存のディクショナリの使用は、語幹解析の結果に重要な役割を果たします。ドメインが語幹抽出済みで構成されているためにディクショナリの用語とソース・テキストが一致する場合、通常用語のドメイン固有ディクショナリを作成すると、NLP は自動的にディクショナリ用語の語幹解析を実行します。ドメイン非依存のディクショナリを作成すると、ディクショナリの用語の語幹変換は実行されません。ユーザは通常の (語幹抽出されていない) 用語のディクショナリまたは語幹抽出済み用語のディクショナリのいずれかを作成できます。ドメイン非依存の通常用語のディクショナリでは、語幹抽出済みドメインに対する照合はできません。ドメイン非依存の語幹抽出済み用語のディクショナリでは、語幹抽出されていないドメインに対する照合はできません。
いくつかのドメインすべてが同じ dictId 値のドメイン固有のディクショナリを持つことができることとちょうど同じように、ドメイン固有のディクショナリとドメイン非依存のディクショナリの両方が同じ整数の dictId 値を持つことができます。ディクショナリ・マッチング処理は、ドメイン固有のディクショナリ (正の整数 ID で指定) とドメイン非依存のディクショナリ (負の整数 ID で指定) の任意の組み合わせを使用できます。
マッチング結果を返すマッチング API のクエリは、マッチングがドメイン非依存ディクショナリのエントリに対応する場合、(dictId、itemId、および termId に) 負の識別子を返します。すべてのクエリは、ドメイン固有のディクショナリのマッチングおよびドメイン非依存のディクショナリのマッチングの結果の組み合わせを返します。ただし、dictId パラメータで指定された値に応じて、ドメイン固有のディクショナリまたはドメイン非依存のディクショナリのいずれかの結果のみを返す、GetDictionaryMatches() と GetDictionaryMatchesById() は例外です。既定は、ドメイン固有のディクショナリのマッチングです。
ディクショナリ作成例
このドキュメント内の例で使用されているコーディングおよびデータの詳細は、"サンプル・プログラムに関するメモ" を参照してください。
以下の例では、"AviationTerms" という名前のディクショナリを作成し、2 つの項目とそれらに関連付けられる用語を入力します。このディクショナリは特定のドメインに割り当てられます。
SET domId=##class(%iKnow.Domain).GetOrCreateId("mydomain")
/* ... */
CreateDictionary
SET dictname="AviationTerms"
SET dictdesc="A dictionary of aviation terms"
SET dictId=##class(%iKnow.Matching.DictionaryAPI).CreateDictionary(domId,dictname,dictdesc)
IF dictId=-1 {WRITE "Dictionary ",dictname," already exists",!
GOTO ResetForNextTime }
ELSE {WRITE "created a dictionary ",dictId,!}
PopulateDictionaryItem1
SET itemId=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryItem(domId,dictId,
"aircraft",domId_dictId_"aircraft")
SET term1Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId,
"airplane")
SET term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId,
"helicopter")
PopulateDictionaryItem2
SET itemId2=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryItemAndTerm(domId,dictId,
"weather",domId_dictId_"weather")
SET i2term1Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId2,
"meteorological information")
SET i2term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId2,
"visibility")
SET i2term3Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId2,
"winds")
DisplayDictionary
SET stat=##class(%iKnow.Matching.DictionaryAPI).GetDictionaryItemsAndTerms(.result,domId,dictId)
SET i=1
WHILE $DATA(result(i)) {
WRITE $LISTTOSTRING(result(i),",",1),!
SET i=i+1 }
WRITE "End of items in dictionary ",dictId,!!
/* ... */
ResetForNextTime
IF dictId = -1 {
SET dictId=##class(%iKnow.Matching.DictionaryAPI).GetDictionaryId(domId,dictname)}
SET stat=##class(%iKnow.Matching.DictionaryAPI).DropDictionary(domId,dictId)
IF stat {WRITE "deleted dictionary ",dictId,! }
ELSE { WRITE "DropDictionary error ",$System.Status.DisplayError(stat) }
以下の例では、前の例と同じディクショナリが作成されますが、このディクショナリは現在のネームスペース内の任意のドメインで使用できます。
CreateDictionary
SET dictname="AviationTerms"
SET dictdesc="A dictionary of aviation terms"
SET dictId=##class(%iKnow.Matching.DictionaryAPI).CreateDictionary(0,dictname,dictdesc)
IF dictId=-1 {WRITE "Dictionary ",dictname," already exists",!
GOTO ResetForNextTime }
ELSE {WRITE "created a dictionary ",dictId,!}
PopulateDictionaryItem1
SET itemId=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryItem(0,dictId,
"aircraft",0_dictId_"aircraft")
SET term1Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(0,itemId,
"airplane")
SET term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(0,itemId,
"helicopter")
PopulateDictionaryItem2
SET itemId2=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryItemAndTerm(0,dictId,
"weather",0_dictId_"weather")
SET i2term1Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(0,itemId2,
"meteorological information")
SET i2term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(0,itemId2,
"visibility")
SET i2term3Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(0,itemId2,
"winds")
DisplayDictionary
SET domId=##class(%iKnow.Domain).GetOrCreateId("mydomain")
SET stat=##class(%iKnow.Matching.DictionaryAPI).GetDictionaryItemsAndTerms(.result,0,dictId)
SET i=1
WHILE $DATA(result(i)) {
WRITE $LISTTOSTRING(result(i),",",1),!
SET i=i+1 }
WRITE "End of items in dictionary ",dictId,!!
/* ... */
ResetForNextTime
IF dictId = -1 {
SET dictId=##class(%iKnow.Matching.DictionaryAPI).GetDictionaryId(0,dictname)}
SET stat=##class(%iKnow.Matching.DictionaryAPI).DropDictionary(0,dictId)
IF stat {WRITE "deleted dictionary ",dictId,! }
ELSE { WRITE "DropDictionary error ",$System.Status.DisplayError(stat) }