16 Oracle Textを使用したセンチメント分析の実行

センチメント分析により、検索トピックの肯定的また脾摘的なセンチメントを特定できます。

この章のトピックは、次のとおりです:

16.1 センチメント分析の概要

センチメント分析では、トレーニングされたセンチメント分類子を使用してドキュメントまたはドキュメント内のトピックに関するセンチメント情報を提供します。

この項では、次の項目について説明します。

16.1.1 センチメント分析について

Oracle Textでは、センチメント・メタデータを識別するようトレーニングされたセンチメント分類子を使用してトピックまたはドキュメントのセンチメント分析を実行できます。

データ量の拡大に伴い、組織は単に検索問合せに応答したヒットを得るだけでなく、データに関するより多くの知見を得る必要があります。知見は、特定の基本的なタイプの問合せ(天候の問合せや最近のイベントに関する問合せなど)に回答する、ユーザー指定のトピックに関する意見を提供するなどの形式になることがあります。キーワード検索では、検索語を含む結果のリストが示されます。ただし、検索語に関連するセンチメントまたは意見を識別するには、結果を参照して必要なセンチメント情報を手動で見つけ出す必要があります。センチメント分析では、1ステップのプロセスでドキュメント・セット内のセンチメント情報を識別できます。

センチメント分析は、指定されたトピックに関連するセンチメント・メタデータまたはドキュメントのセットからエンティティを識別、抽出するプロセスです。トレーニングされたセンチメント分類子がセンチメントを識別します。検索結果に加えて、センチメント分析を使用して問合せを実行すると、センチメント・メタデータも識別および表示されます。センチメント分析では、"製品レビューは肯定的かどうか"や"顧客は満足しているかどうか"などの質問に対する回答が提供されます。たとえば、特定の製品に関する複数のレビューで構成されるドキュメント・セットから、製品の良し悪しを示す全体的なセンチメントを判断できます。

16.1.2 センチメント分類子について

センチメント分類子は、トピックまたはドキュメントに関連するセンチメント・メタデータを抽出するために使用される一種のドキュメント分類子です。

センチメント分類子を使用してセンチメント分析を実行するには、最初にセンチメント分類子プリファレンスをセンチメント分類子と関連付けた後に、センチメント分類子をトレーニングします。

ユーザー定義のセンチメント分類子をタイプSENTIMENT_CLASSIFIERのセンチメント分類子プリファレンスに関連付けることができます。センチメント分類子プリファレンスには、センチメント分類子のトレーニングに使用するパラメータを指定します。これらのパラメータは、センチメント分類子プリファレンスの属性として定義されます。センチメント分類子プリファレンスを作成するか、デフォルトのCTXSYS.DEFAULT_SENTIMENT_CLASSIFIERを使用できます。ユーザー定義のセンチメント分類子プリファレンスを作成するには、CTX_DDL.CREATE_PREFERENCEプロシージャを使用してセンチメント分類子プリファレンスを定義し、CTX_DDL.SET_ATTRIBUTEプロシージャを使用してそのパラメータを定義します。

センチメント分類子をトレーニングするには、関連付けられているセンチメント分類子プリファレンス、ドキュメントのトレーニング・セットおよびセントメント・カテゴリを提供する必要があります。分類子プリファレンスを指定しない場合、Oracle Textではトレーニング・パラメータのデフォルト値が使用されます。センチメント分類子をトレーニングするには、サンプル・ドキュメントと指定されたプリファレンスのセットを使用します。カテゴリに各サンプル・ドキュメントを割り当てます。Oracle Textでは、このセンチメント分類子を使用して、センチメント分析を実行する方法を定義する一連の分類ルールを推定します。CTX_CLS.SA_TRAINプロシージャを使用して、センチメント分類子をトレーニングします。

通常、財務、製品レビュー、音楽など、ドキュメントのカテゴリごとに個別のセンチメント分類子を定義およびトレーニングします。独自のセンチメント分類子を作成しない場合、または分類子をトレーニングする適切なトレーニング・データが使用できない場合は、Oracle Textで提供されるデフォルトのセンチメント分類子データを使用できます。デフォルトのセンチメント分類子は教師なしです。

ノート:

デフォルトのセンチメント分類子は、AUTO_LEXERでのみ機能します。ユーザー定義のセンチメント分類子ではAUTO_LEXERを使用しないでください。

16.1.3 センチメント分析の実行について

センチメント分析を実行するには、センチメント情報の識別に使用する必要があるセンチメント分類子を含むセンチメント問合せを実行します。分類子はデフォルトまたはユーザー定義のセンチメント分類子にすることができます。

