Skiplist
インターシステムズは、InterSystems IRIS® 自然言語処理 (NLP) を非推奨Opens in a new tabにしました。インターシステムズ製品の今後のバージョンから削除される可能性があります。以下のドキュメントは、既存ユーザのみに向けたリファレンスとしています。代替のソリューションを見いだすためのサポートを必要とする既存ユーザはインターシステムズのサポート窓口Opens in a new tabにお問い合わせください。
skiplist とは、クエリから返されることを望まないエンティティのリストです。例えば、ソース・テキストにあいさつ文が含まれている場合は、"many thanks" や "best regards" などの実際的な情報を含まない決まり文句を skiplist に入れたいと思うでしょう。また、skiplist を使用して、クエリ結果の分析対象とするには一般的で広く使用されすぎている上位概念を抑制することもできます。
skiplist を適用したクエリの結果を表示する際は、skiplist を使用すると一部の情報が抑制され、クエリ結果が通知なしで変更されることに注意する必要があります。skiplist は、データ・コンテンツ、クエリ結果を参照するユーザ、およびクエリ結果が表示されるコンテキストに適したものを使用してください。
skiplist の作成
特定のドメインに割り当てられる skiplist を定義したり、現在のネームスペースの任意のドメインで使用できるドメイン非依存 (ドメイン間共通) の skiplist を定義したりすることができます。skiplist は、以下の 2 つの方法で定義できます。
-
InterSystems IRIS ドメイン・アーキテクトを使用します。このインタフェースを使用して、ドメイン内 skiplist の定義、skiplist エンティティの追加と削除、skiplist の削除、またはドメインに対して定義された全 skiplist のリストができます。このインタフェースでは、エンティティを文字列として指定することによる skiplist 生成をサポートしています。
-
%iKnow.Utils.MaintenanceAPIOpens in a new tab クラスのメソッドを使用して、skiplist の定義、生成、および維持を行います。このクラスにより、ドメイン固有の skiplist とドメイン間共通の skiplist の両方を作成できます。このクラスには、文字列としてエンティティを指定するか、エンティティ ID でエンティティを指定して、skiplist にデータを入力するためのメソッドがあります。この章では、skiplist の %iKnow.Utils.MaintenanceAPIOpens in a new tab クラス・メソッドについて、いくつかの使用方法を示します。
%iKnow.Utils.CopyUtilsOpens in a new tab クラスの CopySkipLists()Opens in a new tab メソッドを使用すると、ドメイン内のすべての定義済み skiplist を別のドメインにコピーできます。
ドメイン・エクスプローラおよび基本ポータルのユーザ・インタフェースでは、skiplist の使用をサポートしています。
以下の例では、ドメイン固有の skiplist を作成し、その skiplist に要素を追加します。そして、ドメイン用のすべての skiplist、およびこのドメインのすべての要素をリストします。最後に、skiplist を削除します。
DomainCreateOrOpen
SET domn="mydomainwithsl"
IF (##class(%iKnow.Domain).NameIndexExists(domn))
{ 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 }
CreateSkipList
SET slname="AviationSkipList"
SET slId=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(domId,slname,
"Aviation non-mechanical terms skiplist")
PopulateSkipList
SET skip=$LB("aircraft","airplane","flight","accident","event","incident","pilot",
"student pilot","flight instructor","runway","accident site","ground","visibility","faa")
SET ptr=0
FOR x=0:1:100 {
SET moredata=$LISTNEXT(skip,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(domId,slId,val)
}
ELSE { WRITE x," entities in skiplist",!!
GOTO ListSkipList }
}
ListSkipList
SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetSkipLists(.sl,domId,0)
SET i=1
WHILE $DATA(sl(i)) {
WRITE $LISTTOSTRING(sl(i),",",1),!
SET i=i+1 }
WRITE "Printed the ",i-1," skiplists",!
SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetSkipListElements(.sle,domId,slId)
/* IF stat=1 {WRITE "success",!}
ELSE {WRITE "GetSkipListElements failed" QUIT } */
SET j=1
WHILE $DATA(sle(j)) {
WRITE $LISTTOSTRING(sle(j),",",1),!
SET j=j+1 }
WRITE "Printed the ",j-1," skiplist elements",!
CleanUp
SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropSkipList(domId,slId)
IF stat=1 {WRITE "Skiplist deleted",!}
ELSE {WRITE "DropSkipList failed" QUIT }
CreateSkipList()Opens in a new tab メソッドでは、skiplist の名前と説明を指定できます。skiplist 名は、任意の長さの任意の有効文字列を指定できます。skiplist 名では、大文字と小文字が区別されます。skiplist に割り当てる名前は一意にする必要があります。ドメイン固有の skiplist の場合、ドメイン内で一意にする必要があります。ドメイン間共通の skiplist の場合、ネームスペース内で一意にする必要があります。重複した skiplist 名を指定すると、ERROR #8091 が生成されます。skiplist の記述はオプションです。任意の長さの文字列とすることができます。
skiplist とドメイン
作成する各 skiplist は、ドメイン固有にするか、ドメイン間共通 (ドメイン非依存) にして現在のネームスペースの任意のドメインで使用できるようにすることができます。
-
ドメイン固有の skiplist は、CreateSkipList() メソッドでドメイン ID を指定することでドメインに割り当てられます。このメソッドは、連続する正の整数として skiplist ID を返します。この skiplist を使用するクエリ・メソッドは、この skiplist ID でこれを参照します。ドメイン固有の skiplist は語幹解析をサポートできます。
-
ドメイン間共通の skiplist はドメインに割り当てられません。代わりに CreateSkipList() メソッドで 0 のドメイン ID を指定します。このメソッドは、連続する正の整数として skiplist ID を返します。この skiplist を使用するクエリ・メソッドは、負の skiplist ID でこれを参照します。例えば、skiplist ID 8 で識別される skiplist は skiplist ID 値 -8 で参照されます。
ドメイン固有の skiplist を生成する場合、AddEntityToSkipList()Opens in a new tab または AddStringToSkipList()Opens in a new tab のいずれかを使用できます。ドメイン間共通の skiplist を生成する場合、AddStringToSkipList()Opens in a new tab のみ使用できます。
GetSkipListElements()Opens in a new tab は、ドメイン間共通の skiplist の entUniId 値について空の文字列を返します。
以下の例では、ドメイン固有の skiplist (AviationTermsSkipList) とドメイン間共通の skiplist (JobTitleSkipList) の 2 つの skiplist を作成および生成します。pIncludeCrossDomain ブーリアンが 1 に設定されているため、GetSkipLists()Opens in a new tab メソッドは両方の skiplist を返します。GetSkipLists() が負の整数としてドメイン間共通の skiplist の skiplist ID を返すことに注意してください。
DomainCreateOrOpen
SET domn="mydomainwithsl"
IF (##class(%iKnow.Domain).NameIndexExists(domn))
{ 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 }
CreateSkipList1
SET slname="AviationTermsSkipList"
SET slId=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(domId,slname,
"Common aviation terms skiplist")
PopulateSkipList1
SET skip=$LB("aircraft","airplane","flight","accident","event","incident","airport","runway")
SET ptr=0
FOR x=0:1:100 {
SET moredata=$LISTNEXT(skip,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(domId,slId,val)
}
}
WRITE "Skiplist ",slname," populated",!
CreateSkipList2
SET sl2name="JobTitleSkipList"
SET sl2Id=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(0,sl2name,
"Aviation personnel skiplist")
PopulateSkipList2
SET jobskip=$LB("pilot","copilot","student pilot","flight instructor","passenger")
SET ptr=0
FOR x=0:1:100 {
SET moredata=$LISTNEXT(jobskip,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(0,sl2Id,val)
}
}
WRITE "Skiplist ",sl2name," populated",!!
ListSkipLists
SET pIncludeCrossDomain=1
SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetSkipLists(.sl,domId,pIncludeCrossDomain)
SET i=1
WHILE $DATA(sl(i)) {
IF $LIST(sl(i),1)<0 {
WRITE "cross-domain:",!,$LISTTOSTRING(sl(i),",",1),! }
ELSE { WRITE "domain-specific:",!,$LISTTOSTRING(sl(i),",",1),! }
SET i=i+1 }
WRITE "Printed the ",i-1," skiplists",!!
CleanUp
SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropSkipList(domId,slId)
IF stat=1 {WRITE "domain skiplist deleted",!}
ELSE {WRITE "first DropSkipList failed" }
SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropSkipList(0,sl2Id)
IF stat=1 {WRITE "cross-domain skiplist deleted",!}
ELSE {WRITE "second DropSkipList failed" }
skiplist をサポートするクエリ
以下のクエリ・メソッドでは、skiplist を指定するためのパラメータが用意されています。複数の skiplist をそれらのメソッドのいずれかに対して指定するには、$LISTBUILD 関数の使用により、skiplist ID を %List 構造の要素として指定することができます。正の整数の skiplist ID 値としてドメイン固有の skiplist を指定し、負の整数の skiplist ID 値としてドメイン間共通の skiplist を指定します。
エンティティ・クエリ :
-
%iKnow.Queries.EntityAPI.GetCountByDomain()Opens in a new tab
-
%iKnow.Queries.EntityAPI.GetCountBySource()Opens in a new tab
-
%iKnow.Queries.EntityAPI.GetSimilarCounts()Opens in a new tab
文クエリ :
ソース・クエリ :
-
%iKnow.Queries.SourceAPI.GetSimilar()Opens in a new tab : 類似エンティティの選択時および類似スコアの計算時、NLP は skiplist のエンティティを無視します。
skiplist クエリの例
このドキュメント内の例で使用されているコーディングおよびデータの詳細は、"サンプル・プログラムに関するメモ" を参照してください。
以下の例では、対象にするには一般的すぎる非機械的航空用語を抑制しています。ここでは、CreateSkipList()Opens in a new tab を使用して skiplist を作成し、AddStringToSkipList()Opens in a new tab を使用してエンティティを skiplist に追加してから、その skiplist を GetTop()Opens in a new tab メソッドに指定しています。
#include %IKPublic
DomainCreateOrOpen
SET dname="mydomain"
IF (##class(%iKnow.Domain).NameIndexExists(dname))
{ WRITE "The ",dname," domain already exists",!
SET domoref=##class(%iKnow.Domain).NameIndexOpen(dname)
GOTO DeleteOldData }
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 ListerAndLoader }
DeleteOldData
SET stat=domoref.DropData()
IF stat { WRITE "Deleted the data from the ",dname," domain",!!
GOTO ListerAndLoader }
ELSE { WRITE "DropData error ",$System.Status.DisplayError(stat)
QUIT}
ListerAndLoader
SET domId=domoref.Id
SET flister=##class(%iKnow.Source.SQL.Lister).%New(domId)
SET myloader=##class(%iKnow.Source.Loader).%New(domId)
CreateSkipList1
SET slname="AviationTermsSkipList"
SET slId=##class(%iKnow.Utils.MaintenanceAPI).CreateSkipList(domId,slname,
"Common aviation terms skiplist")
PopulateSkipList
SET skip=$LB("aircraft","airplane","flight","accident","event","incident","pilot","airport",
"student pilot","flight instructor","runway","accident site","ground","visibility","faa")
SET ptr=0
FOR x=0:1:100 {
SET moredata=$LISTNEXT(skip,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToSkipList(domId,slId,val)
}
}
WRITE "Skiplist ",slname," populated",!
QueryBuild
SET myquery="SELECT TOP 100 ID AS UniqueVal,Type,NarrativeFull FROM Aviation.Event"
SET idfld="UniqueVal"
SET grpfld="Type"
SET dataflds=$LB("NarrativeFull")
UseLister
SET stat=flister.AddListToBatch(myquery,idfld,grpfld,dataflds)
IF stat '= 1 {WRITE "The lister failed: ",$System.Status.DisplayError(stat) QUIT }
UseLoader
SET stat=myloader.ProcessBatch()
IF stat '= 1 {WRITE "The loader failed: ",$System.Status.DisplayError(stat) QUIT }
SourceCountQuery
SET numSrcD=##class(%iKnow.Queries.SourceQAPI).GetCountByDomain(domId)
WRITE "The domain contains ",numSrcD," sources",!
TopEntitiesQuery
DO ##class(%iKnow.Queries.EntityAPI).GetTop(.result,domId,1,20,"",0,0,0,0,$LB(slId))
WRITE "NOTE: the ",slname," skiplist",!,
"has been applied to this list of top entities",!
SET i=1
WHILE $DATA(result(i)) {
SET outstr = $LISTTOSTRING(result(i),",",1)
SET entity = $PIECE(outstr,",",2)
SET freq = $PIECE(outstr,",",3)
SET spread = $PIECE(outstr,",",4)
WRITE "[",entity,"] appears ",freq," times in ",spread," sources",!
SET i=i+1 }
WRITE "Printed the top ",i-1," entities"