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

意味的属性

InterSystems NLP は、自然言語テキスト内のコンセプトとそのコンテキストを識別Opens in a new tabします。

コンセプトとは、それ自体が意味を持っている不可分の単語グループで、多くの場合、その単語グループが使用されている文に依存しない存在です。例えば、"Patient is being treated for acute pulmonary hypertension" という文では、InterSystems NLP は単語グループである "patient" と "acute pulmonary hypertension" をコンセプトとして識別します。文中では、リレーションが複数のコンセプトを 1 つのパスにリンクすることで、コンセプトどうしの有意な関連を示します。前述の例では、リレーション "is being treated for" によってコンセプトが関連付けられています。

しかし、文 "Patient is not being treated for acute pulmonary hypertension" では、コンセプト "acute pulmonary hypertension" に同じ本質的な意味がありますが、コンテキストは明らかに異なっています。この場合、このリレーションによって否定的な関係が表現された文の一部として、このコンセプトが使用されています。自然言語処理を使用して肺の問題に注目するアプリケーションでは、このコンセプトが使用されている状況と、前述の例での状況は、明らかに異なる方法で扱われます。

InterSystems NLP は、パスとそれを構成する各エンティティのコンテキスト上の意味に影響する意味的属性 (否定など) がパスにある場合に、検索用の索引的処理を適用することで、ソース・テキストに関する充実したデータ・セットを提供し、高度な分析を実行できるようにします。

属性が機能するしくみ :マーカ用語と属性拡張

文中では、意味的属性を通常はマーカ用語で示しています。"Patient is not being treated for acute pulmonary hypertension," という文では、単語 "not" が否定を表すマーカ用語です。マーカ用語は通常 1 つの単語または複数の単語の組み合わせですが、エンティティ全体である必要はありません。前述の例では、"not" は "is not being treated for" というリレーション・エンティティの一部にすぎません。

ユーザ・ディクショナリを使用して、属性に追加のマーカ用語を指定できます。構成の一部としてユーザ・ディクショナリを指定すると、InterSystems NLP ではそのユーザ・ディクショナリで定義したマーカ用語が認識され、適切な属性拡張を実行して、文またはパスのどの部分に属性が適用されるかが判断されます。プログラムでユーザ・ディクショナリに属性のマーカ用語を追加する場合、%iKnow.UserDictionaryOpens in a new tab クラスには各属性タイプに固有のインスタンス・メソッドがあります (AddPositiveSentimentTerm()Opens in a new tab など)。また、このクラスは一般的な属性を定義するための AddAttribute()Opens in a new tab メソッドも提供します。

エンティティ・レベル :マーカ用語のビット・マスク

InterSystems NLP では、エンティティが分析の最小単位なので、エンティティにマーカ用語が単語レベルで使用されていると、ビット・マスクを使用してエンティティ・レベルでアノテーションが付けられます。ビット・マスクは 0 と 1 で構成される文字列です。この文字列での各ビット・マスクの位置は、エンティティを構成する単語のシーケンスにある各単語を表します。指定された位置のビット・マスクは、対応する単語がマーカ用語であることを示しています。例えば、エンティティ "is not being treated for" には、否定のビットマスク "01000" が割り当てられます。

パスレベル :拡張属性の位置と範囲

InterSystems NLP は、意味的属性のマーカ用語を含むエンティティにインデックスを作成するにとどまりません。そのほか、InterSystems NLP は文法の理解を活用して属性拡張を実行し、パスの中でマーカ用語前後のすべてのエンティティにフラグを付けます。これらのエンティティは、属性による影響も受けます。文 "Patient is not being treated for acute pulmonary hypertension or CAD, but reports frequent chest pain," では、コンセプトである "acute pulmonary hypertension" と "CAD" に、拡張否定属性の一部としてフラグが付きますが、コンセプト "frequent chest pain" にはフラグが付きません。

拡張された意味的属性の情報には、次の 2 つのトリガを使用してパス・レベルでアノテーションが付きます。

  • position :この属性により影響を受ける最初のエンティティの場所

  • span :この属性により影響を受ける連続するエンティティの数

前述の文では、否定の開始位置は 1 ("Patient") で、範囲は 5 ("CAD" で終了) になります。

属性拡張により、InterSystems NLP は高度な分析を実行するための比類のない能力を提供します。パスレベルで情報を利用できるため、例えばコンセプト "CAD" の肯定的な使用と否定的な使用を容易に識別して、画面上で明確に強調表示することや、アプリケーションに高度な解釈のロジックを実現することなどができます。

属性データへのアクセス

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

