Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

構造化されていないデータのキューブでの使用 (iKnow)

この章では、DeepSee キューブ内で構造化されていないデータと iKnow エンジンを使用する方法を説明します。以下のトピックについて説明します。

付録 “iKnow で使用するセカンダリ・キューブの生成” も参照してください。

iKnow/キューブ統合の概要

iKnow 意味分析エンジンは、構造化されていないデータ、すなわち英語やフランス語などの人間の言語でテキストとして記述されたデータを分析します。このエンジンは、DeepSee と同じ方法で Caché に組み込まれています。概要は、"iKnow の使用法" の “コンセプトの概要” を参照してください。

構造化されていないデータを含むプロパティがキューブのソース・テーブルに存在する場合 (例えば、テキストを含む文字列フィールド)、DeepSee キューブ内で構造化されていないデータを使用できます。その際、iKnow ディメンジョンを使用するピボット・テーブルを定義することができ、さらにそれらのピボット・テーブルは通常どおりダッシュボードで使用できます。

例えば、キューブのソース・テーブルに構造化されているデータと構造化されていないデータの両方が含まれているとします。この章で後述する Aviation デモはその例です。このデモの場合、ソース・テーブルは、航空イベントのレコードで構成されます。航空イベントごとに、出来事の発生場所、航空機型式などを示す一連の短い文字列フィールドが存在します。長いテキスト・フィールドには、イベントの詳細レポートが格納されます。

(iKnow KPI も定義できます。これは、DeepSee の KPI メカニズムを使用して iKnow クエリを公開します。"iKnow の使用法" の “iKnow KPI と DeepSee のダッシュボード” を参照してください。)

iKnow の用語

iKnow エンジンは、構造化されていないテキストを分析し、その中のエンティティを識別して、同類の単語および文の中での役割を識別します。エンティティとは、テキストの最小限の論理ユニット、つまり単語または単語のグループです。エンティティの例は、clear skiesclear sky です (これらは別のエンティティであることに注意してください。iKnow は、語幹解析を実行しません)。iKnow 言語モデルでは、以下の 2 種類のエンティティが識別されます。

  • 関係とは、2 つの概念の関係を指定することでそれらの概念を結合する単語や単語のグループです。関係は、通常は動詞ですが、必ずしもそうとは限りません。

  • 概念とは、関係によって関連付けられる単語や単語のグループです。概念は、通常は名詞または名詞句ですが、必ずしもそうとは限りません。

iKnow エンジンは、各文を概念およびリレーションシップの論理的な順序に変換します。こうすることによって、同類の単語 (エンティティ) および文内でのその役割を識別します。これは、はるかに構造化された形式のデータで、iKnow およびカスタム分析の基礎となります。これには、関連メトリック、自動化された要約およびカテゴリ化が含まれ、既存の分類法またはオントロジと照合します。

概念およびリレーションシップの識別 (ならびにこれらのエンティティの関連性の測定) の主要なアクティビティに関して、iKnow は、テキストで説明されているトピックの情報を必要としません。したがって、iKnow は、トピックの理解ではなく言語の理解に基づいているため、ドメインまたはトピックで適切に機能する真のボトムアップ・テクノロジです。

しかし、テキストで説明されるトピックに関する知識がある場合、これら既知の用語 (ディクショナリ用語と呼ばれる) との一致を iKnow に検出させることができます。iKnow は、エンティティの役割およびエクステントを理解するため、テキストで発見されたエンティティ (またはエンティティ・シーケンス) の既存の用語との一致率の高低を判定し、一致スコアを算出することも可能です。例えば、ディクショナリ用語 runway に対して、エンティティ runway (テキスト内) は完全一致ですが、runway asphalt は部分一致であるためスコアが低くなります。

ディクショナリ用語は、ディクショナリ項目にグループ化されます。これは、識別する一意のものを表します。例えば、runway および landing strip は、滑走路を意味する汎用ディクショナリ項目の 2 つの用語です。

ディクショナリの概要は、"iKnow の使用法" の “スマート・マッチング : ディクショナリの作成” および “スマート・マッチング : ディクショナリの使用” を参照してください。

iKnow のメジャーおよびディメンジョンについて

iKnow メジャーは、DeepSee の他の種類のメジャーと異なり、アナライザには表示されません。また、ピボット・テーブルで直接使用することはできません。iKnow メジャーは、iKnow エンジンで処理する必要があるプロパティごとに定義します。定義したメジャーは、iKnow ディメンジョンの基礎として使用できます。

iKnow ディメンジョンは、他の DeepSee ディメンジョンと似ています。1 つ以上のレベルを含み、それらはメンバを含みます。メンバは、キューブのソース・クラスの一連のレコードで構成されます。

iKnow ディメンジョンには、以下の 2 種類があります。

  • エンティティ・ディメンジョン。エンティティ・ディメンジョンには、1 つのレベルが含まれます。そのレベルの各メンバが、iKnow エンジンが構造化されていないデータで検出したエンティティに対応します。

    このレベルのメンバは、分散 (このエンティティを含むレコードの数) の降順に並べ替えられます。アナライザの左の領域でこのレベルを展開すると、最も一般的なエンティティ 100 件が表示されます。ただし、このレベルをフィルタとして使用すると、検索によってどのエンティティにもアクセスできます。

  • ディクショナリ・ディメンジョン。ディクショナリ・ディメンジョンには、通常は以下のように 2 つのレベルが含まれます。

    • 上位レベルのディクショナリ・レベルには、ディクショナリごとに 1 つのメンバが含まれます。このメンバは、指定されたディクショナリの項目と一致するすべてのレコードで構成されます。

      例えば、天気状況メンバは、ディクショナリ天気状況の項目と一致するすべてのレコードで構成されます。これには、曇り空などの項目が含まれます。

    • オプションの下位レベルである項目レベルには、ディクショナリ項目ごとに 1 つのメンバが含まれます。このメンバは、指定されたディクショナリ項目の用語と一致するすべてのレコードで構成されます。

      例えば、メンバは、凍結など、冬メンバの用語のいずれかと一致する各レコードで構成されます。