センチメント分析は、検索操作の一部としてのみ実行できます。Oracle Textでは、指定されたキーワードが検索されて、結果セットが生成されます。次に、結果セットでセンチメント分析が実行されて、各結果のセンチメントが特定されます。問合せでセンチメント分類子を明示的に指定しない場合、デフォルトの分類子が使用されます。

ドキュメント全体に対して単一センチメントを識別するか、ドキュメント内の各トピックに対して個別のセンチメントを識別できます。最もよくあるのは、1つのドキュメントに複数のトピックが含まれ、各トピックに対する作成者のセンチメントが異なる場合です。このような場合、ドキュメント・レベルのセンチメント・スコアは、ドキュメント内の各トピックに関連付けられているセンチメントを識別できないため有用でない可能性があります。トピック・レベルでセンチメント・スコアを識別すると、必要な回答が得られます。たとえば、カメラのレビューを含むドキュメントのセットを検索すると、ドキュメント・レベルのセンチメントによってカメラがよい製品かどうかわかります。カメラの写真品質に関する一般的な意見が必要であるとします。トピックの1つに"写真品質"を使用してトピック・レベルのセンチメント分析を実行すると、必要な情報が提供されます。

ノート:

センチメント分析の関連トピックを指定しない場合、Oracle Textはドキュメント全体に対して全体的なセンチメントを返します。

16.1.4 センチメント分析インタフェース

Oracle Textは、センチメント分析を実行するための複数のインタフェースをサポートします。

次のインタフェースのいずれかを使用して、センチメントの問合せを実行します。

  • CTX_DOCパッケージのプロシージャ

  • XML問合せの結果セット・インタフェース(RSI)

16.2 センチメント分類子プリファレンスの作成

CTX_DDL.CREATE_PREFERENCEプロシージャを使用してセンチメント分類子プリファレンスを作成し、CTX_DDL.SET_ATTRIBUTEプロシージャを使用してその属性を定義します。ユーザー定義のセンチメント分類子プリファレンスに関連付けられている分類子のタイプはSENTIMENT_CLASSIFIERです。

センチメント分類子プリファレンスを作成するには:

  1. センチメント分類子プリファレンスを定義するには、CTX_DDL.CREATE_PREFERENCEプロシージャを使用します。分類子はSENTIMENT_CLASSIFIER.型であることが必要です
  2. センチメント分類子プリファレンスの属性を定義するには、CTX_DDL.SET_ATTRIBUTEプロシージャを使用します。属性によって、センチメント分類子のトレーニングに使用するパラメータを定義します。

例16-1 センチメント分類子プリファレンスの作成

次の例では、clsfier_cameraという名前のセンチメント分類子プリファレンスを作成しています。このプリファレンスは、SLRカメラのレビューが含まれているドキュメントのセットを分類するために使用します。

  1. タイプSENTIMENT_CLASSIFIERのセンチメント分類子プリファレンスをclsfier_cameraという名前で定義します。

    exec ctx_ddl.create_preference('clsfier_camera','SENTIMENT_CLASSIFIER');
  2. clsfier_cameraセンチメント分類子プリファレンスの属性を定義します。抽出する特徴の最大数は1000に設定します。分類子が実行される反復回数は600に設定します。

    exec ctx_ddl.set_attribute('clsfier_camera','MAX_FEATURES','1000');
    exec ctx_ddl.set_attribute('clsfier_camera','NUM_ITERATIONS','600');

明示的に定義されていない属性の場合、デフォルト値が使用されます。

16.3 センチメント分類子のトレーニング

センチメント分類子をトレーニングすると、検索キーワードに関して肯定的または否定的なセンチメントを提供するために使用される分類ルールが生成されます。

