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 の属性フラグは、パスまたは文の解釈に影響を与える 1 つ以上の用語 (単語または短い語句) に関連付けられます。その属性による影響を受けているというフラグをパスまたは文の一部に設定することで、属性を持たない同様のパスまたは文の一部から区別できるようになります。

iKnow は、以下の 2 つの属性をサポートしています。

  • 否定 : 否定属性により、文の一部に否定があることを識別します。例えば、“no” や “not” などの単語は、そのパスまたは文の一部の意味を否定します。iKnow の言語モデルにより、多数の一般的な否定用語が識別されます。iKnow UserDictionary を使用すると、追加の否定用語を指定できます。

  • 感情 : 感情属性では、肯定的な感情または否定的な感情のどちらかが含まれているものとして、文にフラグを設定します。例えば、“avoid”、“harm”、“reject” などの単語は、一般に多くの (すべてではない) コンテキストで否定的な感情を伝えます。また、“approve”、“accept”、“beneficial” などの単語は肯定的な感情を伝えます。感情用語は、分析するテキストの種類に大きく依存するため、iKnow が感情用語を自動的に識別することはありません。iKnow UserDictionary を使用して、肯定的な感情用語と否定的な感情用語のリストを指定できます。こうした用語は、iKnow エンジンによってテキスト内で識別され、その用語が文またはパスのどの部分に影響を与えているかが判断されます。

否定

否定は、肯定文 (または文の一部) をその逆の否定に変換するプロセスです。例えば、“I am a doctor.” と言う文は、“I am not a doctor.” のように否定できます。テキストを分析するときは、多くの場合、あるトピックに関する肯定的なステートメントをそのトピックに関する否定的なステートメントから分離することが重要です。

iKnow には、文またはパスが否定されているかどうかを判定する手段が用意されています。iKnow は、ソース・インデックスの作成時に、属性 ”negation” を文と関連付け、テキストのどの部分が否定されているかを示します。

最も簡単な形式の否定は、“no“ または “not“ を肯定的なステートメントまたは語句に関連付けるだけですが、実際の言語での否定は、より複雑な言語固有の操作です。否定には、以下の 2 つの基本タイプがあります。

  • 形式的 (文法的) 否定は、常にテキスト内の特定の形態的要素によって示されます。例えば、“no“、“not“、“don’t“、およびその他の特定の否定用語です。これらの否定要素は、概念 “He has no knowledge of“ の一部になったり、関係 “He doesn’t know anything about“ の一部になったりします。形式的否定は常に二元的です。文 (または文の一部) は、否定要素を含む (したがって、否定である) か、または肯定的であるかのどちらかになります。

  • 意味的否定は、コンテキストに依存する複雑な形式の否定であり、テキスト内の特定の形態的要素によって示されません。意味的否定は、特定のコンテキストにおける単語または単語群の特定の意味に依存するか、または意味と時制の特定の組み合わせ (例えば、ロマンス言語の接続法や仮定法の時制) によって発生します。例えば、“Fred would have been ready if he had stayed awake“ や “Fred would have been ready if the need had arisen“ は、Fred の心構えについて反対のことを言っています。意味的否定は、二元的な原則ではありません。絶対的であることはほとんどなく、コンテキスト上の洞察や文化的な洞察に左右されます。

iKnow の言語モデルには、さまざまな言語固有の否定語および否定構造が含まれています。iKnow 分析エンジンでは、ソースのロード処理の一部として、これらの言語モデルを使用して形式的否定のほとんどのインスタンスを識別し、将来使用するためにフラグを立てることができます。ただし、iKnow は意味的否定のインスタンスを識別できません。

iKnow における否定の最も大きな単位はパスです。iKnow では、パスより大きなテキスト・ユニットに含まれる否定を識別できません。文は、全部ではありませんが、その多くが 1 つのパスで構成されます。

形式的否定のプロパティ

形式的否定は、以下の 3 つのプロパティによって定義できます。

  • 否定マーカ : 形式的否定は、常に 1 つまたは複数の否定マーカによってマークされます。これらの否定マーカは、概念や関係の一部になります。英語の否定マーカの例として、no、not、doesn’t、isn’t、hasn’t、neither、nor、never、nothing、none、nobody、nowhere などがあります。iKnow は、否定マーカを常に概念の一部または関係の一部として識別します。

  • 否定範囲 : 否定は、常に 1 つのステートメントまたは文の広範囲なコンテキストで表されます。形式的否定の効果は、ステートメントまたは文 (またはその一部) が否定されることです。したがって、否定範囲、つまり否定マーカによって否定される文の部分を判定することが重要です。形式的否定の最大の範囲は、文全体です。

  • 否定ストッパ : 多くの場合、否定範囲は文全体ではありません。否定範囲は、否定ストッパ (“but“ や “or“ などの単語) によって終了します。iKnow は、否定ストッパを識別し、その情報を使用して否定範囲を限定します。