通常はソース・テキストに複数のエンティティが含まれるので、ソース・レコードは、あるレベルの複数のメンバに属する可能性が高くなります。

生成される iKnow ドメイン

この章で説明されている iKnow 機能を使用する際、1 つまたは複数の iKnow ドメインが作成されます。各キューブ・レベルおよび各メジャーは、iKnow クエリで使用できる擬似メタデータ・フィールドとして使用できます。レベルでは、等値演算子および不等値演算子がサポートされます。メジャーでは、すべての演算子がサポートされます。iKnow クエリの詳細は、"iKnow の使用法" を参照してください。

この章で後述する “DeepSee による iKnow ドメインの管理” も参照してください。

Aviation Events デモの設定

SAMPLES ネームスペースには Aviation デモがあります。このデモには、いくつかのキューブ定義、用語リストの例、およびダッシュボードが含まれます。

このデモでは、プライマリ・キューブ (Aviation Events) はテーブル Aviation.EventOpens in a new tab に基づいていて、これは航空イベントのレコードで構成されています。航空イベントごとに、出来事の発生場所、航空機型式などを示す一連の短い文字列フィールドが存在します。長いテキスト・フィールドには、イベントの詳細レポートが格納されます。

容量の問題で、Caché をインストールする際にこのデモは初期化されていません。デモを設定するには、SAMPLES ネームスペースで、ターミナルから以下のコマンドを入力します。

 d ##class(Aviation.Utils).Setup()

サンプル・ダッシュボード

サンプル・ダッシュボードを表示する手順は以下のとおりです。

  1. 管理ポータルで、SAMPLES ネームスペースにアクセスします。

  2. [ホーム]→[DeepSee]→[ユーザ・ポータル] を選択してから、[表示] を選択します。

    ユーザ・ポータルが表示され、既存のパブリック・ダッシュボードとピボット・テーブルがこのネームスペースにリストされます。

  3. [Aviation event reports] ダッシュボードを選択します。

[Aviation event reports] ダッシュボードには、以下のピボット・テーブルが含まれます。

generated description: iknow highest injuries

このピボット・テーブルは、以下のように定義されています。

  • メジャーは、Count (イベント数) です。

  • 最後の行を除いて、各行は、iKnow エンジンが検出し、iKnow ディクショナリの項目に一致したエンティティを表します。

  • 最後の行は、iKnow ディクショナリの項目に一致したすべてのレコードを表します。

  • 列には、Highest Injury レベル (レポートに対して用意されている直接分類に基づく標準データ・ディメンジョン内のレベル) のメンバが表示されます。

つまり、行には、(テキストのレポートで iKnow エンジンが検出した) 構造化されていないデータによって決定されたグループが表示され、列には、構造化されているデータによって決定されたグループ (直接分類) が表示されます。このようなピボット・テーブルを使用して、構造化されていないデータと構造化されているデータの間の不一致を検出できます。

例えば、最も高い負傷レベルとして正式に None に分類されているレポートの情報を提供する None 列について考えてみます。この設定で、この列のセルでは、次の情報が提供されます。

  • iKnow > none セルは、377 レポートで、iKnow エンジンが負傷ディクショナリの none 項目と一致するエンティティを検出したことを示しています。これは妥当です。

  • iKnow —> minor セルは、4 レポートで、iKnow エンジンが負傷ディクショナリの minor 項目と一致するエンティティを検出したことを示しています。つまり、4 レポートで、構造化されていないデータは、(これらのレポートは最も高い負傷レベルとして None が分類されているにもかかわらず) 軽傷があったことを示唆しています。

    このセルの値は、構造化されていないデータと構造化されているデータの間に不一致があることを表しています。このセルでは、さらに調査を進め、完全なレポートを読むことが有用です。

  • iKnow > serious セルおよび iKnow > fatal セルは空です。これらのセルは、iKnow エンジンが serious または fatal という負傷エンティティを検出したレコードがないことを示しています。これは妥当です。

None のセル iKnow > minor の詳細リストを表示し、これらのインシデントのレポートを (generated description: button iknow measure アイコンを使用して) 表示する場合、これらのレポートの分類が間違っていて、すべてのレポートに軽傷があることがわかります。例えば、最初のレポートには、“[プライベート・パイロットが軽傷を報告しました]” という文が含まれています。

同様に、Minor 列で、iKnow > serious セルと iKnow > fatal セルが他の不一致を示しています。Serious 列では、iKnow > fatal セルが他の不一致を示しています。

Aviation キューブの詳細

これらのデモ・キューブの詳細を確認するには、アーキテクトおよびアナライザを使用します。Aviation Events キューブには、以下の要素が含まれています。

  • Count メジャー。イベント・レポート数です。

  • InjuriesTotal メジャー。負傷の合計です。

  • Report メジャー。構造化されていないデータを使用する iKnow メジャーです。このメジャーは、iKnow ディメンジョンでのみ使用することを意図されているため、アナライザにはリストされません。

  • Event DateLocationSky ConditionMid-Air、および Injuries の各ディメンジョン。構造化されているデータを使用する標準ディメンジョンです。

  • Entities ディメンジョン。iKnow エンティティ・ディメンジョンです。

  • Dictionaries ディメンジョン。iKnow ディクショナリ・ディメンジョンです。

  • Aircraft ディメンジョン。Aircraft キューブとのリレーションシップです。

    Aircraft キューブは、航空機の属性 (タイプ、モデルなど) でレコードをグループ化するために使用できるディメンジョンを提供します。Aircraft キューブには、航空機の職員と関連付けられたレベルを提供する、Crew キューブとのリレーションシップも含まれます。

