Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

優位性と近似

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

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

意味的優位性

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

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

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

  • エンティティの単語数

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

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

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

無関係な単語とパス関係の単語は、優位性および頻度の計算に影響しません。

Note:

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

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

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

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

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

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

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

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

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

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

意味的優位性の概念

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

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

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

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

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

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

意味的優位性の例

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

このドキュメント内の例で使用されているコーディングおよびデータの詳細は、"サンプル・プログラムに関するメモ" を参照してください。

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

GetTop()Opens in a new tab メソッドは、ロードされたすべてのソースについて、優位性スコアが上位の概念 (または関係) を返します。GetTop() では、フィルタと skiplist がサポートされています。

#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)
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"

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

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

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

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

#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)
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"

語義的な近似

語義的な近似では、文内の 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 の近似と同じです。NLP では、エンティティ自体の語義的な近似は計算されません。例えば、“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 の合計ということになります。

日本語の語義的な近似

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

近似の例

このドキュメント内の例で使用されているコーディングおよびデータの詳細は、"サンプル・プログラムに関するメモ" を参照してください。

以下の例では、GetProfile()Opens in a new tab メソッドを使用して、ドメイン内のすべてのソースにある文の他の概念に対する “student pilot“ という概念の近似を返します。GetProfile() では、フィルタskiplist がサポートされています。

#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)
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 }
ProximityForEntity
    SET entity="student pilot"
    DO ##class(%iKnow.Semantics.ProximityAPI).GetProfile(.eresult,domId,entity,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"

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

#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)
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
  SET totsrc=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)
GetEntityID
  SET entId=##class(%iKnow.Queries.EntityAPI).GetId(domId,"student pilot")
QueryBySource
  DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.result,domId,1,totsrc)
  SET j=1,k=1
  WHILE $DATA(result(j),srclist) {
    SET src = $LISTGET(srclist)
    WRITE !,"Source id: ",src,!
    SET entity="student pilot"
    DO ##class(%iKnow.Semantics.ProximityAPI).GetProfileBySourceId(.srcresult,domId,entId,src,1,totsrc)
       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 all ",j-1," sources"
FeedbackOpens in a new tab