次の例では、カメラのユーザー・レビューに関するセンチメント分析を実行できるセンチメント分類子をトレーニングします。

  1. トレーニング・ドキュメント表の作成および移入この表には、トレーニング・セット・ドキュメントまたはファイル名(ドキュメントが外部に存在する場合)の実際のテキストが含まれます。

    トレーニング・ドキュメントが、トレーニングされたセンチメント分類子の潜在的なバイアスを避けるためにランダムに選択されていることを確認します。肯定的なドキュメントと否定的なドキュメントの分布を歪めることはできません。Oracle Textでは、センチメント分類子のトレーニング中にこの分布をチェックします。

    create table training_camera (review_id number primary key, text varchar2(2000));
    insert into training_camera values( 1,'/sa/reviews/cameras/review1.txt');
    insert into training_camera values( 2,'/sa/reviews/cameras/review2.txt');
    insert into training_camera values( 3,'/sa/reviews/cameras/review3.txt');
    insert into training_camera values( 4,'/sa/reviews/cameras/review4.txt');
    
  2. カテゴリ表の作成および移入

    この表では、ドキュメント表内に存在するドキュメントのトレーニング・ラベルを指定します。トレーニング・セット・ドキュメント正しいセンチメントが分類子に伝えられます。

    ドキュメント表のプライマリ・キーには、カテゴリ表の一意のキーとの外部キー関係が必要です。これらの列の名前をCTX_CLS.SA_TRAINプロシージャに渡して、センチメント・ラベルを対応するドキュメントに関連付けることができるようにする必要があります。

    Oracle Textは、分類子プリファレンスとcategory値に対して指定されているパラメータを検証します。category値は、肯定的な場合は1、否定的な場合は2、中立のセンチメントの場合は0に制限されます。categoryが0のドキュメント(中立のドキュメント)は、分類子のトレーニング中に使用されません。ドキュメントIDとカテゴリを除く、カテゴリ表の追加の列も分類子で使用されません。

    create table train_category (doc_id number, category number, category_desc varchar2(100));
    
    insert into train_category values (1,0,'neutral');
    insert into train_category values (2,1,'positive');
    insert into train_category values (3,2,'negative');
    insert into train_category values (4,2,'negative');
    
  3. トレーニング・ドキュメント表でコンテキスト索引を作成します。この索引を使用して、センチメント分類子のトレーニング中にドキュメントのトレーニングに関連するメタデータを抽出します。

    この例では、索引を移入なしで作成します。

    exec ctx_ddl.create_preference('fds','DIRECTORY_DATASTORE');
    create index docx on training_camera(text) indextype is ctxsys.context parameters ('datastore fds nopopulate');
  4. (オプション)カメラ・レビューで構成されるドキュメント・セットでセンチメント分析を実行するclsfier_cameraセンチメント分類子プリファレンスを作成します。
  5. センチメント分類子clsfier_camera.をトレーニングします

    トレーニング中、Oracle Textでは否定的なドキュメントに対する肯定的なドキュメントの比率が確認されます。この比率が0.4から0.6の範囲内にない場合、センチメント分類子が歪められていることを示す警告がCTXログに書き込まれます。センチメント分類子は、トレーニング後、センチメント問合せで使用してセンチメント分析を実行できるようになります。

    次の例では、clsfier_cameraはトレーニングされているセンチメント分類子の名前、review_idはドキュメント・トレーニング・セットのドキュメントID列の名前、train_categoryはトレーニング・セット・ドキュメントのラベルを含むカテゴリ表の名前、doc_idはカテゴリ表のドキュメントID列、categoryはカテゴリ表のカテゴリ列、およびclsfierは分類子のトレーニングに使用されるセンチメント分類子プリファレンスの名前です。

    exec ctx_cls.sa_train_model('clsfier_camera','docx','review_id','train_category','doc_id','category','clsfier');

    ノート:

    CTX_CLS.SA_TRAIN_MODELプロシージャの実行時にセンチメント分類子プリファレンスを指定しないと、Oracle TextではデフォルトのプリファレンスCTXSYS.DEFAULT_SENTIMENT_CLASSIFIER.が使用されます

16.4 CTX_DOCパッケージを使用したセンチメント分析の実行

CTX_DOCパッケージのプロシージャを使用してドキュメント・セット内の単一のドキュメントでセンチメント分析を実行します。ドキュメントごとに、ドキュメント全体で1つのセンチメント・スコアを決定するか、ドキュメント内のトピックごとに個別のセンチメント・スコアを決定できます。

センチメント分析を実行する前に、ドキュメント・セットでコンテキスト索引を作成する必要があります。次のコマンドでは、camera_reviews表に含まれているドキュメント・セットでcamera_revidxコンテキスト索引が作成されます。

create index camera_revidx on camera_reviews(review_text) indextype is
ctxsys.context parameters ('lexer mylexer stoplist ctxsys.default_stoplist');

CTX_DOCパッケージでセンチメント分析を実行するには、次のいずれかの方法を使用します。

  • 必要なパラメータを使用してCTX_DOC.SENTIMENT_AGGREGATEプロシージャを実行する

    このプロシージャは、ドキュメント全体に対する単一統合センチメント・スコアを提供します。

    センチメント・スコアは-100から100の範囲の値で、センチメントの強度を示します。負のスコアは否定的なセンチメントを表し、正のスコアは肯定的なセンチメントを表します。センチメント・スコアに基づき、スコアを「強く否定(-80から-100)」、「否定(-80から-50)」、「中立(-50から+50)」、「肯定(+50から+80)」、「強く肯定(+80から+100)」などのラベルにグループ分けできます。

  • 必要なパラメータを使用してCTX_DOC.SENTIMENTプロシージャを実行する

    このプロシージャは、検索語を含むドキュメント内の個々のセグメントを返し、各セグメントに関連付けられたセグメント・スコアを提供します。