iKnow は、これらのプロパティを使って、否定されるテキスト・ユニットを識別します。否定マーカは、エンティティ (概念または関係) のレベルで否定属性を割り当てることによってタグ付けされます。否定範囲は、パスのレベルで否定開始タグと否定終了タグを使ってタグ付けされます。

日本語については、エンティティ・レベルで否定属性をサポートしていますが、日本語のパスの定義が根本的に異なっているため、パスの拡張はサポートされていません。そのため、日本語の場合の否定は、パス・レベルで影響を受けるすべてのエンティティに拡張する必要はありません。

否定属性の使用

否定の分析情報は、以下のメソッドで使用できます。

否定属性 ID は、$$$IKATTNEGATION マクロを使用して指定できます。このマクロは、%IKPublic #Include ファイルで定義されています。

否定属性の構造

否定は、属性として iKnow に実装されています。つまり、否定を含むソース、文、またはパスは、否定属性を持っています。この属性は、以下の要素を含む %List 構造です。

  • 要素 2 は、単語の “否定“ です。

  • 要素 3 は、最初の否定マーカを含むエンティティの位置です。否定マーカは、概念や関係の一部である可能性があります。例えば、“The White Rabbit usually hasn't any time.” では、エンティティ 3 の関係 “usually hasn’t” に否定マーカが含まれます。“The White Rabbit usually has no time.” では、エンティティ 4 の概念 “no time“ に否定マーカが含まれます。この位置計算では、無関係な単語 (“the” や “a”) は別々のエンティティとしてカウントされます。

  • 要素 4 は、エンティティの数で表される否定範囲です。否定範囲は、否定マーカを含む最初のエンティティから否定マーカを含む最後のエンティティまでカウントされます。例えば、“The man is neither fat nor thin” には、3 つのエンティティからなる否定範囲 “is neither/fat/nor” があります。

  • 要素 5 は、エンティティ内の否定マーカの位置をビット・マップで示します。“1“ は否定マーカである単語を示し、“0“ は否定マーカでない単語を示します。隣接する 2 つの単語で構成される否定マーカ (“is not“ など) は、“11“ のように示されます。エンティティのマッピングは、否定マーカが示されたときに停止します。例えば、関係 “is often not“ は “001“ ですが、関係 “often is not“ は “011“ であり、関係 “is not often“ は “11“ です。

否定ビット・マップ

要素 5 は、否定ビット・マップです。これは、否定範囲内の否定マーカの位置を示します。否定範囲が 1 の場合、これは単純なビット・マップです。否定範囲が 1 より大きい場合、これは空白で区切られた一連のビット・マップであり、1 つのビット・マップが否定範囲内の各エンティティを表します。

否定範囲内のエンティティに否定マーカが含まれる場合は、否定マーカとその前にある各単語が 1 (否定マーカの単語) または 0 (否定マーカの前にある単語) で示されます。否定範囲内のエンティティに否定マーカが含まれていない場合は、そのエンティティ全体が 1 つの 0 で表されます。無関係な単語 (“a” や “the”) は別々のエンティティと見なされます。次のテーブルに、否定ビット・マップの例をいくつか示します。

否定ビット・マップ 文テキスト (/ でエンティティを区切り、否定マーカに下線を付けた)
01 0 1 Bartleby / is neither / busy / nor idle.
01 0 1 Bartleby / is neither / sixty-five years old / nor retired.
1 0 1 Bartleby / is / no idler / and certainly is / no loafer.
11 0 0 01 Bartleby / is not / my / favorite fictional character / but neither is / he / my / least favorite.
1 0 0 01 Bartleby / isn’t / my / favorite fictional character / but neither is / he / my / least favorite.
001 0 0011 Bartleby / is either not / trying very hard / or he is not / succeeding.
11 0 0 0011 Bartleby / is not / a / wholly realistic character / and yet is not / wholly unbelievable.
1 0001 Bartleby / never works, / but he is never / wholly idle.
1 001 Bartleby / does / nothing / and yet never is / he / idle.

