ブラックリスト
ブラックリストとは、クエリから返されることを望まないエンティティのリストです。例えば、ソース・テキストにあいさつ文が含まれている場合は、“many thanks“ や “best regards“ などの実際的な情報を含まない決まり文句をブラックリストに入れたいと思うでしょう。また、ブラックリストを使用して、クエリ結果の分析対象とするには一般的で広く使用されすぎている上位概念を抑制することもできます。
ブラックリストを適用したクエリの結果を表示する際は、ブラックリストを使用すると一部の情報が抑制され、クエリ結果が通知なしで変更されることに注意する必要があります。ブラックリストは、データ・コンテンツ、クエリ結果を参照するユーザ、およびクエリ結果が表示されるコンテキストに適したものを使用してください。
ブラックリストの作成
特定のドメインに割り当てられるブラックリストを定義したり、現在のネームスペースの任意のドメインで使用できるドメイン非依存 (ドメイン間共通) のブラックリストを定義したりすることができます。ブラックリストは、以下の 2 つの方法で定義できます。
-
Caché iKnow アーキテクトを使用します。このインタフェースを使用して、ドメイン内ブラックリストの定義、ブラックリスト・エンティティの追加と削除、ブラックリストの削除、またはドメインに対して定義された全ブラックリストのリストができます。このインタフェースでは、エンティティを文字列として指定することによるブラックリスト生成をサポートしています。
-
%iKnow.Utils.MaintenanceAPIOpens in a new tab クラスのメソッドを使用して、ブラックリストの定義、生成、および維持を行います。このクラスにより、ドメイン固有のブラックリストとドメイン間共通のブラックリストの両方を作成できます。このクラスには、文字列としてエンティティを指定するか、エンティティ ID でエンティティを指定して、ブラックリストにデータを入力するためのメソッドがあります。この章では、ブラックリストの %iKnow.Utils.MaintenanceAPIOpens in a new tab クラス・メソッドについて、いくつかの使用方法を示します。
%iKnow.Utils.CopyUtilsOpens in a new tab クラスの CopyBlackLists()Opens in a new tab メソッドを使用すると、ドメイン内のすべての定義済みブラックリストを別のドメインにコピーできます。
ナレッジ・ポータルおよび基本ポータルのユーザ・インタフェースでは、ブラックリスト使用をサポートしています。
以下の例では、ドメイン固有のブラックリストを作成し、そのブラックリストに要素を追加します。そして、ドメイン用のすべてのブラックリスト、およびこのドメインのすべての要素をリストします。最後に、ブラックリストを削除します。
DomainGetOrCreate
SET domn="mydomainwithbl"
SET domId=##class(%iKnow.Domain).GetOrCreateId(domn)
SET domoref=##class(%iKnow.Domain).%OpenId(domId)
WRITE "The ",domn," domain with domain ID ",domId,!
CreateBlackList
SET blname="AviationBlacklist"
SET blId=##class(%iKnow.Utils.MaintenanceAPI).CreateBlackList(domId,blname,
"Aviation non-mechanical terms Blacklist")
PopulateBlackList
SET black=$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(black,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToBlackList(domId,blId,val)
}
ELSE { WRITE x," entities in Blacklist",!!
GOTO ListBlacklist }
}
ListBlacklist
SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetBlackLists(.bl,domId,0)
SET i=1
WHILE $DATA(bl(i)) {
WRITE $LISTTOSTRING(bl(i),",",1),!
SET i=i+1 }
WRITE "Printed the ",i-1," Blacklists",!
SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetBlackListElements(.ble,domId,blId)
/* IF stat=1 {WRITE "success",!}
ELSE {WRITE "GetBlackListElements failed" QUIT } */
SET j=1
WHILE $DATA(ble(j)) {
WRITE $LISTTOSTRING(ble(j),",",1),!
SET j=j+1 }
WRITE "Printed the ",j-1," Blacklist elements",!
CleanUp
SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropBlackList(domId,blId)
IF stat=1 {WRITE "Blacklist deleted",!}
ELSE {WRITE "DropBlackList failed" QUIT }
CreateBlackList()Opens in a new tab メソッドでは、ブラックリストの名前と説明を指定できます。ブラックリスト名は、任意の長さの任意の有効文字列を指定できます。ブラックリスト名では、大文字と小文字が区別されます。ブラックリストに割り当てる名前は一意にする必要があります。ドメイン固有のブラックリストの場合、ドメイン内で一意にする必要があります。ドメイン間共通のブラックリストの場合、ネームスペース内で一意にする必要があります。重複したブラックリスト名を指定すると、ERROR #8091 が生成されます。ブラックリストの記述はオプションです。任意の長さの文字列とすることができます。
ブラックリストとドメイン
作成する各ブラックリストは、ドメイン固有にするか、ドメイン間共通 (ドメイン非依存) にして現在のネームスペースの任意のドメインで使用できるようにすることができます。
-
ドメイン固有のブラックリストは、CreateBlackList() メソッドで domainId を指定することでドメインに割り当てられます。このメソッドは、連続する正の整数としてブラックリスト ID を返します。このブラックリストを使用するクエリ・メソッドは、このブラックリスト ID でこれを参照します。ドメイン固有のブラックリストは語幹解析をサポートできます。
-
ドメイン間共通のブラックリストはドメインに割り当てられません。代わりに CreateBlackList() メソッドで 0 のドメイン ID を指定します。このメソッドは、連続する正の整数としてブラックリスト ID を返します。このブラックリストを使用するクエリ・メソッドは、負のブラックリスト ID でこれを参照します。例えば、ブラックリスト ID 8 で識別されるブラックリストはブラックリスト ID 値 -8 で参照されます。
Note:ドメイン間共通のブラックリストは、バージョン 4 (以降) のドメインでのみ使用可能です。ドメイン間共通のブラックリストを使用するには、Caché 2014.1 以前に作成されたドメインをバージョン 4 にアップグレードする必要があります。
ドメイン固有のブラックリストを生成する場合、AddEntityToBlackList()Opens in a new tab または AddStringToBlackList()Opens in a new tab のいずれかを使用できます。ドメイン間共通のブラックリストを生成する場合、AddStringToBlackList()Opens in a new tab のみ使用できます。
GetBlackListElements()Opens in a new tab は、ドメイン間共通のブラックリストの entUniId 値について空の文字列を返します。
以下の例では、ドメイン固有のブラックリスト (AviationTermsBlacklist) とドメイン間共通のブラックリスト (JobTitleBlacklist) の 2 つのブラックリストを作成および生成します。pIncludeCrossDomain ブーリアンが 1 に設定されているため、GetBlackLists()Opens in a new tab メソッドは両方のブラックリストを返します。GetBlackLists() が負の整数としてドメイン間共通のブラックリストのブラックリスト ID を返すことに注意してください。
DomainGetOrCreate
SET domn="mydomainwithbl"
SET domId=##class(%iKnow.Domain).GetOrCreateId(domn)
SET domoref=##class(%iKnow.Domain).%OpenId(domId)
WRITE "The ",domn," domain with domain ID ",domId,!
CreateBlackList1
SET blname="AviationTermsBlacklist"
SET blId=##class(%iKnow.Utils.MaintenanceAPI).CreateBlackList(domId,blname,
"Common aviation terms Blacklist")
PopulateBlackList1
SET black=$LB("aircraft","airplane","flight","accident","event","incident","airport","runway")
SET ptr=0
FOR x=0:1:100 {
SET moredata=$LISTNEXT(black,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToBlackList(domId,blId,val)
}
}
WRITE "Blacklist ",blname," populated",!
CreateBlackList2
SET bl2name="JobTitleBlacklist"
SET bl2Id=##class(%iKnow.Utils.MaintenanceAPI).CreateBlackList(0,bl2name,
"Aviation personnel Blacklist")
PopulateBlackList2
SET jobblack=$LB("pilot","copilot","student pilot","flight instructor","passenger")
SET ptr=0
FOR x=0:1:100 {
SET moredata=$LISTNEXT(jobblack,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToBlackList(0,bl2Id,val)
}
}
WRITE "Blacklist ",bl2name," populated",!!
ListBlacklists
SET pIncludeCrossDomain=1
SET stat=##class(%iKnow.Utils.MaintenanceAPI).GetBlackLists(.bl,domId,pIncludeCrossDomain)
SET i=1
WHILE $DATA(bl(i)) {
IF $LIST(bl(i),1)<0 {
WRITE "cross-domain:",!,$LISTTOSTRING(bl(i),",",1),! }
ELSE { WRITE "domain-specific:",!,$LISTTOSTRING(bl(i),",",1),! }
SET i=i+1 }
WRITE "Printed the ",i-1," Blacklists",!!
CleanUp
SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropBlackList(domId,blId)
IF stat=1 {WRITE "domain Blacklist deleted",!}
ELSE {WRITE "first DropBlackList failed" }
SET stat=##class(%iKnow.Utils.MaintenanceAPI).DropBlackList(0,bl2Id)
IF stat=1 {WRITE "cross-domain Blacklist deleted",!}
ELSE {WRITE "second DropBlackList failed" }
ブラックリストをサポートするクエリ
以下のクエリ・メソッドでは、ブラックリストを指定するためのパラメータが用意されています。複数のブラックリストをそれらのメソッドのいずれかに対して指定するには、$LISTBUILD 関数の使用により、ブラックリスト ID を %List 構造の要素として指定することができます。正の整数のブラックリスト ID 値としてドメイン固有のブラックリストを指定し、負の整数のブラックリスト ID 値としてドメイン間共通のブラックリストを指定します。
エンティティ・クエリ :
-
%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 : 類似エンティティの選択時および類似スコアの計算時、iKnow はブラックリストを無視します。
ブラックリスト・クエリの例
以下の例では、対象にするには一般的すぎる非機械的航空用語を抑制しています。ここでは、CreateBlackList()Opens in a new tab を使用してブラックリストを作成し、AddStringToBlackList()Opens in a new tab を使用してエンティティをブラックリストに追加してから、そのブラックリストを GetTop()Opens in a new tab メソッドに指定しています。
#Include %IKPublic
ZNSPACE "Samples"
DomainCreateOrOpen
SET dname="mydomain"
IF (##class(%iKnow.Domain).Exists(dname))
{ WRITE "The ",dname," domain already exists",!
SET domoref=##class(%iKnow.Domain).Open(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)
CreateBlackList1
SET blname="AviationTermsBlacklist"
SET blId=##class(%iKnow.Utils.MaintenanceAPI).CreateBlackList(domId,blname,
"Common aviation terms Blacklist")
PopulateBlackList
SET black=$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(black,ptr,val)
IF moredata=1 {
SET stat=##class(%iKnow.Utils.MaintenanceAPI).AddStringToBlackList(domId,blId,val)
}
}
WRITE "Blacklist ",blname," 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(blId))
WRITE "NOTE: the ",blname," Blacklist",!,
"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"