例16-2 ドキュメントの単一センチメント・スコアの取得

次の例では、clsfier_cameraセンチメント分類子を使用してドキュメント全体に対する単一の集計センチメント・スコアを提供します。センチメント分類子が作成およびトレーニングされました。ドキュメント・セットを含む表には、camera_revidxコンテキスト索引があります。センチメント分析を実行する必要のあるドキュメント表内のドキュメントのdoc_idは49です。センチメント・スコアが生成されるトピックは'Nikon'です。

select ctx_doc.sentiment_aggregate('camera_revidx','49','Nikon','clsfier_camera') from dual;

CTX_DOC.SENTIMENT_AGGREGATE('CAMERA_REVIDX','49','NIKON','CLSFIER_CAMERA')
--------------------------------------------------------------------------
                            74
1 row selected.

例16-3 デフォルトの分類子を使用した単一のセンチメント・スコアの取得

次の例では、ドキュメントのセンチメント分類子を使用してドキュメント全体の集計センチメント・スコアを提供します。ドキュメント・セットを含む表には、camera_revidxコンテキスト索引があります。センチメント分析を実行する必要のあるドキュメント表内のドキュメントのdoc_idは1です。

select ctx_doc.sentiment_aggregate('camera_revidx','1') from dual;

CTX_DOC.SENTIMENT_AGGREGATE('CAMERA_REVIDX','1')
--------------------------------------------
                                           2

1 row selected.

例16-4 ドキュメント内の各トピックのセンチメント・スコアの取得

次の例では、clsfier_cameraセンチメント分類子を使用してドキュメント内の各セグメントのセンチメント・スコアを生成します。センチメント分類子が作成およびトレーニングされました。ドキュメント・セットを含む表には、camera_revidxコンテキスト索引があります。センチメント分析を実行する必要のあるドキュメント表内のドキュメントのdoc_idは49です。センチメント・スコアが生成されるトピックは'Nikon'です。分析結果が移入されるrestab結果表は、スニペット(CLOB)列とスコア(NUMBER)列を使用して作成されました。

exec ctx_doc.sentiment('camera_revidx','49','Nikon','restab','clsfier_camera', starttag=>'<<', endtag=>'>>');

SQL> select * from restab;
SNIPPET						
--------------------------------------------------------------------------------
     SCORE
----------
It took <<Nikon>> a while to produce a superb compact 85mm lens, but this time they finally got it right.
        65

