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 のセマンティック優位性は、%iKnow.Semantics.DominanceAPIOpens in a new tab%iKnow.Semantics.ProximityAPIOpens in a new tab の 2 つのクラスで構成されます。これらのクラスのパラメータとメソッドの詳細は、"インターシステムズ・クラス・リファレンス" を参照してください。

この章では、以下について説明します。

意味的優位性

意味的優位性とは、ソースに含まれる 1 つのエンティティの全体的な重要性のことです。iKnow は、以下のテストを実行し、統計的な結果を取得することで、意味的優位性を判断します。

  • ソース内でのエンティティの出現回数 (頻度)

  • ソース内でのエンティティの各構成単語の出現回数

  • エンティティの単語数

  • エンティティのタイプ (概念または関係)

  • ソースでのエンティティの多様性

  • ソースでの構成単語の多様性

Note:

日本語については、エンティティの意味的優位性の計算に、これとは別の言語固有の統計セットを使用します。”iKnow Japanese の概要Opens in a new tab” を参照してください。

iKnow では、iKnow のインデックス作成の一部としてソースがロードされた際にこれらの値を生成します。ここでは、これらの値を組み合わせて、各エンティティの優位性スコアを生成します。優位性スコアが高くなるほど、ソース内でのエンティティの優位性が高くなります。

例えば、概念 “心臓血管外科“ をドキュメント内で意味的に優位にするには、統計的分析を実行することになります。ここでは、その概念がソース内に 20 回出現すると算出されます。優位概念は、上位概念と同じではありません。このソースでは、概念の “医者“ (60 回)、“外科“ (50 回)、“手術室“ (40 回)、および “手術の手順“ (30 回) のほうがはるかに一般的です。しかし、“心臓血管外科“ の構成単語は、“心臓血管“ (50 回) および “外科“ (80 回) と概念自体の回数よりも 2 倍多く出現し、優位性の高い概念になるサポートとなります。対照的に、概念の “手術室“ は 40 回出現しますが、その構成単語は、“手術“ が 60 回、“室“ が 45 回のみで、出現回数が概念よりわずかに多いだけです。これにより、このソースでは、心臓血管の問題や外科への関心が部屋への関心よりも高いことが示されます。

iKnow では、これらの出現頻度の回数が多いまたは少ないという比重は、元のエンティティ内の単語数およびそのエンティティが概念であるか、あるいは関係であるかに基づいて指定されます。(通常、関係の発生は、概念よりも回数がはるかに少なくなります。)

ただし、概念の優位性が実際に高いかどうかを決定するには、iKnow でソース内の概念の合計数と比較する必要があります。ソース内の概念の 5% に “心臓血管“ と “外科“ という単語が含まれ、他の概念でのこれらの単語の組み合わせがソース内での組み合わせほど頻度が高くない場合は、これらの単語はソース内で頻繁に出現するだけではなく、そのソースの内容は範囲が広くないことがわかります。しかし、そのソースで、“手“、“腎臓“ および “脳“ という概念内に “外科“ という単語がほぼ同頻度で出現し、“心臓血管“ という単語が “運動“ や “ダイエット“ などの単語と同頻度で出現する場合は、そのソースの内容は範囲が広いと考えられます。“心臓血管外科“ という概念とその構成単語が他の単語より多く出現したとしても、そのソースの内容における優位性がそれほど高くない可能性もあります。

これらの統計的な計算を実行することによって、iKnow は、ソース内の優位性の高い概念、つまり最も関心を引くサブジェクトを決定できます。iKnow では、外部参照コーパス (“一般的な“ 医療テキストにおける単語の相対頻度を記載した既存テーブルなど) を使用することなく、この分析を実行します。iKnow では、実際のソース・テキストのコンテンツのみを使用して優位性を決定し、その結果、内容に関する知識を前もって持っていなくても、すべてのトピックのソースでその優位性を使用できます。

コンテキストにおける優位性

