Data Integration、ファンクション、AIを利用して名前付き固有表現(Named Entity Recognition)(2021/10/01)

Data Integration、ファンクション、AIを利用して名前付き固有表現(Named Entity Recognition)(2021/10/01)

https://blogs.oracle.com/cloud-infrastructure/post/using-data-integration-functions-and-ai-to-perform-named-entity-recognition

投稿者:David Allan


お帰りなさい。本日は、OCI Data IntegrationのOracle Cloud Infrastructure(OCI)ファンクラブ機能についてご紹介します。このブログ記事では、データフローの中で独自のファンクションを呼び出し、あらゆる種類の変換を行う方法の例をご紹介します。


Data Integrationでデータ・フローを設計する際には、ファンクションを選択し、入力を定義し、ファンクションの構成パラメータを定義し、出力を定義するためのいくつかのステップを実行します。この例では、製品の入力データをLanguage AIサービスからの情報でリッチ化し、製品内の非構造化テキストに対して名前付きエンティティ認識を実行するデータフローを設計します。その後、返されたスコアプロパティで結果をフィルタリングし、地政学的情報などのカテゴリ別に集計することができます。



前提条件



OCI Data IntegrationでのOCI Functionsの使い方を探ってみましょう!


この例では、OCI Languageの機能を使ってData Integrationでデータを分類・分析します。Languageはサーバーレスでマルチテナントのサービスで、REST APIコールとPythonを含むOCIソフトウェア開発キット(SDK)を使ってアクセスできます。OCI Languageサービスでは、事前に学習されたモデルを提供しており、頻繁に再学習とモニタリングを行うことで、最良の結果を提供しています。OCI LanguageのNER(Named Entity Recognition)を使って、人、場所、組織などのエンティティの名前を識別します。詳細については、ドキュメントをご覧ください。


OCI Data Integrationでは、OCI Data Integrationデータフロー内のカスタムファンクションを使用してこの機能を適用します。このフローでは、あらゆる種類のソースデータを処理してデータを準備・形成し、テキストからエンティティを抽出して分析し、この情報を集約して、このデータを次の分析に利用することができます。NER機能は、特定のエンティティが存在するかどうかや、テキストの文脈に関する情報を提供します。NERには、以下のユースケースのための機能が含まれる。

  •     ニュースプロバイダーのためのコンテンツの分類:ニュース記事のコンテンツを分類することは難しいものです。NERツールは、記事を自動的にスキャンして、その中の主要な人物、組織、場所を特定することができます。抽出されたエンティティは、関連記事のタグとして保存できます。各記事の関連タグを知ることで、定義された階層で記事を自動的に分類することができ、コンテンツディスカバリーが可能になります。
  •     カスタマーサポート:お客様からの苦情やフィードバックの中から、製品仕様、部署の詳細、会社の支店の詳細など、関連するエンティティを認識することで、フィードバックを適切に分類することができます。そして、そのエンティティを、特定された製品の責任者に転送することができます。同様に、所在地や記載されている製品に基づいてフィードバックを分類することもできます。
  •     効率的な検索アルゴリズム:NERは、オンライン上の何百万もの記事やウェブサイトからクエリを検索する代わりに、クエリに対して検索されるエンティティを抽出するために使用することができます。記事に対して実行すると、各記事に関連するすべての関連エンティティが抽出され、別々に保存されます。この分離により、検索プロセスが大幅に高速化されます。検索語は、各記事に含まれるエンティティの小さなリストとのみ照合されるため、迅速で効率的な検索が可能になります。これにより、何百万もの研究論文、Wikipediaの記事、ブログ、記事などのコンテンツを検索することができます。
  •     コンテンツの推奨:NERでは、特定の記事からエンティティを抽出し、最も類似したエンティティに言及している他の記事を推奨することができます。例えば、メディア業界のクライアントに対して、NERを使って効果的にコンテンツ推薦を展開することができます。これにより、過去のコンテンツや過去の活動に関連するエンティティを抽出することができます。NERは、それらを他の未見のコンテンツに割り当てられたラベルと比較し、関連するエンティティをフィルタリングします。
  •     求職者を自動的に要約:NERツールは、多数の応募書類を持つ候補者を絞り込むために必要な労力を簡略化することで、求職者の評価を容易にすることができる。採用担当者は、場所、大学の学位、雇用主、スキル、指名、認証、特許などの識別されたエンティティに基づいて、候補者をフィルタリングし、分類することができる。



OCIにおける名前付き実体認識


データを準備したら、エンティティを識別するために名前付きエンティティ認識機能を入れます。ここで定義したファンクションは汎用的なものです。入力データのどの属性をエンティティ認識に使用するかを指定します。次のスクリーンショットに示すように、OCIコンソールからAPIを試すことができます。



結果には、テキスト、タイプ(日付、イベント、組織など)、スコア(信頼度)が表示されます。