Without a doubt, this is a fine portrait lens for photographing head-and-shoulder portraits (The only lens which is optically better is 
<<Nikon>>'s legendary 10
5mm f2.5 Nikkor lens, and its close optical twin, the 105mm f2.8 Micro Nikkor.
        75

Since the 105mm f2.5 Nikkor lens doesn't have an autofocus version, then this might be the perfect moderate telephoto lens for owners of 
<<Nikon>> autofocus 
SLR cameras.
        84
3 rows selected.

例16-5 ドキュメント内のトピックのセンチメント・スコアの取得

次の例では、tdrbrtsent03_clセンチメント分類子を使用してドキュメント内の各セグメントのセンチメント・スコアを生成します。センチメント分類子が作成およびトレーニングされました。ドキュメント・セットを含む表には、tdrbrtsent03_idxコンテキスト索引があります。センチメント分析を実行する必要のあるドキュメント表内のドキュメントのdoc_idは1です。センチメント・スコアが生成されるトピックは'movie'です。分析結果が移入されるtdrbrtsent03_rtab結果表は、スニペット列とスコア列を使用して作成されました。

SQL> exec ctx_doc.sentiment('tdrbrtsent03_idx','1','movie','tdrbrtsent03_rtab','tdrbrtsent03_cl');
PL/SQL procedure successfully completed.  

SQL> select * from tdrbrtsent03_rtab;
SNIPPET
--------------------------------------------------------------------------------      
SCORE
---------- 
the <b>movie</b> is a bit overlong , but nicholson is such good fun that the running time passes by pretty quickly
 -62

1 row selected.

関連項目:

16.5 RSIを使用したセンチメント分析の実行

XML問合せの結果セット・インタフェース(RSI)により、デフォルトのセンチメント分類子またはユーザー定義のセンチメント分類子を使用してドキュメントのセットに対してセンチメント分析を実行できます。センチメント分析を実行する必要のあるドキュメントはドキュメント表内に格納されます。

入力RSIのsentiment要素は、結果セット記述子(RSD)で指定された他の操作に加えて問合せ時にセンチメント分析を実行する必要があることを示すために使用します。sentiment要素のclassifier属性の値を指定すると、指定したセンチメント分類子がセンチメントの分析の実行に使用されます。classifier属性を省略すると、Oracle Textではデフォルトのセンチメント分類子を使用してセンチメント分析が実行されます。sentiment要素には、センチメント分析中にセンチメントを生成する必要があるトピックまたは概念を指定する、itemと呼ばれる子要素が含まれます。

各ドキュメントの単一のセンチメント・スコアまたはドキュメント内のトピックごとに個別のセンチメント・スコアを生成できます。item要素のagg属性を使用して、各ドキュメントの単一の集計センチメント・スコアを生成します。

センチメント分類を実行するには、キーワード問合せまたはABOUT演算子を使用します。ABOUT演算子を使用する場合、結果セットにはシソーラスを使用して識別されたキーワードのシノニムが含まれます。

RSIを使用してセンチメント分析を実行するには:

  1. センチメント分析の実行に使用するセンチメント分類子を作成およびトレーニングします。
  2. 分析するドキュメントとドキュメント表のコンテキスト索引を含むドキュメント表を作成します。
  3. 問合せ内の必要な要素と属性を使用してセンチメント分析を実行します。

    RSIにはsentiment要素を含める必要があります。

例16-6 センチメント分析を実行するためのRSDの入力

次の例では、センチメント分析を実行し、'lens'トピックのセンチメントを生成します。駆動問合せは'camera'のキーワード問合せです。sentiment要素は、センチメント分析をclsfier_cameraセンチメント分類子を使用して実行する必要があることを指定します。この分類子は、以前はCTX_CLS.SA_TRAIN_MODELプロシージャを使用して作成およびトレーニングしていました。camera_revidxコンテキスト索引はドキュメント・セット表にあります。

センチメント・スコアの範囲は-100~100です。正のスコアは肯定的なセンチメントを示し、負のスコアは否定的なセンチメントを示します。スコアの絶対値は、肯定的および否定的なセンチメントの大きさを示します。

センチメント分析を実行して、ドキュメント内の各トピックのセンチメント・スコアを取得するには:

  1. 検索操作の結果を格納する結果セット表rsを作成します。

    SQL> var rs clob;
    SQL> exec dbms_lob.createtemporary(:rs, TRUE, DBMS_LOB.SESSION);
    
  2. 検索問合せの一部としてセンチメント分析を実行します。

    検索されているキーワードは'camera'です。センチメント分析が実行されるトピックは'lens'です。

    begin
    ctx_query.result_set('camera_revidx','camera',' 
        <ctx_result_set_descriptor>
            <hitlist start_hit_num="1" end_hit_num="10" order="score desc"> 
            <sentiment classifier="clsfier_camera">
               <item topic="lens" /> 
               <item topic="picture quality" agg="true" />
           </sentiment> </hitlist>
       </ctx_result_set_descriptor>',:rs); 
    end; 
    / 
    
    
  3. 結果表に格納されている結果を表示します。

    他のアプリケーションでXML結果セットを使用して、さらに処理を加えることができます。簡潔にするために、一部の出力を削除しました。ドキュメント内のセグメントごとに、スコアがセグメントのセンチメント・スコアを表します。

    SQL> select xmltype(:rs) from dual; 
    XMLTYPE(:RS) 
    -------------------------------------------------------------------------------- 
    <ctx_result_set>
      <hitlist>
        <hit>
          <sentiment>
             <item topic="lens">          
                <segment>             
                   <segment_text>The first time it was sent in was because the <b>lens </b> door failed to turn on the camera 
    and it was almost to come off of its track . Eight months later, the flash quit working in all modes AND the door was 
    failing AGAIN!</segment_text>           
                    <segment_score>-81</segment_score>           
               </segment>         
            </item>        
             <item topic="picture quality"> <score> -75 </score>       
             </item>
          </sentiment>
        </hit>
        <hit>
           <sentiment>
              <item topic="lens">
                 <segment>
                     <segment_text>I was actually quite impressed with it. Powerful zoom , sharp <b>lens</b>, decent picture 
    quality. I also played with some other Panasonic models in various stores just to get a better feel for them, as well as 
    spent a few hours on </segment_text> 
                      <segment_score> 67 </segment_score>           
                </segment>        
              </item>         
                 <item topic="picture quality">  <score>-1</score>    </item>
           </sentiment>
        </hit> 
        . . . 
      . . .
      </hitlist>
    </ctx_result_set>