iKnow では、ソースに含まれるエンティティの優位性 (概念と関係) を計算して、それぞれに整数の値を割り当てます。ソース内で最も優位性の高い概念には、優位性の値に 1000 を割り当てます。インデックス作成結果ツールを使用すると、1 つのソースに含まれる概念に対する優位性の値をリストできます。

iKnow は、ソース内の CRC の優位性を計算します。このアルゴリズムでは、CRC 内でエンティティの優位性の値を使用します。CRC 優位性の値は、別の CRC 優位性の値と比較することのみを目的としています。CRC 優位性の値は、エンティティ優位性の値と比較することを意図していません。インデックス作成結果ツールを使用すると、1 つのソースに含まれる CRC に対する優位性の値をリストできます。

iKnow は、ロードされたすべてのソースにわたる概念の優位性を加重平均として計算します。この概念優位性のスコアは小数値で、最大値は 1000 です。ナレッジ・ポータル・ツールの [優位性の高い概念] オプションを使用すると、ロードされたすべてのソースに含まれる概念に対する優位性スコアをリストできます。また、%iKnow.Semantics.DominanceAPIOpens in a new tabGetTop()Opens in a new tab メソッドを使用して、ロードされたすべてのソースに含まれる概念に対する優位性スコアをリストすることもできます。

意味的優位性の概念

意味的優位性の主な要素を以下に示します。

  • プロファイル : 優位性スコアを計算するために使用する要素の数です。

  • 標準 : 標準ソースとは、そのソース内で優位性が高いエンティティがそのグループのソースで優位性が高い要素と非常に類似するソースです。これは、ブレークの逆になります。

  • ブレーク : ブレーク・ソースとは、そのソースで優位性が高いエンティティがそのグループのソースで優位性が高い要素と最も類似しないソースです。これは、標準の逆になります。例えば、ブレークの報道記事は、前月からの報道記事のすべてで優位性が高いエンティティと最も類似しないことになると考えられます。

  • 重複 : 異なるソース内における、単一エンティティの出現数です。

  • 相関 : 各ソースに対する相関の割合を返す、ソース内エンティティとエンティティ・リストとの比較です。

意味的優位性の例

この章では、以下のような意味的優位性を持つクエリについて説明し、その例を示します。

優位性プロファイル数

以下の例では、GetProfileCountByDomain()Opens in a new tab メソッドを使用して、指定されたドメイン内のエンティティ・タイプに対する一意の値の合計カウントを返します。使用可能なエンティティ・タイプは、0 = 概念 ($$$SDCONCEPT または $$$SDENTITY)、1 = 関係 ($$$SDRELATION)、2 = CRC ($$$SDCRC)、4 = 集約 (既定値、$$$SDAGGREGATE) に対応し、集約は概念、関係、および CRC のすべての合計です。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
ProfileCounts
  WRITE ##class(%iKnow.Semantics.DominanceAPI).GetProfileCountByDomain(domId,$$$SDCONCEPT)," total concepts",!
  WRITE ##class(%iKnow.Semantics.DominanceAPI).GetProfileCountByDomain(domId,$$$SDRELATION)," total relations",!
  WRITE ##class(%iKnow.Semantics.DominanceAPI).GetProfileCountByDomain(domId,$$$SDCRC)," total CRCs",!
  WRITE ##class(%iKnow.Semantics.DominanceAPI).GetProfileCountByDomain(domId)," aggregate total",!

ドメイン内で上位の優位性スコアを持つ概念

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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
SourceCount
  SET numSrcD=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)
  WRITE "The domain contains ",numSrcD," sources",!!
DominantConcepts
  DO ##class(%iKnow.Semantics.DominanceAPI).GetTop(.profresult,domId,1,50)
  WRITE "Top Concepts in Domain by Dominance Score",!
  SET j=1
  WHILE $DATA(profresult(j),list) {
     WRITE $LISTGET(list,2)
     WRITE ": ",$LISTGET(list,3),!
     SET j=j+1 }
  WRITE !,"Printed ",j-1," dominant concepts"