iKnow メジャーの定義

iKnow メジャーを追加する手順は以下のとおりです。

  1. [要素の追加] を選択します。

    ダイアログ・ボックスが表示されます。

  2. [新規項目名の入力] に、メジャー名を入力します。

  3. [メジャー] を選択します。

  4. [OK] を選択します。

  5. アーキテクトの中央領域でメジャーを選択します。

  6. 以下のオプションを指定します。

    • [プロパティ] または [式] — 構造化されていないデータを含むソース値を指定します。

      または、プレーン・テキスト・ファイル (処理するテキストが格納されているファイル) のフル・パスを含む値を指定します。

    • [タイプ][iKnow] を選択します。

    • [iKnow ソース] — ソース値のタイプを指定します。stringstream、または file を選択します。例えば、選択したソース・プロパティのタイプが %Stream.GlobalCharacterOpens in a new tab の場合は、stream を選択します。または、値がファイルへのパスの場合は、file を選択します。

      このオプションは、iKnow エンジンに対して、[プロパティ] または [式] に指定された値の処理方法を指示します。

      domain は、上級者向けです。“代替手法 : 既存の iKnow ドメインの使用” を参照してください。

    例として、Aviation キューブは Aviation.Event クラスに基づきます。iKnow メジャーの Report は、そのクラスの NarrativeFull プロパティに基づきます。このメジャーでは、[iKnow ソース]string です。

    [集計] オプションは、iKnow メジャーに影響を及ぼすことはありません。

  7. アーキテクトにキューブ定義を保存します。

  8. このメジャーを使用する iKnow ディクショナリ・レベルを 1 つまたは複数定義することを予定している場合、以下のように [ディクショナリ] オプションも指定します。

    1. [ディクショナリ] の下にあるボタンを選択します。

      ダイアログ・ボックスが表示されます。

    2. [利用可能なディクショナリ] リストで適切なディクショナリを選択してから [>] をクリックして、そのディクショナリを [選択されたディクショナリ] リストに移動します。

      [利用可能なディクショナリ] に必要なディクショナリがリストされていない場合は、この章で後述する “iKnow ディクショナリのロードおよび更新” を参照してください。

    3. 必要に応じて、この手順を繰り返します。

    4. [OK] を選択します。

    各ディクショナリは実際には条件リストです。ここで説明した手順を実行すると、DeepSee は指定した用語リストを自動的に検出して iKnow ディクショナリとしてロードし、マッチングを実行します。(この属性を追加しなくても、代わりにこれらのタスクを実行するメソッドを起動できます。)

iKnow メジャーは、キューブのファクト・テーブルには格納されず、アナライザに表示されないことに注意してください。iKnow メジャーの主な目的は、iKnow ドメインを定義すること、および iKnow ディメンジョンの基礎として使用することです。次のセクションを参照してください。

メジャーの既定の iKnow パラメータをオーバーライドできることにも注意してください。この章で後述する “メジャーの iKnow ドメイン・パラメータの指定” を参照してください。このオプションは上級者向けです。

代替手法 : 既存の iKnow ドメインの使用

既存のiKnow ドメインは、再利用できます。前述の手順を以下のように変更して、実行します。

  • [iKnow ソース]domain と指定します。

  • ソース式またはソース・プロパティを指定する際、これが DeepSee ファクト・テーブルのレコードに対応する iKnow ソースの外部 ID として評価されるように指定します。

  • スタジオで、iKnowDomain 属性をメジャー定義に追加します。その値は、既存の iKnow ドメインの名前である必要があります。

  • 手順 8 をスキップします。つまり、[ディクショナリ] オプションを指定しないでください。

Important:

この場合、iKnow ドメインは、DeepSee ではなく、iKnow によって管理されます。DeepSee は、構築時に iKnow レコードの削除またはロードを一切実行しません。カスタム・コードでは、ファクト・レベルで外部 ID プロパティ/式によって表現され、特定されるすべてのデータが正しくロードされることを保証する必要があります。DeepSee は、実行時に (そして実行時にのみ)、すべての呼び出しを iKnow に転送し、iKnow から受け取った結果を変換します。DeepSee が、キューブを構築または再同期する際に、独自にロード・アクティビティを実行することはありません。データのロード、パラメータの指定、またはそれ以外のこのドメインの管理を実行するには、"iKnow の使用法" の説明に従って、iKnow API を直接使用します。

代替手法 : 他の場所からの構造化されていないテキストの取得

一部のシナリオでは、構造化されていないテキストを Web ページから取得する必要が生じることがあります。例えば、追加情報 (ニュース記事など) を検索できる URL を含むフィールドのある、構造化された情報のテーブルがある場合があります。そのような場合、iKnow メジャーとしてテキストを使用する最も簡単な方法は、以下のとおりです。

  • ユーティリティ・メソッドを記述してテキストを URL から取得します。

  • iKnow メジャーのソース式でそのユーティリティ・メソッドを参照します。

例えば、ニュース記事に関する概要情報のあるクラスでキューブをベースにするとします。クラス内の各レコードには、報道会社の名前、日付、見出し、および Link という名前のプロパティ (ニュース全文の URL が格納されている) が格納されています。ニュース本文をそれらの URL で使用する iKnow メジャーを作成します。

そのためには、以下のように GetArticleText() メソッドをキューブ・クラスで定義できます。