属性のデータ構造

InterSystems NLP はマーカ用語を識別し、隣接するどのエンティティがその影響を受けるかを特定したうえで、その属性についてのデータを保存します。これにより、前に挙げた %iKnow.Queries パッケージの API のいずれかを使用して、そのデータにアクセスできるようにします。

属性データは %List として保存されます。この属性 %List の正確なコンテンツは、その情報提供先の分析のレベルによって異なります。該当するコンテンツは以下の順序で表示されます。

  1. 属性タイプの数値 ID。使いやすさを考慮して、%IKPublic の #include ファイルは、クエリでこれらの値を指定するための名前付きマクロを提供します。例えば、確実性属性タイプの ID は、$$$IKATTCERTAINTY マクロを使用して呼び出すことができます。

  2. 属性タイプの名前が使用された文字列 ("negation""!measurement" など)。

  3. 分析のレベルを示す数値 ID (パスのレベルなど)。使いやすさを考慮して、%IKPublic の #include ファイルは、クエリでこれらの値を指定するための名前付きマクロを提供します。例えば、$$$IKATTLVLPATH マクロを呼び出してパスのレベルを参照できます。

  4. 属性を持ち、指定された分析レベルにある要素の数値 ID。この中の単語は、0 または 1 を使用した文字列です。

  5. 要素の中で属性による影響を受ける最初のエンティティの位置。無関係な単語 ("the" や "a") は独立したエンティティとしてカウントされます。例えば、文 "The White Rabbit usually hasn't any time," では、エンティティ 3 の関係 "usually hasn't" に否定マーカが付きます。文 "The White Rabbit usually has no time," では、エンティティ 4 の概念 "no time" に否定マーカが付きます。

  6. 属性の範囲。これは、その属性が影響を及ぼす連続するエンティティの数です。例えば、"The man is neither fat nor thin" には、5 つのエンティティ ("man"、"is neither"、"fat"、"nor"、および "thin") で構成する否定範囲があります。

  7. 該当する場合、この属性に関連付けられたプロパティの名前を使用した文字列。測定のため、この文字列は、測定値とその単位を検出順に記述したコンマ区切りのリストになります。確実性属性の場合、この文字列には確実性レベル c. の数値が記述されます。

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

以下の例では、%iKnow.Queries.SourceAPI.GetAttributes()Opens in a new tab を使用して、ドメイン内の各ソースから否定属性を持つパスと文を検索します。パス ID または文 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 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
     }
    }

サポートされる属性

InterSystems NLP ではいくつかの意味的属性タイプがサポートされ、属性タイプごとに独立したアノテーションが付きます。言い換えると、あるエンティティが使用されていると、指定した言語モデルでサポートされている属性タイプの任意の個数と任意の組み合わせに対してアノテーションが付く可能性があります。

英語の場合、InterSystems NLP には、このようなすべての属性タイプ (汎用属性を除く) に対してマーカ用語が用意されています。意味的属性のサポートは属性タイプに応じて異なります。このバージョンの InterSystems NLP で言語モデルごとにサポートされている意味的属性タイプを以下の表に示します。参照しやすいように、各属性タイプの横には、ドメイン・エクスプローラOpens in a new tabおよびインデックス作成結果ツールで強調表示に既定で使用される色を括弧で囲んで記述しています。

属性 (強調表示の色) 英語 チェコ語 オランダ語 フランス語 ドイツ語 日本語 ポルトガル語 ロシア語 スペイン語 スウェーデン語 ウクライナ語
否定 (赤)
時間 (オレンジ) 不可 不可 不可 不可
期間 (緑) 不可 不可 不可 不可 不可 不可 不可 不可 不可
頻度 (黄) 不可 不可 不可 不可 不可 不可 不可 不可 不可
測定 (ピンク) 不可 部分的サポート 不可 不可 不可 不可 不可 部分的サポート 不可
感情 (紫) 不可
確実性 (黄) 不可 不可 不可 不可 不可 不可 不可 不可 不可 不可
汎用 (濃い青) 不可 不可 不可 不可 不可 不可 不可 不可 不可 不可

このページの残りの部分では、各属性タイプについて詳しく説明します。

否定

否定は、肯定文 (または文の一部) をその逆の否定に変換するプロセスです。例えば、“I am a doctor.” と言う文は、“I am not a doctor.” のように否定できます。テキストを分析するときは、多くの場合、あるトピックに関する肯定的なステートメントをそのトピックに関する否定的なステートメントから分離することが重要です。InterSystems NLP は、ソース・インデックスの作成時に、属性 "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 の心構えについて反対のことを言っています。意味的否定は、二元的な原則ではありません。絶対的であることはほとんどなく、コンテキスト上の洞察や文化的な洞察に左右されます。