OCIデータインテグレーションでは、製品データからいくつかの入力データを用意し、名前付きエンティティ認識機能を呼び出して属性を抽出するデータフローを設計します。名前付きエンティティ認識は以下の属性を返し、これを出力属性として演算子に追加します。


  •     オフセット(整数)。このエンティティのオフセットプロパティに割り当てる値
  •     長さ(整数)。このエンティティの長さプロパティに割り当てられる値
  •     Text(varchar)。Text (varchar): このエンティティのテキストプロパティに割り当てられる値
  •     Type (varchar): Type (varchar): このエンティティのtypeプロパティに割り当てられる値
  •     is_pii (boolean): is_pii (boolean): このエンティティの is_pii プロパティに割り当てられる値。PIIとはPersonal Identifiable Informationの略です。
  •     score(10進数):このエンティティのis_piiプロパティに割り当てる値。このエンティティのscoreプロパティに割り当てられる値


次の表は、現在含まれているエンティティの種類を示しています。これらのエンティティタイプは、地政学的なエンティティによる分析や、言語による組織別の分析など、それぞれ異なる統合や分析のユースケースが考えられます。


Entity full name

Entity (In prediction)

Is PII

Description

DATE

DATE

Χ

Absolute or relative dates, periods, and date range

EMAIL

EMAIL

 

EVENT

EVENT

Χ

Named hurricanes, sports events, and so on

FACILITY

FAC

Χ

Buildings, airports, highways, bridges, and so on

GEOPOLITICAL ENTITY

GPE

Χ

Countries, cities, and states

IP ADDRESS

IPADDRESS

IP address according to IPv4 and IPv6 standards

LANGUAGE

LANGUAGE

Χ

Any named language

LOCATION

LOCATION

Χ

Non-GPE locations, mountain ranges, bodies of water

MONEY

MONEY

Χ

Monetary values, including the unit

NATIONALITIES, RELIGIOUS, and POLITICAL GROUPS

NORP

Χ

Nationalities, religious, or political groups

ORGANIZATION

ORG

Χ

Companies, agencies, institutions, and so on

PERCENT

PERCENT

Χ

Percentage

PERSON

PERSON

People, including fictional characters

PHONENUMBER

PHONE_NUMBER

Supported phone numbers:

  • United Kingdom (GB)

  • New Zealand (NZ)

  • Singapore (SG)

  • India (IN)

  • United States (US)

PRODUCT

PRODUCT

Χ

Vehicles, tools, foods, and so on (not services)

QUANTITY

QUANTITY

Χ

Measurements, as weight or distance

TIME

TIME

Χ

Anything less than 24 hours (time, duration, and so on)

URL

URL

URL.


OCI Data Integrationのデータフロー


次のデータフローでは、製品データがあります。ここでは、言語AIサービスを介して非構造化製品の説明情報を充実させ、0.9以上のスコアを持つ地政学的データでフィルタリングし、地政学的エンティティごとに製品を見るためにテキストで集約します。名前付き実体認識サービスを利用する前は、このような情報はありませんでした。また、生データを Object Storage のバケットに書き込みます。このファンクションの作成方法は、OCI Functions for named entity recognitionでご覧いただけます。



OCI Functionsアプリケーションの既存のデプロイされたファンクションからファンクションを選択することで、OCI機能を選択します。



次に、このファンクションの入力属性を定義します。ここでは、VARCHARである「inputText」という入力を使用します。



ファンクション設定属性(値がinputTextのカラム)を追加します。ファンクションはこれを使って、AI Languageの操作にどの列を使うかを定義します。この例では1つしかないので冗長ですが、このファンクションは他のイラストでも役に立ちます。



ここで、名前付きエンティティ認識コールが返す出力属性(score、text、type、is_pii、length、offsetなど)を定義します。textをVARCHARとして追加します。



スコアをDECIMAL(小数)で加算します。



タイプをVARCHARで追加します。



BOOLEANとしてis_piiを追加します。



長さをINTEGERで追加します。



オフセットをINTEGERで追加します。




ファンクション演算子はほぼ完成しています。次に、上流の属性をファンクションの入力にマッピングします。左のテーブルのPRODUCT_DESCRIPTIONを右のテーブルのinputText属性にドラッグ&ドロップしてマッピングします。名前が一致していれば、名前によるマッピングで自動的に属性がマッピングされます。



今回のフィルターでは、信頼度スコアが0.9以上で、エンティティの種類が地政学的エンティティ(GPE)であるエンティティのみを返すようにフィルタリングしています。



そして、GPEで分析するためのエンティティタイプを集約することができます。



フローを設計する一方で、データを検査することもできます。次のスクリーンショットでは、地政学的エンティティごとに集計された数が表示され、アメリカ合衆国を含む製品が他よりも多く発生していることがわかります。この集計された情報をターゲットバケットに書き込み、Oracle Analytic Cloudなどの分析ツールで分析します。