最も大きなエンティティ・ビット・マップは 8 ビットです。まれに、否定マーカの位置がエンティティの先頭から 9 文字目以降である場合があります。否定マーカが位置 8 および 9 にある 2 単語のマーカである場合は、2 番目の “1” は省略されます (“00000001”)。否定マーカが位置 9 以降にある場合は、ビット・マップは返されません。次の例では、(単語 “in“ の意味的なあいまいさのために) 多くの単語が含まれる関係である 2 番目のエンティティに否定マーカが含まれています。“They start when you get in and are not finished when you leave.“ は、“00000011“ のようにマップされます。“They start when you get in and they are not finished when you leave.“ は、“00000001“ のようにマップされます (否定マーカの 2 番目の単語がマップされません)。“They often start when you get in and they are not finished when you leave.“ は、ビット・マップが返されません。

否定ビット・マップが省略されたかどうかを判断するには、要素 4 の否定範囲を表すエンティティ数と要素 5 の空白で区切られたビット・マップの数を比較します。これら 2 つの数が一致しない場合は、1 つまたは複数の否定エンティティ・ビット・マップが欠落しています。

否定とディクショナリ・マッチング

iKnow は、ディクショナリとのマッチング時に、否定されたエンティティを認識します。否定の一部であるエンティティの数を計算し、その数をマッチ・レベル情報の一部として格納します (これは、GetMatchesBySource() などのメソッドから返されるか、%iKnow.Objects.DictionaryMatchOpens in a new tabNegatedEntityCount プロパティとして取得できます)。これにより、否定されたエンティティを一致したエンティティの総数と比較するなど、否定の内容を考慮に入れて一致の結果を解釈するコードを作成できます。

詳細は、このドキュメントの "スマート・マッチング : ディクショナリの使用" の章を参照してください。

否定の例

以下の例では、%iKnow.Queries.SourceAPI.GetAttributes()Opens in a new tab を使用して、ドメイン内の各ソースから否定属性を持つパスと文を検索します。パス ID または文 ID、および各否定の開始位置と範囲が表示されます。%iKnow.Queries.SourceAPI.GetAttributes() をパスに限定するには、$$$IKATTLVLANY の代わりに $$$IKATTLVLPATH を指定します。

#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 100 ID AS UniqueVal,Type,NarrativeCause FROM Aviation.Event"
   SET idfld="UniqueVal"
   SET grpfld="Type"
   SET dataflds=$LB("NarrativeCause")
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 }
GetSourcesAndAttributes
   SET numSrcD=##class(%iKnow.Queries.SourceQAPI).GetCountByDomain(domId)
   DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.srcs,domId,1,numSrcD)
   SET i=1
   WHILE $DATA(srcs(i)) {
      SET srcId = $LISTGET(srcs(i),1)
      SET i=i+1
      DO ##class(%iKnow.Queries.SourceAPI).GetAttributes(.att,domId,srcId,1,10,"",$$$IKATTLVLANY)
      SET j=1
      WHILE $DATA(att(j)) {
          IF $LISTGET(att(j),1)=1 {
            SET type=$LISTGET(att(j),2)
            SET level=$LISTGET(att(j),3)
            SET targId=$LISTGET(att(j),4)
            SET start=$LISTGET(att(j),5)
            SET span=$LISTGET(att(j),6)
               IF level=1 {WRITE "source ",srcId," ",type," path ",targId," start at ",start," span ",span,!}
               ELSEIF level=2 {WRITE "source ",srcId," ",type," sentence ",targId," start at ",start," span ",span,!!}
               ELSE {WRITE "unexpected attribute level",! }
         }
     SET j=j+1
     }
    }

以下の例では、%iKnow.Queries.SentenceAPI.GetAttributes()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 100 ID AS UniqueVal,Type,NarrativeCause FROM Aviation.Event"
   SET idfld="UniqueVal"
   SET grpfld="Type"
   SET dataflds=$LB("NarrativeCause")
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 }
GetSourcesAndSentences
   SET numSrcD=##class(%iKnow.Queries.SourceQAPI).GetCountByDomain(domId)
   DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.srcs,domId,1,numSrcD)
   SET i=1
   WHILE $DATA(srcs(i)) {
      SET srcId = $LISTGET(srcs(i),1)
      SET i=i+1
      SET st = ##class(%iKnow.Queries.SentenceAPI).GetBySource(.sent,domId,srcId)
      SET j=1
      WHILE $DATA(sent(j)) {
         SET sentId=$LISTGET(sent(j),1)
         SET text=$LISTGET(sent(j),2)
         SET j=j+1
CheckSentencesForNegation
         SET atstat=##class(%iKnow.Queries.SentenceAPI).GetAttributes(.att,domId,sentId)
         SET k=1
            WHILE $DATA(att(k)) {
             WRITE "sentence ",sentId," has attribute=",$LISTGET(att(k),2)
             WRITE ", marker at entity position=",$LISTGET(att(k),3),!
             /* Format for display */
             WRITE sentId,": "
             SET x=1
             SET totlines=$LENGTH(text)/60
               FOR L=1:1:totlines {
               WRITE $EXTRACT(text,x,x+60),!
               SET x=x+61 }
             WRITE "END OF SENTENCE ",sentId,!!
         SET k=k+1 }
    }
  }