ClassMethod GetArticleText(pLink As %String) As %String
{
    set tSC = $$$OK, tStringValue = ""
    try {
        
        set tRawText = ..GetRawTextFromLink(pLink, .tSC)
        quit:$$$ISERR(tSC)
        
        set tStringValue = ..StripHTML(tRawText, .tSC)
        quit:$$$ISERR(tSC)
        
    } catch (ex) {
        set tSC = ex.AsStatus()
    }
    if $$$ISERR(tSC) {
        set tLogFile = "DeepSeeUpdateNEWSARCHIVE"
        set tMsg = $system.Status.GetOneErrorText(tSC)
        do ##class(%DeepSee.Utils).%WriteToLog("UPDATE", tMsg, tLogFile)
    }
    quit tStringValue
}

GetRawTextFromLink() メソッドは、以下のように Raw テキストを取得します。

ClassMethod GetRawTextFromLink(pLink As %String, Output pSC As %Status) As %String
{
    set pSC = $$$OK, tRawText = ""
    try {
        // derive server and path from pLink
        set pLink = $zstrip(pLink,"<>W")
        set pLink = $e(pLink,$find(pLink,"://"),*)
        set tFirstSlash = $find(pLink,"/")
        set tServer = $e(pLink,1,tFirstSlash-2)
        set tPath = $e(pLink,tFirstSlash-1,*)
        
        // send the HTTP request for the article
        set tRequest = ##class(%Net.HttpRequest).%New()
        set tRequest.Server = tServer
        set tSC = tRequest.Get(tPath)
        quit:$$$ISERR(tSC)
        
        set len = 32000
        while len>0 {
            set tString = tRequest.HttpResponse.Data.Read(.len, .pSC)
            quit:$$$ISERR(pSC)
            set tRawText = tRawText _ tString
        }
        
    } catch (ex) {
        set pSC = ex.AsStatus()
    }
    quit tRawText
}

StripHTML() メソッドは、以下のように HTML フォーマットを削除します。

ClassMethod StripHTML(pRawText As %String, Output pSC As %Status) As %String
{
    set pSC = $$$OK, tCleanText = ""
    try {
        for tTag = "b","i","span","u","a","font","em","strong","img","label","small","sup","sub" {
            set tReplaceTag(tTag) = " "
        }
    
        set tLowerText = $$$LOWER(pRawText)
        set tStartPos = $find(tLowerText,"<body")-5, tEndTag = ""
        set pRawText = $e(pRawText,tStartPos,*), tLowerText = $e(tLowerText,tStartPos,*)
        for {
            set tPos = $find(tLowerText,"<")
            quit:'tPos // no tag start found
            
            set tNextSpace = $f(tLowerText," ",tPos), tNextEnd = $f(tLowerText,">",tPos)
            set tTag = $e(tLowerText,tPos,$s(tNextSpace&&(tNextSpace<tNextEnd):tNextSpace, 1:tNextEnd)-2)
            if (tTag="script") || (tTag="style") {
                set tPosEnd = $find(tLowerText,">",$find(tLowerText,"</"_tTag,tPos))
            } else {
                set tPosEnd = tNextEnd
            }
            if 'tPosEnd { // 
                set tEndTag = $e(pRawText,tPos-1,*)
                set pRawText = $e(pRawText,1,tPos-2)
                quit
            }
            
            set tReplace = $s(tTag="":"", 1:$g(tReplaceTag(tTag),$c(13,10,13,10)))
            set pRawText = $e(pRawText,1,tPos-2) _ tReplace _ $e(pRawText,tPosEnd,*)
            set tLowerText = $e(tLowerText,1,tPos-2) _ tReplace _ $e(tLowerText,tPosEnd,*)
        }
        set tCleanText = $zstrip($zconvert(pRawText, "I", "HTML"),"<>=W")
        
    } catch (ex) {
        set pSC = ex.AsStatus()
    }
    quit tCleanText
}

最後に、iKnow メジャーを作成し、それを %cube.GetArticleText(%source.Link) ソース式でベースにします。

iKnow ディクショナリのロードおよび更新

このセクションでは、DeepSee で使用するために iKnow ディクショナリをロードおよび更新する方法について説明します。

iKnow ディクショナリのロード

iKnow ディクショナリを Caché にロードする手順は以下のとおりです。

  1. 次の章の説明に従って、条件リスト・マネージャにアクセスします。

  2. ディクショナリ項目およびディクショナリ用語が含まれる新しい条件リストを定義します。この条件リストを以下に示します。

    • 用語リストの簡便な名前を使用します。ディクショナリ名は、条件リスト名に基づき、接頭語が追加されます。

    • 必要に応じて、カスタム・フィールドURIlanguage を追加します。これらのフィールドを使用する方法の詳細は、以下の手順を参照してください。

      どの条件リストにも、keyvalue のフィールドがあるので、使用する条件リストにもそれらのフィールドがあります。

    条件リストの作成の詳細は、次の章の “条件リストの定義” を参照してください。

  3. 用語を条件リストに追加します。条件リストの各項目について、以下のように値を指定します。

    • key (必須) は、テキストで検出される可能性がある一意の用語です。

    • value (必須) は、対応するディクショナリ項目です。

    • URI (オプション) は、ディクショナリ項目 (条件リストの value 列) の一意の識別子です。特定のディクショナリ項目を参照する必要がある場合、この識別子を MDX クエリのメンバ・キーとして使用できます。この識別子は、ディクショナリ名とディクショナリ項目の組み合わせごとに一意である必要があります。

      このフィールドを省略した場合、以下の形式の URI が生成されます。

      :dictionary_name:dictionary_item
      

      dictionary_name は定義または更新する iKnow ディクショナリの名前、dictionary_itemvalue フィールドの値です。

    • language (オプション) は、すべて小文字の言語タグです (enes など)。

    以下に例を示します (language フィールドは省略されています)。

    generated description: term list for dictionary

  4. 条件リストを保存します。

  5. iKnow ディクショナリとしてこの用語リストを使用する iKnow メジャーごとに [ディクショナリ] オプションを指定します。この章で前述した “iKnow メジャーの定義” を参照してください。