ドメイン内の CRC 優位性スコア

GetProfileByDomain()Opens in a new tab メソッドは、ドメイン内の CRC に対する優位性スコアを返します。各エンティティは以下を返します。

  • 一意の整数である、エンティティのソース ID。

  • エンティティ値 (外部 ID)。このメソッドでは 1 つの概念しか返すことができませんが、CRC は複数の概念と関係で構成されるため、この値はリスト構造で返されます。

  • 整数コードでのエンティティ・タイプは、0 = 概念 (既定値、$$$SDCONCEPT または $$$SDENTITY)、1 = 関係 ($$$SDRELATION)、2 = CRC ($$$SDCRC) となります。4 = 集約 ($$$SDAGGREGATE) では、最初に概念がすべて返され、次にすべての関係、最後にすべての CRC が返されます。

    Note:

    パスは現時点においてサポートされていません。

  • 計算済みの優位性の値。概念および関係の優位性の値は常に整数です。CRC の優位性の値は、整数、または 3480.5 などの小数値になる可能性があり、小数値は整数の半分の割合になります。

以下の例では、GetProfileByDomain()Opens in a new tab メソッドを使用して、優位性の高いプロファイル・エンティティを返します (この場合は CRC)。各 CRC については、値、ソース ID、タイプ、および優位性スコアを返します。これらはすべて CRC であるため、タイプは常に 2 となります。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
SourceSentenceQueries
  SET numSrcD=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)
  WRITE "The domain contains ",numSrcD," sources",!
  SET numSentD=##class(%iKnow.Queries.SentenceAPI).GetCountByDomain(domId)
  WRITE "These sources contain ",numSentD," sentences",!!
DominanceProfile
  DO ##class(%iKnow.Semantics.DominanceAPI).GetProfileByDomain(.profresult,domId,1,20,$$$SDCRC)
  SET j=1
  WHILE $DATA(profresult(j),list) {
      WRITE " ",$LISTTOSTRING($LISTGET(list,2))
      WRITE " [Id:",$LISTGET(list,1)
      WRITE " type:",$LISTGET(list,3)
      WRITE " Dominance:",$LISTGET(list,4),"]",!
      SET j=j+1 }
  WRITE !,"Printed ",j-1," dominant profile CRCs"

指定エンティティ対する優位性スコア

iKnow は、GetDomainValue()Opens in a new tab メソッドを使用して、指定のエンティティに対する優位性の値を返します。エンティティは、エンティティ ID (一意の整数) で指定し、数値コードでエンティティ・タイプを指定します。既定のエンティティ・タイプは 0 (概念) です。

単一セットの一意のエンティティ ID は概念と関係に対して使用されるため、概念が関係と同じエンティティ ID を持つことはありません。別のセットの一意のエンティティ ID が CRC に使用されるため、CRC は、概念または関係と同じエンティティ ID を持つ可能性があります。この番号付けは全体で同時に行われ、エンティティ間での接続はありません。

以下の例では、上位 12 エンティティを取得して、各エンティティの優位性スコアを判定しています。この例の結果からわかることは、上位 (最も頻繁に出現する) のエンティティが、必ずしも高優位性スコアのエンティティと対応しているわけではないという事実です。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
TopEntitiesDominanceScores
  DO ##class(%iKnow.Queries.EntityAPI).GetTop(.result,domId,1,12)
  SET i=1
  WHILE $DATA(result(i)) {
       SET topstr=$LISTTOSTRING(result(i),",",1)
       SET topid=$PIECE(topstr,",",1)
       SET val=$PIECE(topstr,",",2)
         SET spc=25-$LENGTH(val)
       WRITE val
       WRITE $JUSTIFY("top=",spc),i
       WRITE " dominance="
       WRITE ##class(%iKnow.Semantics.DominanceAPI).GetDomainValue(domId,topid,0),!
       SET i=i+1 }
  WRITE "Top ",i-1," entities and their dominance scores"