否定用語の追加

その他の特定の単語または語句に否定を指定するには、iKnow UserDictionary を使用します。AddNegationTerm()Opens in a new tab メソッドを使用すると、UserDictionary に否定用語のリストを追加できます。ソース・テキストをドメインにロードするときに、該当する用語のすべての出現箇所に否定マーカによるフラグが設定されます。

否定の特殊なケース

以下は、英語の否定に関する特殊事情です。

  • No. : 英語の単語 “No.“ (大文字で始まり、ピリオドで終わる。引用符は付く場合と付かない場合がある) は、省略形として扱われます。否定としては扱われず、文の終わりとしても扱われません。小文字の “no.” は否定および文の終わりとして扱われます。

  • Nor : 文の先頭の単語 “Nor” は、否定としてマークされません。文の途中にある単語 “nor” は、否定としてマークされます。

  • no-one : ハイフンで結ばれた単語 “no-one” は、否定マーカとして扱われます。他のハイフンで結ばれた形式 (“no-where“ など) は、否定マーカとして扱われません。

  • 偽りの否定 : 形式的否定はコンテキストでなく単語に依存するため、場合によっては偽りの否定が発生することは避けられません。例えば、“There was no answer“ と “The answer was no“ のどちらの文にも否定のフラグが付けられます。

否定は文の単位で処理されるため、iKnow が何を 1 つの文と見なすか (または見なさないか) を理解することが重要です。iKnow による文の識別方法の詳細は、“コンセプトの概要” の章の "iKnow が識別する論理テキスト・ユニット" を参照してください。

感情

感情属性では、肯定的な感情または否定的な感情のどちらかが含まれているものとして、文にフラグを設定します。感情用語は、分析するテキストの種類に大きく依存します。例えば、顧客対象の意識調査におけるコンテキストでは、以下の用語に対して感情属性によるフラグが設定される可能性があります。

  • 単語 “avoid“、“terrible“、“difficult“、“hated“ は、否定的な感情を伝えます。

  • 単語 “attractive“、“simple“、“self-evident“、“useful“、“improved“ は、肯定的な感情を伝えます。

感情用語は、ソース・テキストの内容に特有であることが多いため、iKnow が感情用語を自動的に識別することはありません。個別の単語に、肯定的な感情または否定的な感情の属性が含まれるものとして、ユーザがフラグを設定することはできます。既定では、感情属性を持つ単語はありません。特定の単語に感情属性を指定するには、iKnow UserDictionary を使用します。AddPositiveSentimentTerm()Opens in a new tab メソッドおよび AddNegativeSentimentTerm()Opens in a new tab メソッドを使用すると、UserDictionary に感情用語のリストを追加できます。ソース・テキストをドメインにロードするときに、該当する用語のすべての出現箇所と、その用語の影響を受ける文の部分に、指定した肯定的な感情マーカまたは否定的な感情マーカによるフラグが設定されます。

例えば、否定的な感情属性を持つものとして “hated“ が指定されていて、肯定的な感情属性を持つものとして “amazing“ が指定されている場合に、それらの属性を iKnow が以下の文に適用するとします。

I hated the rain outside, but the running shoes were amazing.

否定的な感情は “rain“ に影響して、肯定的な感情は “running shoes“ に影響します。

感情属性をサポートする言語は、英語、ドイツ語、ポルトガル語、ロシア語、およびウクライナ語です。感情属性は、日本語では現時点でサポートされていません。

感情属性の使用

感情の分析情報は、以下のメソッドで使用できます。

感情属性 ID は、$$$IKATTSENPOSITIVE マクロまたは $$$IKATTSENNEGATIVE マクロを使用して指定できます。このマクロは、%IKPublic #Include ファイルで定義されています。

FeedbackOpens in a new tab