InterSystems NLP の言語モデルには、さまざまな言語固有の否定語および否定構造が含まれています。InterSystems NLP では、これらの言語モデルを使用すると、ソースをロードする過程で形式的否定のほとんどのインスタンスを自動的に識別し、分析のためにフラグを付けることができます。ただし、InterSystems NLP は意味的否定のインスタンスを識別できません。

InterSystems NLP では、否定の最も大きい単位はパスです。したがって、パスより大きいテキスト単位で構成された否定を識別できません。文は、全部ではありませんが、その多くが 1 つのパスで構成されます。

否定の特殊なケース

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

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

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

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

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

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

否定とスマート・マッチング

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

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

時間、期間、および頻度

ドキュメントには、時間、期間、または頻度を表す構造化データが含まれる場合もあります。これらのデータには、通常、コンセプトの一部としての属性用語から成る個別の属性としてアノテーションが付けられます。これらの属性は、対象の言語で識別されるマーカ用語に基づいて識別されます。マーカ用語には、特定の数値が含まれる場合と含まれない場合があります。

数字または単語で指定される数値は、ほとんど常に測定属性として扱われます。ただし、時間属性には数値、頻度属性には順序数を含めることができます。

以下は、数値を制御するための英語モデルでのガイドラインの一部を示しています。

  • 数字 : 用語に関連付けられていない数字は測定または年の可能性があります。1900 から 2039 までの数字は年と見なされ、時間属性が割り当てられます ("1923, 2008 applicants")。この範囲以外の数字 ("1776") は、単語 "year" が指定されていない限り ("the year 1776")、年とは見なされません。この範囲以外の単独の数字 ("1776") には属性が割り当てられません。この範囲以外の数字で用語に関連付けられている場合は、測定と見なされます ("1776 applicants")。アポストロフィが付いた 2 桁の数字 ("Winter of '89" など) は年と見なされ、時間属性が割り当てられます。数字または貨幣の句読点が付いた数値 ("1,973"、"-1973"、"1973.0"、または "$1973") および単語で表された数値 ("nineteen seventy-three") は測定と見なされます。有効な時間の数値 ("12:34:33") には、時間属性が割り当てられます。

  • 順序数 : コンセプト内で他の単語を伴う序数には、綴られている場合 ("the fourth attempt") は頻度属性が割り当てられ、数字で指定されている場合 ("the 4th attempt") は測定属性が割り当てられます。"tenth" より大きい順序数が綴られている場合は頻度属性は割り当てられません。コンセプト内の順序数に単独で属性が割り当てられることはありません ("a fifth of scotch"、"came in third")。

    綴られている順序数の前に別の数値がある場合 ("first through tenth") は、分数 ("one third"、"two fifths") と同様に測定属性が割り当てられますが、"one second" は例外で、期間属性が割り当てられます。

    任意の大きさの順序数で月の名前を伴う場合 ("sixteenth of October"、"October 16th"、"October sixteenth") は、時間属性が割り当てられます。ただし、"May" は例外で、英語ではあいまいなため、属性が割り当てられません。

Note:

InterSystems NLP では、チェコ語、オランダ語、ロシア語、スウェーデン語、およびウクライナ語の時間属性をサポートしますが、現在のところ、時間、期間、および頻度に対する個別のアノテーションはサポートしていません。

測定

ドキュメントには一般的に、数量を表す構造化データ要素が含まれています。これらの要素としては、数、長さ、重さ、貨幣額、投薬量、およびその他の数量的表現を含むことができます。これらの要素は以下のようにさまざまなパターンに従うことができます。

  1. 単位を伴う数字 (例 : "20 マイル" や "5 mg")

  2. 数字と単位の両方で構成する文字列 (例 : "$200")

  3. カウント対象に関連付けられたコンセプトの用語を伴う数字 (例 : "50 人")

  4. 測定値であることを示す表記を伴う数字 (例 : "血圧 : 120/80")

InterSystems NLP では、数値と単位の組み合わせ (上記のパターン 1 および 2) に、単語レベルの測定マーカ用語としてアノテーションが付きます。その他のケース (上記のパターン 3 と 4) では、単語レベルでの測定値としての数字にのみアノテーションが付きます。

小数の数値を処理するために、測定の数値の一部として先頭にピリオドが追加されます。