[ディクショナリ] オプションは、この iKnow メジャーのディクショナリとしてロードする用語リストを指定します。指定された用語リストは、キューブの構築時に自動的にロードされます。

iKnow ディクショナリの更新

ディクショナリとして使用する条件リストを作成または変更する場合、ディクショナリを更新する必要があります。この操作には、%iKnow.DeepSee.CubeUtilsOpens in a new tabUpdateDictionary() メソッドを使用します。

classmethod UpdateDictionary(pTermList As %String, 
                             pCube As %String = "", 
                             pMeasure As %String = "", 
                             pClearFirst As %Boolean = 0) as %Status

以下は、この指定の説明です。

  • pTermList は、用語リストの名前です。

  • pCube は、キューブの名前です。この引数を省略した場合、このメソッドは、このネームスペースのすべてのキューブに対して起動されます。

  • pMeasure は、iKnow メジャーの名前です。この引数を省略した場合、このメソッドは、指定されたキューブ (または pCube によってはすべてのキューブ) のすべての iKnow メジャーに対して起動されます。

  • pClearFirst は、再ロードする前に既存のディクショナリを用語リストから削除するかどうかを制御します。条件リストへの追加のみを実行した場合は pClearFirst に 0 を、既存の用語を変更または削除した場合は 1 を使用します。

    pClearFirst が 0 の場合、このメソッドは大幅に高速実行できます。

キューブの構築時に、新しい条件リストを追加することによって、このキューブによって使用されるすべてのディクショナリが更新されます。削除した項目および名前を変更した項目は、影響を受けません。この章で後述する、“iKnow の更新が実行されるタイミング” を参照してください。

iKnow エンティティ・ディメンジョンの定義

iKnow エンティティ・ディメンジョンを追加する手順は以下のとおりです。

  1. この章の前半で示した説明に従って、このディメンジョンで使用する iKnow メジャーを作成します。

    この操作は、ディメンジョンを定義したでも実行できます。その場合は、後でディメンジョンを編集して、ディメンジョンがこのメジャーを参照するようにします。

  2. [要素の追加] を選択します。

    ダイアログ・ボックスが表示されます。

  3. [新規項目名の入力] に、ディメンジョン名を入力します。

  4. [iKnow ディメンジョン] を選択し、[OK] を選択します。

  5. アーキテクトの中央領域でディメンジョンを選択します。

  6. 必要に応じて、ディメンジョンに以下の変更を加えます。

    • [iKnow タイプ][エンティティ] を選択します。

    • [iKnow メジャー] — このディメンジョンで使用する iKnow メジャーを選択します。

  7. アーキテクトの中央領域でレベルを選択し、必要に応じて [名前][表示名] を変更します。

  8. 必要に応じて、このレベルのメンバを手動で指定し、スタジオを使用してそのレベル内に <member> 要素を定義します。

    このレベルは、既定ではすべてのエンティティで構成され、分散の降順に並べ替えられています。<member> を使用して手動でメンバを指定する場合、それによってこのレベルのメンバとその順序が指定されます。iKnow エンティティ・ディメンジョンの場合、アナライザに表示されるメンバ数は 100 個に固定されています。

    キューブおよびサブジェクト領域の高度な機能の使用” の章の “レベルのメンバの手動指定” を参照してください。

ディメンジョンまたはレベルのどちらでも、[ソース値] には何も指定する必要がないことに注意してください。iKnow ディメンジョンの場合、ソース値は関連付けられている iKnow メジャーによって指定されます。

iKnow ディクショナリ・ディメンジョンの定義