ソース間の重複

以下の例では、GetOverlap()Opens in a new tab メソッドを使用して、各エンティティの重複スコアを返します。このスコアは、エンティティに対するすべてのドメイン内ソースにおいての重複出現数です。GetOverlap() を呼び出せるようになる前に、BuildOverlap()Opens in a new tab を呼び出す必要があることに注意してください。結果の表示では、この例において返された値すべてがタイプ = 0 (概念) なので、それらについての表示は省略されています。この例では、$JUSTIFY 関数が使用されて、重複数の表示を配置しています。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
SourceSentenceQueries
  SET numSrcD=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)
  WRITE "The domain contains ",numSrcD," sources",!
  SET numSentD=##class(%iKnow.Queries.SentenceAPI).GetCountByDomain(domId)
  WRITE "These sources contain ",numSentD," sentences",!!
Overlap
  DO ##class(%iKnow.Semantics.DominanceAPI).BuildOverlap(domId)
  DO ##class(%iKnow.Semantics.DominanceAPI).GetOverlap(.result,domId,1,17)
DisplayOverlapResults
  SET i=1
  WHILE $DATA(result(i)) {
       SET datastr=$LISTTOSTRING(result(i),",",1)
          SET spc=40-$LENGTH(datastr)
       WRITE $PIECE(datastr,",",1)," "
       WRITE $LISTTOSTRING($PIECE(datastr,",",2))
       /* WRITE $PIECE(datastr,",",3)," " */
          WRITE $JUSTIFY(" overlap=",spc)
       WRITE $PIECE(datastr,",",4),!
       SET i=i+1 }

標準ソース

以下の例では、優位性スコアで最も標準的なソースを 10 個リストしています。標準的なソースを取得するには、GetOverlap()Opens in a new tab メソッドに続いて、FindMostTypicalSources()Opens in a new tab および GetTypicalSources()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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
SourceCountQueries
  WRITE ##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)," total sources",!!
DominanceTypicalSources
  SET dstat = ##class(%iKnow.Semantics.DominanceAPI).BuildOverlap(domId)
  IF dstat '=1 {WRITE "BuildOverlap() error"  QUIT}
  SET dstat = ##class(%iKnow.Semantics.DominanceAPI).FindMostTypicalSources(domId)
  IF dstat '=1 {WRITE "FindMostTypicalSources() error"  QUIT}
  SET dstat = ##class(%iKnow.Semantics.DominanceAPI).GetTypicalSources(.srcresult,domId,1,10)
  IF dstat '=1 {WRITE "GetTypicalSources() error"  QUIT}
  SET k=1
  WHILE $DATA(srcresult(k)) {
        WRITE $LISTTOSTRING(srcresult(k)),!
        SET k=k+1 }

ブレーク・ソース

ブレーク・ソースとは、ドメイン内の他のソースとは大幅に異なるソース (すなわち、ドメインのフィルタ処理されたサブセット) のことです 。ブレーク・ソースを取得するには、GetOverlap()Opens in a new tab メソッドに続いて、FindBreakingSources()Opens in a new tab および GetBreakingSources()Opens in a new tab メソッドを発行する必要があります。

以下のプログラムでは、各ブレーク・ソースの識別後に、GetBySource()Opens in a new tab を使用して、各ブレーク・ソースで優位性の高いエンティティを返します。各エンティティは以下を返します。

  • エンティティ ID。これは、エンティティ・タイプの一意の整数です。ただし、GetBySource() では複数のエンティティ・タイプ (概念、関係、CRC) が返されるため、このエンティティ ID は指定されたタイプ内でのみ一意で、意味を成します。

  • エンティティ値。これは、1 つの概念、または概念と関係のリストになります。このリストは CRC にできます。(表示を簡略化するため、ここではエンティティ値がコメント化されています。)

  • エンティティ・タイプ。これは、0 が概念、1 が関係、3 が CRC、あるいは 3 より大きな奇数はパスになります。このパスの値は、パス内の要素の数に対応します。パス内の要素の数が偶数の場合は、エンティティ・タイプはその次の奇数より大きな数になります。

  • 優位性の値。これは、1 よりも大きい計算された正の数となります。優位性の値が高くなるほど、そのソース内でエンティティの優位性が高くなります。概念または関係の優位性の値は整数で、CRC またはパスの優位性の値には小数が含まれることがあります。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
