テキスト分析と単語ベクトル

このセクションでは、数式におけるテキスト分析、テキスト解析、および TF-IDF 単語ベクトル関数について概要を説明します。

テキスト分析

analyze 関数は、Solr アナライザーをテキストフィールドに適用し、アナライザーによって出力されたトークンを配列で返します。 Solr のスキーマでフィールドに添付されているアナライザーチェーンは、analyze 関数で使用できます。

以下の例では、テキスト "hello world" は、スキーマの subject フィールドに添付されたアナライザーチェーンを使用して分析されます。 subject フィールドはフィールドタイプ text_general として定義されており、テキストは text_general フィールドタイプに設定された分析チェーンを使用して分析されます。

analyze("hello world", subject)

この式が /stream ハンドラに送信されると、次の応答が返されます。

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          "hello",
          "world"
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

ドキュメントへのアノテーション

analyze 関数は、select 関数内で使用して、分析によって生成されたトークンでドキュメントにアノテーションを付けることができます。

以下の例では、"collection1" で search を実行します。 search 関数によって返される各タプルには、idsubject が含まれています。 各タプルについて、select 関数は id フィールドを選択し、subject フィールドで analyze 関数を呼び出します。 subject_bigram フィールドで指定されたアナライザーチェーンは、バイグラム分析を実行するように設定されています。 analyze 関数によって生成されたトークンは、terms というフィールドの各タプルに追加されます。

select(search(collection1, q="*:*", fl="id, subject", sort="id asc"),
       id,
       analyze(subject, subject_bigram) as terms)

出力では、バイグラム単語の配列がタプルに追加されていることに注意してください。

{
  "result-set": {
    "docs": [
      {
        "terms": [
          "text analysis",
          "analysis example"
        ],
        "id": "1"
      },
      {
        "terms": [
          "example number",
          "number two"
        ],
        "id": "2"
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 4
      }
    ]
  }
}

テキスト解析

cartesianProduct 関数は、analyze 関数と組み合わせて使用​​することで、幅広いテキスト解析を実行できます。

cartesianProduct 関数は、複数値フィールドをタプルのストリームに展開します。 analyze 関数を使用して複数値フィールドを作成する場合、cartesianProduct 関数は、分析されたトークンをタプルのストリームに展開します。 これにより、分析されたトークンのストリームに対して分析を実行し、Zeppelin-Solr で結果を視覚化できます。

例: フレーズ集計

フレーズ集計を実行する例を使用して、cartesianProductanalyze を組み合わせる効果を示します。

この例では、映画レビューのコレクションに対して search 式が実行されます。 フレーズクエリ "Man on Fire" が検索され、スコア順に上位 5000 件の結果が返されます。 結果から返される単一のフィールドは、映画レビューのテキストを含む review_t フィールドです。

次に、検索結果に対して cartesianProduct 関数が実行されます。 cartesianProduct 関数は analyze 関数を適用します。これは、review_t フィールドを取得し、text_bigrams スキーマフィールドに添付されたアナライザーで分析します。 このアナライザーは、テキストフィールドで見つかったバイグラムを出力します。 cartesianProduct 関数は、各バイグラムを term フィールドに格納されたバイグラムを持つ独自のタプルに展開します。

それぞれバイグラムを含むタプルのストリームは、正規表現を使用して having 関数によってフィルタリングされ、長さが 12 以上のバイグラムを選択し、特定の文字を含むバイグラムを除外します。

次に、hashRollup 関数はバイグラムを集計し、top 関数はカウント別に上位 10 個のバイグラムを出力します.

次に、Zeppelin-Solr を使用して上位 10 個のバイグラムを視覚化します。

text analytics

アナライザーは、正規表現または辞書で抽出されたトークンだけでなく、NLP エンティティ (人、場所、会社など) に対する集計をサポートするために、さまざまな方法で構成できます。

TF-IDF 単語ベクトル

termVectors 関数を使用して、analyze 関数によって生成された単語から TF-IDF 単語ベクトルを構築できます。

termVectors 関数は、id というフィールドと terms というフィールドを含むタプルのリストに対して動作します。これは、上記の文書アノテーションの例の出力構造と全く同じであることに注意してください。

termVectors 関数は、タプルのリストから行列を作成します。行列には、リスト内の各タプルに対応する行があります。行列には、terms フィールドの各用語に対応する列があります。

let(echo="c, d", (1)
    a=select(search(collection3, q="*:*", fl="id, subject", sort="id asc"), (2)
             id,
             analyze(subject, subject_bigram) as terms),
    b=termVectors(a, minTermLength=4, minDocFreq=0, maxDocFreq=1), (3)
    c=getRowLabels(b), (4)
    d=getColumnLabels(b))

以下の例は、上記の文書アノテーションの例に基づいています。

1 echo パラメータは変数 cd をエコーするため、出力には行ラベルと列ラベルが含まれます。これらは式の中で後で定義されます。
2 タプルのリストは変数 a に格納されます。termVectors 関数は変数 a に対して動作し、2 行 4 列の行列を作成します。
3 termVectors 関数は、用語ベクトル行列の行ラベルと列ラベルを変数 b として設定します。行ラベルは文書 ID で、列ラベルは用語です。
4 getRowLabels 関数と getColumnLabels 関数は、行ラベルと列ラベルを返します。これらは変数 cd に格納されます。

この式が /stream ハンドラに送信されると、次の応答が返されます。

{
  "result-set": {
    "docs": [
      {
        "c": [
          "1",
          "2"
        ],
        "d": [
          "analysis example",
          "example number",
          "number two",
          "text analysis"
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 5
      }
    ]
  }
}

TF-IDF 値

用語ベクトル行列内の値は、各文書の各用語の TF-IDF 値です。以下の例は、行列の値を示しています。

let(a=select(search(collection3, q="*:*", fl="id, subject", sort="id asc"),
             id,
             analyze(subject, subject_bigram) as terms),
    b=termVectors(a, minTermLength=4, minDocFreq=0, maxDocFreq=1))

この式が /stream ハンドラに送信されると、次の応答が返されます。

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            1.4054651081081644,
            0,
            0,
            1.4054651081081644
          ],
          [
            0,
            1.4054651081081644,
            1.4054651081081644,
            0
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 5
      }
    ]
  }
}

ノイズの制限

用語ベクトルを扱う際の重要な課題の1つは、テキストにはしばしば大量のノイズが含まれており、データの重要な用語を覆い隠してしまう可能性があることです。termVectors 関数には、重要性の低い用語を除外するために設計されたパラメータがいくつかあります。ノイズとなる用語を除外することで、用語ベクトル行列をメモリに収まる程度に小さく保つことができるため、これも重要です。

用語ベクトル行列からノイズとなる用語を除外するために設計された4つのパラメータがあります。

minTermLength

オプション

デフォルト:3

行列に用語を含めるために必要な最小用語長。

minDocFreq

オプション

デフォルト:.05

インデックスに含めるために、用語が出現する必要がある文書の最小割合(0 から 1 までの数値で表す)。

maxDocFreq

オプション

デフォルト:.5

インデックスに含めるために、用語が出現できる文書の最大割合(0 から 1 までの数値で表す)。

exclude

オプション

デフォルト:なし

用語を除外するために使用される、カンマ区切りの文字列リスト。用語に除外文字列のいずれかが含まれている場合、その用語は用語ベクトルから除外されます。