数値と単位にアノテーションを付けることに加えて、インターシステムズの NLP は、属性拡張規則を使用して、測定に "含まれる" その他のコンセプトを識別します。アノテーションが付けられたこの一連のコンセプトによって、測定自体だけでなく、測定対象となっているものも把握されます。(上記のパターン 3 と 4 の場合、測定に "含まれる"、測定値であることを示す表記またはコンセプトの用語は範囲の一部になります。)

これらの拡張属性は、以下のことに使用できます。

  • ドキュメント内の測定可能なファクトすべてを、強調表示または一覧表示することで抽出します。

  • 特定のコンセプトの表示を、特定の測定に関連付けられているものだけに絞り込みます。

Note:

英語および日本語では、数値に関連付けられているすべてのコンセプトに測定属性のフラグが設定されます。例外については、"時間、期間、および頻度" を参照してください。オランダ語およびスウェーデン語では、関連付けられたコンセプトの用語を伴う数字 (上記のパターン 3) は、測定値としてマークされません。

感情

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

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

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

感情用語はソース・テキストの内容に固有であることが多いため、InterSystems NLP ではごく少数の感情用語のみが自動的に特定されます。肯定的な感情または否定的な感情の属性を持つものとして、追加の単語にユーザがフラグを設定することはできます。特定の単語に感情属性を指定するにはユーザ・ディクショナリを使用します。ソース・テキストをドメインにロードするときに、該当する用語のすべての出現箇所と、その用語の影響を受ける文の部分に、指定した肯定的な感情マーカまたは否定的な感情マーカによるフラグが設定されます。

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

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

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

肯定的な感情属性または否定的な感情属性が文の否定部分に出現する場合、感情の意味が逆になります。例えば、単語 “good” に肯定的な感情のフラグが設定されている場合、文 “The coffee was good” は肯定的な感情ですが、文 “The coffee was not good” は否定的な感情です。

確実性

事実の記述は、多くの場合、その正確さに関する話し手の確実性 (または確実性の欠如) を示す用語で修飾されます。

  • "clearly (明らかに)"、"definitely (確実に)"、"confident that (確信して)"、"without a doubt (疑いなく)" といった用語は、高いレベルの確実性を表す場合があります。

  • "could (もしかして)"、"uncertain (不確実な)"、"quite possibly (おそらく)"、"seem to be (思われる)" といった用語は、低いレベルの確実性を表す可能性があります。

これらの用語とそれらが修飾するパスにインデックスを作成することで、価値の高い分析情報を提供できます。例えば、医療記録でのエンティティ "pulmonary embolus (肺動脈塞栓)" の使用状況を分析して、この状態に対する統計的に効果的な対応戦略を判断する場合、このエンティティが "concern for pulmonary embolus (肺動脈塞栓の懸念あり)" という語句の一部として使用されている患者観察記録は除外しようと考えるかもしれません。

テキストをドメインにロードする際、InterSystems NLP では、確実性用語の使用箇所それぞれと、その用語による影響を受ける文の部分に、確実性属性マーカによってフラグが設定されます。メタデータとしての各確実性属性フラグは 0 ~ 9 の範囲の整数値 c を受け取ります。この値が高いほど確実性のレベルが高くなります。

ただし、確実性または不確実性を示す用語は、分析するテキストの種類に大きく依存します。例えば、病歴聴取の記録に "the patient has no chance of recovery (患者には回復の見込みがない)" とある場合、"no chance of (見込みがない)" という語句は、明らかに高いレベルの確実性を示しています。しかし、この同じ語句が、スポーツチーム監督の "We have no chance of being defeated (負けるとは思わない)" という発言を引用したニュース記事に使用されている場合は、高い確実性を示していないことも考えられます。

このため、InterSystems NLP は、少数の確実性用語のみを自動的に特定します。このような自動的に検出される確実性フラグには、最小 (c=0) または最大 (c=9) のいずれかの確実性レベルが割り当てられます。

ユーザ・ディクショナリに追加の用語を追加することで、その用語に対する確実性属性を指定できます。

汎用属性

前述の意味的属性のほか、InterSystems NLP には、カスタム属性を定義できるようにする 3 つの汎用フラグが用意されています。ユーザ・ディクショナリで 3 つの汎用属性値 (UDGeneric1UDGeneric2、または UDGeneric3) のいずれかを用語に割り当てることで、その用語をいずれかの汎用属性のマーカとして指定できます。否定または確実性の場合と同様に、InterSystems NLP では、これらの用語の使用箇所それぞれと、それらの用語による影響を受ける文の部分に、指定した汎用属性マーカによるフラグが設定されます。

FeedbackOpens in a new tab