SourceCountQueries
  WRITE ##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)," total sources",!!
DominanceBreakingSources
  SET dstat = ##class(%iKnow.Semantics.DominanceAPI).BuildOverlap(domId)
  IF dstat '=1 {WRITE "BuildOverlap() error"  QUIT}
  SET dstat = ##class(%iKnow.Semantics.DominanceAPI).FindBreakingSources(domId)
  IF dstat '=1 {WRITE "FindBreakingSources() error"  QUIT}
  DO ##class(%iKnow.Semantics.DominanceAPI).GetBreakingSources(.profresult,domId,1,10)
  SET j=1,k=1
  WHILE $DATA(profresult(j),srclist) {
    SET src = $LISTGET(srclist)
    WRITE !,"Source id: ",src,!
    DO ##class(%iKnow.Semantics.DominanceAPI).GetBySource(.srcresult,domId,src,1,10)
    WHILE $DATA(srcresult(k),list) {
          WRITE "id:",$LISTGET(list)
          /* WRITE "  values:",$LISTTOSTRING($LISTGET(list,2)) */
          WRITE "  type:",$LISTGET(list,3),"  dominance:",$LISTGET(list,4),!
          SET k=k+1 }
    SET k=1
    SET j=j+1 }
  WRITE !!,"Printed ",j-1," breaking sources"

相関性によるソース

GetSourcesByCorrelation()Opens in a new tab はエンティティのリストと相関するソースを返し、ソースのエンティティとエンティティ・リストとの相関の割合を計算します。相関の割合が 1 (100%) では、ソースの相関とリストされたエンティティが同数となります。ただし、リストされたエンティティがすべてソース内に出現するわけではありません。これにより、1 よりも大きい相関割合を返すことも可能です。相関性 0 % のソースはリストされません。

相関性によってソースを取得するには、GetOverlap()Opens in a new tab メソッドに続いて、GetSourcesByCorrelation() メソッドを発行する必要があります。フィルタを GetOverlap() に指定して、相関性をテストするためのソース・セットを制限することができます。

以下の例では、ソースとヘリコプタを意味する概念のリストとの比較により、ソースをテストしています。ここでは、ソース ID、外部 ID、および相関性の割合を返しています。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
SourceSentenceQueries
  SET numSrcD=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)
  WRITE "The domain contains ",numSrcD," sources",!
  SET numSentD=##class(%iKnow.Queries.SentenceAPI).GetCountByDomain(domId)
  WRITE "These sources contain ",numSentD," sentences",!!
SourcesByCorrelation
  DO ##class(%iKnow.Semantics.DominanceAPI).BuildOverlap(domId)
  SET heliterms=$LB(796,1048,1706,2484,2571,2637,2642,2653,3284,3987,4037,4038,4054,4957)
  DO ##class(%iKnow.Semantics.DominanceAPI).GetSourcesByCorrelation(.result,domId,heliterms)
DisplaySourcesByCorrelation
  SET i=1
  WHILE $DATA(result(i)) {
       WRITE $LISTTOSTRING(result(i),",",1),!
       SET i=i+1 }

語義的な近似

語義的な近似では、文内の 2 つのエンティティ間での意味の “隔たり“ を計算します。近似の整数値が高くなるほど、エンティティは近接します。

この意味の隔たりの例として、文を以下のように指定します。

“The giraffe walked with long legs to the base of the tree, then stretched his long neck
 up to reach the lowest leaves.”

