コンテンツ分析コレクションのカスタム・ルール・ファイル

コンテンツ分析のためのカスタム・ルールを構成することができます。 そのルールは、自然言語処理において適用され、作成されたアノテーションは索引の一部となります。 ユーザーは、コンテンツ分析マイナーでファセットを選択して、ルールの効果を調べることができます。

コレクションのカスタム・ルールを定義して変更を保存すると、システムはルールをアノテーションの処理に必要な形式に変換します。

テキスト分析ルールに対して追加または変更を加えた場合は、変更を新しい文書に適用できるようにテキスト分析リソースを再配置する必要があります。既に索引内にある文書に新しいルールを適用するには、索引を再作成する必要があります。

概念の抽出

人間同士のコミュニケーションでは、概念を表現するのに、通常は語を組み合わせる必要があります。 この組み合わせは単に、個々に検索可能なワードが連続したものというわけでは ありません。多くの場合、概念とは、複雑な文法上の関係によりつながった一連の語となります。

テキスト分析のルールを構成することにより、概念を構造化データへと変換し、ユーザーが探索を行えるようにできます。 以下の文を考えてみます。
President Lincoln visited Gettysburg yesterday.
基本的なテキスト分析では、以下の情報が提供されます。
  • President Lincoln は固有名詞。
  • visit は動詞。
  • Gettysburg は場所。
ただし、この文で表される本当の概念は、米国の際立った大統領であったリンカーン大統領が、南北戦争の主戦場であった町ペンシルベニア州ゲティスバーグにいた、ということです。 テキストからパターンを抽出するルールを構成することにより、分析エンジンは、リンカーン大統領のいた場所や訪問の真の目的についての質問に答えることができます。

ルール・ファイルの形式

ルール・ファイルは、XML 形式で file_name.pat ファイルに格納されます。 すべてのルール (<mi> 要素) はファセット (category 属性) に関連付ける必要があります。 各エントリー (<w> 要素) は、抽出して分析するトークンを定義し、各トークンは品詞 (pos="noun") などの制約を指定します。 例えば、以下の操作が可能です。
<?xml version="1.0" encoding="UTF-8"?>
<pattern-list lang="en">

<mi category="$.myword" value="${0.lex} ${1.lex}">
<w id="0" pos="verb" lex="visit" />
<w id="1" pos="noun" />
</mi>

</pattern-list>

ルールのコンポーネント

正規表現構文

Watson Content Analytics では、ルール定義において正規表現のパターン・マッチングに Java™ の java.util.regex パッケージを使用します。 以下の演算子は、特殊な意味を持っています。
/ 演算子
スラッシュ ( / ) 演算子 (Java regex 構文の一部でない) を含むルールはすべて、java.util.regex クラスを使用して評価されます。 例えば、式 str="/love/" は、love、lovely、beloved、および glove と一致します。

最初または最後の / 演算子がないと、この制約は正規表現として解釈されません。 代わりに、この制約はストリングのパターン・マッチングとして解釈されます。

| 演算子
パイプ ( | ) 演算子は、ブール OR 演算子として解釈されます。 この演算子は、正規表現インタープリターでは解釈されないリテラル制約です。 評価対象の語のリスト内のいずれかの語が文書に含まれる場合に、一致したとみなされます。
^ 演算子
この演算子は、行の先頭のみと一致します。 例えば、str="/^love/" は、loves と lovely が一致しますが、beloved や glove は一致しません。
$ 演算子
この演算子は、行の末尾のみと一致します。 例えば、str="/love$/" は、love と glove が一致しますが、lovely や loves は一致しません。
( ) 演算子
括弧は、グループ演算子です。 複数のワードや、これらワードの変化形を Java regex インタープリターで評価する場合に、この演算子を使用します。

サンプルの品詞ルールとストリング・ルール

以下のルールでは、品詞制約とストリング制約を組み合わせて、1 番目の (0) 位置にある形容詞または動詞と、これに続く 2 番目の (1) 位置にあるストリング excessively、poorly、badly、または hardly のいずれかの組み合わせを検索します。
<w id="0" pos="/^((adjective)|(verb))$/"/>
<w id="1" str="/^((excessively)|(poorly)|(badly)|(hardly))$/"/>
designed poorly、working hardly、perform badly、または smoking excessively などのストリングを含む文書で一致したという結果が返されます。
形容詞または動詞が 2 番目の位置にあるケース (poorly functioning、hardly smokes、badly runs、または excessively loud など) を処理するには、最初のルールと逆のルールを作成します。
<w id="0" str="/^((excessively)|(poorly)|(badly)|(hardly))$/"/>
<w id="1" pos="/^((adjective)|(verb))$/"/>

^ 演算子と $ 演算子を含めることで、Java regex インタープリターが呼び出され、語 excessively、poorly、badly、hardly の変化形が抽出されないようにします。 括弧内のいずれかの語のみを含む式が、一致とみなされます。

サンプルのレックス・ルール

語の変化形を抽出できるようにするには、ストリング制約でなく、レックス制約として語を定義できます。 ストリング制約では、見出し語化は適用されません。 レックス制約では、見出し語化によって、それぞれのワードの基本形と、同じ品詞を共有する語形変化形について見出し語が判別されます。 例えば、見出し語 go には、go、goes、went、gone および going が含まれます。

以下のサンプル・ルールでは、ワード hard が品詞 (形容詞) として登録され、その比較級と最上級である harder と hardest にリンクされます。 ルールには、ワード difficult が含まれ、この制約では hard の同義語として機能します。
<w id="0" lex="/^((hard)|(difficult))$/"/>
<w id="1" lex="to"/>
<w id="2" pos="verb"/>
このルールの 2 つ目のエントリー <w id="1" lex="to"/> により、hard to brake や hard to start などのパターンが抽出されます。 ワード to をレックス制約として追加することで、意図しない hard working などのパターンとの一致を回避できます。

サンプルのファセット・ルール

この例では、データベースから従業員のファーストネームとラストネームを抽出します。 ファーストネームとラストネームの値を保持する 2 つのファセットを作成し、ファセット・パスを first_name と last_name として定義しています。 また、従業員名のエントリーを含むカスタム・ユーザー辞書を作成し、従業員名をファセットにマップしています。 以下のルールは、カテゴリー制約を使用して、ファセットの値 (従業員名) の一致を検索します。

<w id="0" category="$.first_name"/>
<w id="1" category="$.last_name"/>