蓋を開けてみると、ファンクションがどのように作られているのかがわかります。



OCI Functionsによる名前付き実体認識


OCI Functionsのチュートリアルに従って、CloudShellのFunction CLIを使ってファンクションを作成するか、ローカルにインストールすることができます。必要なアーティファクトは、Python関数、ファンクションYAML、要件ファイルの3つです。

import io
import json
import logging
import pandas
import base64

from fdk import response

import oci
from oci.ai_language.ai_service_language_client import AIServiceLanguageClient

def handler(ctx, data: io.BytesIO=None):

    signer = oci.auth.signers.get_resource_principals_signer()
    resp = do(signer,data)
    return response.Response(
        ctx, response_data=resp,
        headers={"Content-Type": "application/json"}  
    )
    
def nr(dip, txt):
    details = oci.ai_language.models.DetectLanguageEntitiesDetails(text=txt)
    le = dip.detect_language_entities(detect_language_entities_details=details)
    return json.loads(le.data.entities.__repr__())
    
def do(signer, data):
    dip = AIServiceLanguageClient(config={}, signer=signer)
    
    body = json.loads(data.getvalue())
    input_parameters = body.get("parameters")
    col = input_parameters.get("column")
    input_data = base64.b64decode(body.get("data")).decode()
    df = pandas.read_json(input_data, lines=True)
    df[’enr’] = df.apply(lambda row : nr(dip,row[col]), axis = 1)
    #Explode the array of entities into row per entity
    dfe = df.explode(’enr’,True)
    #Add a column for each property we want to return from entity struct
    ret=pandas.concat([dfe,pandas.DataFrame((d for idx, d in dfe[’enr’].iteritems()))], axis=1)
    
    #Drop array of entities column
    ret = ret.drop([’enr’],axis=1)
    ret = ret.drop([col],axis=1)
    
    str=ret.to_json(orient=’records’)
    return str

このファンクションは、2つのプロパティを含むJSON入力を持ちます。Data(Base-64エンコードされたJSONレコードのストリーム)とparameters(ファンクションの設定名と値を含むJSONマップ)です。出力は、JSONレコードの配列として返されます。入力にも渡され、出力にも渡さなければならない重要なプロパティとして、secret_id_field カラムがあります。このチャンクには各行ごとに値があり、Data Integrationはこの値を使って、ファンクションからの結果とアップストリームの入力を関連付けます。アップストリームは200の属性を持つことができますが、ファンクションの入力属性は1つです。secret_id_fieldは、このファンクションからの出力をそのデータセットと相関させます。


OCI Fn YAML ファイルは、ファンクションの名前、ランタイム、エントリポイント、メモリフットプリント、およびタイムアウト (Data Integrationのケースではできるだけ長くしてください) を定義します。

schema_version: 20180708
name: namedentityrecognition
version: 0.0.1
runtime: python
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256
timeout: 300

次のFn requirements.txtファイルは、そのファンクションが持つ依存関係を定義しています。

fdk
pandas
numpy
oci>=2.39.0

OCI Functionsアプリケーションを作成し、ファンクションを公開すると、そのファンクションをテストすることができます。ドキュメントには、OCI Functionsを始めるための良いチュートリアルがここにあります。


よくある問題


  •     空白の値が表示されたり、java.lang.NumberFormatExceptionが発生する場合は、出力に定義した属性が、大文字や小文字、スペルなどのファンクションからのレスポンスと一致しているか確認してください。
  •     データフローでデータを表示すると、"com.oracle.bmc.model.BmcException: (-1, null, false) Processing exception while communicating to functions.null.oci.oraclecloud.com (outbound opc-request-id: nnnnnnnn)." と表示されます。OCI Data Integration のデータフロー内の Fn 演算子の [詳細] パネルで、ファンクションを選択したことを確認します。
  •     データフロー内のデータを表示すると、「com.oracle.bmc.model.BmcException.(502, FunctionInvokeExecec)」のようなエラーが表示されます。(502, FunctionInvokeExecutionFailed, false) function failed (opc-request-id: nnnnnn)" と表示された場合、ファンクションの入力属性がマッピングされているかどうかを確認してください。
  •     ファンクションが失敗した場合は、その関数のログメッセージを追加してください。


まとめ


この記事では、OCI Data Integration のデータフローに OCI Functions を統合する方法を説明しました。また、OCI Functionsを使用することで、カスタム変換をデータフローに統合し、データ変換、データエンリッチメント、その他多くのユースケースを実行することができることを確認しました。このブログが、Oracle Cloud Infrastructure Data Integrationの詳細を知る上で役立つことを願っています。詳細については、チュートリアルドキュメントをご覧ください。OCI Data Integrationに関するすべてのブログを忘れずにチェックしてください。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

新しいOracle Container Engine for Kubernetesの機能強化により、大規模なKubernetesがさらに簡単になりました (2023/03/20)