“キリン“ という概念の近似が次のように、長い脚 = 64、ベース = 42、木 = 32、長い首 = 25、最も低い葉 = 21 であるとします。

語義的な近似は各文内のエンティティごとに計算され、その生成された近似スコアをまとめて追加することで、ソース・テキストの全セットにおける各エンティティ全体の近似スコアを生成します。例えば、文を以下のように指定します。

“The giraffe walked with long legs to the base of the tree, then stretched his long neck
 up to reach the lowest leaves. Having eaten, the giraffe bent his long legs and stretched
 his long neck down to drink from the pool.”

“キリン“ という概念の近似が次のように、長い脚 = 128、長い首 = 67、ベース = 42、木 = 32、プール = 32、最も低い葉 = 21 であるとします。

エンティティの近似は交換可能で、つまり、エンティティ 1 とエンティティ 2 の近似は、エンティティ 2 とエンティティ 1 の近似と同じです。iKnow では、エンティティ自体の語義的な近似は計算されません。例えば、“The boy told a boy about another boy.“ という文では近似スコアは生成されませんが、“The boy told a younger boy about another small boy.“ という文では、boy = 64、small boy = 42 という近似スコアが生成されます。同じエンティティが文に複数回出現する場合は、近似スコアが付加されます。例えば、“The girl told the boy about another boy.“ という文の概念 “girl“ の近似が、boy = 106 の場合は、2 つの近似スコアである 64 と 42 の合計ということになります。

日本語の語義的な近似

日本語の iKnow 意味分析には、エンティティ・ベクトルを作成するアルゴリズムが使用されます。エンティティ・ベクトルとは、文内の、事前定義されている論理的なシーケンスに従うエンティティの順序です。iKnow は、日本語の文をエンティティ・ベクトルに変換するとき、通常は、エンティティの順序を並べ替えます。日本語に対する語義的な近似には、原文のエンティティの順序ではなく、エンティティ・ベクトルのエンティティの順序が使用されます。

近似の例

以下の例では、GetProfileForEntity()Opens in a new tab メソッドを使用して、ドメイン内のすべてのソースにある文の他の概念に “student pilot“ という概念の近似を返します。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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 }
GetEntityID
    SET entId=##class(%iKnow.Queries.EntityAPI).GetId(domId,"student pilot")
ProximityForEntity
    DO ##class(%iKnow.Semantics.ProximityAPI).GetProfileForEntity(.eresult,domId,entId,1,20)
       SET k=1
       WHILE $DATA(eresult(k)) {
          SET item=$LISTTOSTRING(eresult(k))
          WRITE $PIECE(item,",",1)," ^ "
          WRITE $PIECE(item,",",2)," ^ "
          WRITE $PIECE(item,",",3),!
          SET k=k+1 }
    WRITE !,"all done"

以下の例では、GetClustersBySource()Opens in a new tab メソッドを使用して、各ソースで最大の近似を持つ概念をリストします。各概念は、エンティティ ID、値、および近似スコアでリストされます。

#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)
QueryBuild
   SET myquery="SELECT Top 25 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
  WRITE ##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)," total sources",!!
QueryBySource
  DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.result,domId,1,20)
  SET j=1,k=1
  WHILE $DATA(result(j),srclist) {
    SET src = $LISTGET(srclist)
    WRITE !,"Source id: ",src,!
    DO ##class(%iKnow.Semantics.ProximityAPI).GetClustersBySource(.srcresult,domId,src,1,20)
       WHILE $DATA(srcresult(k)) {
          SET item=$LISTTOSTRING(srcresult(k))
          WRITE $PIECE(item,",",1)," ^ "
          WRITE $PIECE(item,",",2)," ^ "
          WRITE $PIECE(item,",",3),!
          SET k=k+1 }
    SET k=1
    SET j=j+1 }
  WRITE !!,"Printed ",j-1," sources"
FeedbackOpens in a new tab