iKnow ディクショナリ・ディメンジョンを追加する手順は以下のとおりです。

  1. iKnow ディクショナリを Caché にロードします。この章で前述した “iKnow ディクショナリのロード” を参照してください。

    この操作は、ディメンジョンを定義したでも実行できます。

  2. このディメンジョンで使用する iKnow メジャーを作成します。

    この操作は、ディメンジョンを定義したでも実行できます。その場合は、後でディメンジョンを編集して、ディメンジョンがこのメジャーを参照するようにします。

  3. [要素の追加] を選択します。

    ダイアログ・ボックスが表示されます。

  4. [新規項目名の入力] に、ディメンジョン名を入力します。

  5. [iKnow ディメンジョン] を選択し、[OK] を選択します。

  6. アーキテクトの中央領域でディメンジョンを選択します。

  7. 必要に応じて、以下のように変更します。

    • [iKnow タイプ][ディクショナリ] を選択します。

    • [iKnow メジャー] — このディメンジョンで使用する iKnow メジャーを選択します。

  8. 必要に応じて、このディメンジョンの同じ階層に別のレベルを追加します。

    ディメンジョンにレベルが 1 つだけ存在する場合、そのレベルを使用してディクショナリ項目にアクセスします。ディメンジョンにレベルが 2 つ存在する場合、下位レベルを使用してディクショナリ項目に一致するエンティティにアクセスします。

  9. アーキテクトの中央領域で各レベルを選択し、必要に応じて [名前][表示名] を変更します。

  10. アーキテクトにキューブ定義を保存します。

  11. スタジオでキューブ・クラスを開き、このディメンジョンの定義を検索します。例えば、ディメンジョンにレベルが 1 つ存在する場合、以下のように表示されます (この例では改行が追加されています)。

    <dimension name="MyDictionaryDimension" disabled="false" 
     ` hasAll="false" allCaption="MyDictionaryDimension" allDisplayName="MyDict" 
      type="iKnow" iKnowType="dictionary"  iKnowMeasure="Report" 
      hidden="false" showHierarchies="default">
        <hierarchy name="H1" disabled="false">
          <level name="Dictionary" disabled="false" list="false" useDisplayValue="true">
          </level>
        </hierarchy>
    </dimension>
    

    または、ディメンジョンにレベルが 2 つ存在する場合、以下のように表示されます。

    <dimension name="MyDictionaryDimension" disabled="false" 
      hasAll="false" allCaption="MyDictionaryDimension" allDisplayName="MyDict" 
      type="iKnow" iKnowType="dictionary"  iKnowMeasure="Report" 
      hidden="false" showHierarchies="default">
        <hierarchy name="H1" disabled="false">
          <level name="Dictionary" disabled="false" list="false" useDisplayValue="true">
          </level>
          <level name="Items" disabled="false" list="false" useDisplayValue="true">
          </level>
        </hierarchy>
    </dimension>
    
  12. ディクショナリ・レベルで、必要に応じてこのレベルで使用する iKnow ディクショナリを 1 つまたは複数指定します。レベルが 2 つ存在する場合、高いほうのレベルがディクショナリ・レベルになります。レベルが 1 つ存在する場合、そのレベルがディクショナリ・レベルになります。

    iKnow ディクショナリを指定しない場合、すべてのディクショナリが使用されます。

    使用する iKnow ディクショナリごとに、<level> 要素と </level> の間に以下を追加します。

            <member name="dictionary name" />
    
    

    dictionary name は、iKnow ディクショナリの名前です。

    例えば、iKnow ディクショナリを 1 つ使用する場合、以下のようになります。

    <dimension name="MyDictionaryDimension" disabled="false" 
      hasAll="false" allCaption="MyDictionaryDimension" allDisplayName="MyDict" 
      type="iKnow" iKnowType="dictionary"  iKnowMeasure="Report" 
      hidden="false" showHierarchies="default">
        <hierarchy name="H1" disabled="false">
          <level name="Dictionary" disabled="false" list="false" useDisplayValue="true">
             <member name="my dictionary" />
          </level>
          <level name="Items" disabled="false" list="false" useDisplayValue="true">
          </level>
        </hierarchy>
    </dimension>
    
  13. スタジオにキューブ定義を保存します。

ディメンジョンまたはレベルのどちらでも、[ソース値] には何も指定する必要がないことに注意してください。iKnow ディメンジョンの場合、ソース値は関連付けられている iKnow メジャーによって指定されます。

項目レベルへのメンバ・オーバーライドの追加

レベルが 2 つ存在するディクショナリ・ディメンジョン内では、既定で、ディクショナリ・レベルによって下位項目レベルのメンバが決定されます。この項目レベルに、親によって決定される定義をオーバーライドする <member> 要素を追加できます。

これは、例えば、ディクショナリのサブセットのみ表示する必要がある場合に便利です。

このようなオーバーライドを作成する場合、各 <member> 要素は、以下の形式で指定する必要があります。

        <member name="itemURI" displayName="displayName" />

itemURI はディクショナリ項目の一意の URI、displayName はディクショナリ項目の表示名です。この章で前述した “iKnow ディクショナリのロード” を参照してください。

<member> 要素を、必要に応じて並べ替えてリストします。以下はその例です。

  <level name="ReportDictInjuriesDimItem" displayName="Injuries" >
     <member name=":injuries:none" displayName="not injured" />
     <member name=":injuries:minor" displayName="minor injuries" />
     <member name=":injuries:serious" displayName="serious injuries" />
     <member name=":injuries:fatal" displayName="killed" />
  </level>

これらのオーバーライドは以下のように機能します。

  • 少なくとも 1 つの <member> 要素が、指定されたディクショナリ項目とマッチング可能である場合、このレベルには、これらの <member> 要素によってリストされるメンバのみが含まれます。

  • ディクショナリ項目とマッチング可能な <member> 要素が存在しない場合、これらのオーバーライドはすべて無視されます。

iKnow プラグインを使用するメジャーの追加

プラグインは事実上クエリです。DeepSee には、専用の iKnow クエリを実行するプラグインが用意されています。これらのプラグインを使用し、エンティティの出現および一致結果に関する情報を提供する計算メジャーを追加できます。以降のセクションで詳細を説明します。

エンティティ出現を数値化するメジャーの追加

エンティティ出現に関する情報 (合計数、レコードあたりの平均数など) を提供するメジャーを簡単に追加できます。例は、Aviation Events キューブの計算メジャー Distinct Entity Count を参照してください。

独自のメジャーを追加するには、"DeepSee モデルの定義" の “計算メジャーの定義” の手順に従います。[式] には、以下の式を使用します。

%KPI("%DeepSee.iKnow","Result",1,"aggregate","total","%CONTEXT")

この式は、あらゆるコンテキストにおいて、個別のエンティティの合計数を返します。

"total" の代わりに、以下のいずれかを使用できます。

  • "sum" — この場合、式は、指定したコンテキストにおいて、(個別のエンティティではなく) エンティティの合計数を返します。つまり、エンティティが複数回カウントされる場合があります。

  • "average" — この場合、式は、指定したコンテキストにおいて、レコードあたりのエンティティの平均数を返します。

  • "max" — この場合、式は、指定したコンテキストのあらゆるレコードのエンティティの最大数を返します。

  • "min" — この場合、式は、指定したコンテキストのあらゆるレコードのエンティティの最小数を返します。

この式は、%KPI MDX 関数および iKnow プラグイン・クラス %DeepSee.PlugIn.iKnowOpens in a new tab を使用します。この関数の詳細は、"DeepSee MDX リファレンス" を参照してください。このクラスの詳細は、クラス・リファレンスを参照してください。

Important:

"%CONTEXT" を省略すると、あらゆる場合で、計算メジャーは、すべてのコンテキストを無視し、データ・セット全体の結果を返します。

一致結果を数値化するメジャーの追加

ディクショナリ・マッチング結果に関する情報 (合計数、レコードあたりの平均一致スコアなど) を提供するメジャーを簡単に追加できます。例は、Aviation Events キューブの計算メジャー Dictionary Match Count および Total Dictionary Score を参照してください。

独自のメジャーを追加するには、"DeepSee モデルの定義" の “計算メジャーの定義” の手順に従います。[式] には、以下の式のいずれかを使用します。

  • 一致結果 (ディクショナリ項目と一致する結果) の数を取得するには、以下の式を使用します。

    %KPI("%DeepSee.iKnowDictionary","MatchCount",1,"aggregate","sum","%CONTEXT")
    

    この式は、あらゆるコンテキストにおいて、一致する結果の合計数を返します。

    "sum" の代わりに、前のセクションでリストした代替の集約タイプを使用できます。

  • 一致する結果のスコアを取得するには、以下の式を使用します。

    %KPI("%DeepSee.iKnowDictionary","MatchScore",1,"aggregate","sum","%CONTEXT")
    

    この式は、あらゆるコンテキストにおいて、一致する結果の合計スコアを返します。

    "sum" の代わりに、前のセクションでリストした代替の集約タイプを使用できます。

これらの式は、%KPI MDX 関数および iKnow プラグイン・クラス %DeepSee.PlugIn.iKnowDictionaryOpens in a new tab を使用します。この関数の詳細は、"DeepSee MDX リファレンス" を参照してください。このクラスの詳細は、クラス・リファレンスを参照してください。

Important:

"%CONTEXT" を省略すると、あらゆる場合で、計算メジャーは、すべてのコンテキストを無視し、データ・セット全体の結果を返します。

リストへの iKnow 結果の組み込み

以下のようにリストに iKnow 結果を組み込むことができます。

リストに iKnow サマリ・フィールドを含める方法

構造化されていないテキストのサマリをリストに追加できると便利です。このようなサマリを追加するには、リスト・フィールド定義内で $$$IKSUMMARY トークンを使用します。このトークンは、2 つの引数 (角括弧で囲みます) を取ります。

$$$IKSUMMARY[iKnowMeasure,summarylength] As Report

iKnowMeasure はサマリを作成する iKnow メジャーの名前、summary_length はサマリに追加する文の数 (既定値は 5) です。キューブに iKnow メジャーが 1 つしかない場合、iKnowMeasure を省略できます。

As 節は、列のタイトルを指定します。この場合、タイトルは Report です。

$$$IKSUMMARY トークンは、ソースと最も関連性のある文を返し、最大 32000 文字の文字列に連結します。

以下に例を示します。

<listing name="Default" disabled="false" listingType="table" 
    fieldList="%ID,EventId,Year,AirportName,$$$IKSUMMARY[Report] As Report">
</listing>

内部で $$$IKSUMMARY は、%iKnow.Queries.SourceAPIOpens in a new tabGetSummary() メソッドを使用します。

リスト・キューブと関連キューブの間に多対一のリレーションシップがある場合は、$$$IKSUMMARY トークンを使用して関連キューブ内の iKnow メジャーを参照することもできます。その場合、iKnowMeasure の代わりに relationshipname.iKnowMeasure$$$IKSUMMARY の最初の引数として使用します。例えば、Observations キューブに、Patients キューブを指す Patient という名前のリレーションシップがあるとします。また、Patients キューブには、History という名前の iKnow メジャーがあるとします。Observations キューブ内で、$$$IKSUMMARY[Patient.History] を含むリストを定義できます。

同様に、リレーションシップのリレーションシップを参照することもできます。例 : $$$IKSUMMARY[Relationship.Relationship.Measure]

iKnow コンテンツ分析プラグインで使用する専用リストの作成

アナライザに用意されている高度な分析オプションの 1 つとして、iKnow コンテンツ分析プラグインがあります。このオプションは、詳細リストを使用して、最も一般的なレコード 5 件および最も一般的でないレコード 5 件を表示します。既定では、このプラグインは、キューブの既定リストを使用します。

容量の問題で、ここで使用するためだけのリストを作成するものとします。ShortListing という名前のリストを定義した場合は、プラグインは代わりにこのリストを使用します。

どちらの場合も、プラグインは、リストに定義されている列の右側に Score 列を追加します。

この分析オプションの詳細は、"DeepSee エンド・ユーザ・ガイド" の “iKnow コンテンツ分析” を参照してください。

DeepSee による iKnow ドメインの管理

この章で説明されている iKnow 機能を使用する際、1 つまたは複数の iKnow ドメインが作成されます。これらの iKnow ドメインは、("iKnow の使用法" で説明されているユーザが直接作成した iKnow ドメインと異なり) DeepSee により管理されます。これらを変更するには、この章で説明されている API のみを使用する必要があります。

DeepSee によるこれらのドメインの管理は、ユーザによる操作をほとんど、あるいはまったく必要としない方法で行われます。ここでは、iKnow ドメインに精通し、管理方法の詳細に興味があるユーザを対象に説明します。

ユーザがキューブに iKnow メジャーを 1 つ追加すると、システムによって iKnow ドメインが 1 つ作成されます。このドメインの名前は DeepSee@cubename@measurename です。cubename はキューブの論理名、measurename は iKnow メジャーの論理名です。

DeepSee では、これらのドメインが以下のように管理されます。

  • キューブを初めてコンパイルするときに、必要なドメインが作成されます。

  • キューブを構築する際、DeepSee は自動的に iKnow エンジンを起動します。iKnow エンジンによって、iKnow メジャーのテキストが処理され、結果が格納されます。

  • キューブを再コンパイルするときは、必要なドメインが存在するかどうかのチェックが行われます。存在する場合、それらが再利用されます。存在しない場合、作成されます。

    特定のドメインが再利用可能かどうかのチェックでは、各 iKnow メジャーの (論理名ではなく) ソース値またはソース式が考慮されます。したがって、iKnow メジャーの名前を変更した場合も、既存の iKnow ドメインが再利用されます。

  • iKnow メジャーを削除してキューブを再コンパイルすると、対応する iKnow ドメインおよび関連付けられていた iKnow エンジンのすべての結果が削除されます。

  • キューブを削除すると、その iKnow ドメインおよび関連付けられていた iKnow エンジンのすべての結果が削除されます。

その他のトピック

このセクションでは、以下のその他のトピックについて説明します。

メジャーの iKnow ドメイン・パラメータの指定

まれに、指定された iKnow メジャーで使用する既定の iKnow ドメイン・パラメータをオーバーライドする必要がある場合があります。そのためには、スタジオでキューブ・クラスを編集し、該当する iKnow メジャーの定義に以下を追加します。

iKnowParameters="parameter::value;parameter::value"

parameter には、パラメータ名またはパラメータを表すマクロを使用します。パラメータとその値の間に 2 つのコロンを使用します。リストの名前と値のペア同士の間は、セミコロンで区切ります。

以下の例では、DefaultConfig パラメータおよび MAT:SkipRelations パラメータの既定の値がオーバーライドされます。

iKnowParameters="DefaultConfig::Spanish;MAT:SkipRelations::0"

iKnow ドメイン・パラメータの詳細は、"iKnow の使用法" の “iKnow 環境の設定” を参照してください。

iKnow ブラック・リストのロード

ブラック・リストは、クエリが返す結果に含めたくないエンティティのリストです。DeepSee で使用するために iKnow ブラック・リストをロードするには、以下の手順を実行します。

  1. ブラック・リスト項目で構成される条件リストを作成します。条件リストの作成の詳細は、"DeepSee 実装ガイド" の “条件リストの定義” を参照してください。

  2. このブラック・リストを使用する iKnow メジャーを編集します。そのためには、スタジオでメジャーを編集し、iKnowParameters 属性を指定します。この属性には、1 つ以上の名前と値のペアが含まれています。名前は iKnow ドメイン・パラメータで、値はそれに対応する値です。iKnowParameters の指定に関する一般情報は、この章で前述した “メジャーの iKnow ドメイン・パラメータの指定” を参照してください。

    この場合、iKnow ドメイン・パラメータは $$$IKPDSBLACKLIST で、その値は条件リスト名です。

  3. キューブを再構築するか、条件リストをブラック・リストとして手動でロードします。

    条件リストをブラック・リストとして手動でロードするには、以下の %iKnow.DeepSee.CubeUtilsOpens in a new tab のクラス・メソッドを使用します。

    classmethod LoadTermListAsBlackList(pCube As %String, 
                                         pMeasure As %String, 
                                         pTermList As %String) as %Status
    

    以下は、この指定の説明です。

    • pCube は、この iKnow メジャーを使用するキューブの名前です。

    • pMeasure は、このブラック・リストを使用する iKnow メジャーの名前です。

    • pTermList は、用語リストの名前です。

このブラック・リストは、以下の目的で使用されます。

  • アナライザで、または直接 MDX を使用して、エンティティ・ディメンジョンから返されたエンティティをフィルタ処理する。

  • [エンティティ分析] 画面に表示される上位グループの派生からのエンティティを除外する ("DeepSee エンド・ユーザ・ガイド" の “[ピボット分析] ウィンドウの使用” の章を参照してください)。ブラック・リスト化されたエントリ (またはそれらの標準化された形式) は、それら自体でグループになることはありませんが、他のグループのスコアに引き続き寄与します。例えば、pilot がブラック・リスト化されても、helicopter pilot は、helicopter グループにまだ属しています。

  • [エンティティ分析] 画面の [エンティティの詳細] タブに表示されるエンティティをフィルタ処理する。

ブラック・リストは、[エンティティ分析] 画面の [文字列の分析] オプションの補助テキスト・エントリには影響しません。

iKnow ブラック・リストの更新

iKnow ブラック・リストを更新するには、対応する条件リストを編集してから、キューブを再構築するか、条件リストをブラック・リストとして手動でロードします (前のサブセクションを参照)。

iKnow の更新が実行されるタイミング

以下のテーブルは、iKnow がディクショナリ、ブラック・リスト、およびマッチング結果を更新するタイミングをまとめたものです。

操作 iKnow の自動更新
キューブのコンパイル なし
キューブの構築
  • 新しい条件リストを追加することによって、このキューブが使用するすべてのディクショナリを更新 (削除した項目および名前を変更した項目は影響を受けません)

  • キューブが使用する条件リストのすべてのブラック・リストの完全な更新

  • 一致する結果の完全な更新

キューブの同期
  • ディクショナリまたはブラック・リストの更新なし

  • ファクト・テーブル内の新しいレコードの結果の作成

API または管理ポータルを使用した条件リストの更新 なし
%iKnow.DeepSee.CubeUtilsOpens in a new tabUpdateDictionary() メソッドを使用した条件リストの更新
  • 指定した条件リストが表すディクショナリの完全な更新

  • 指定した条件リストに対する一致する結果の完全な更新

FeedbackOpens in a new tab