API Documentation

文脈解析パイプライン

パターンマッチや辞書マッチングだけでは検出しきれない、周辺テキストの文脈に依存する情報を 高度なNLP技術で多段階解析し、機密カテゴリまで自動分類する認識器です。

たとえば金額表現や口座番号は、それ単体ではどの種類の機密情報かを判断できませんが、 文脈解析パイプラインは周辺のキーワードを解析して分類します。

比較
従来のパターンマッチ:
  "500万円" → 金額(分類なし)

文脈解析パイプライン:
  "年収は500万円"     → JPII_PERSONAL_INCOME(個人収入)
  "売上高500万円"     → JPII_CORPORATE_EARNINGS(企業収益)
  "M&A金額500万円"   → JPII_STRAT_MA(M&A情報)
  "口座番号1234567"   → JPII_ACCOUNT_IDENTIFIER(口座識別子)
  "sk-proj-abcd..."   → JPII_CRED_API_KEY(APIキー)
  "評価グレードS"     → JPII_HR_REVIEW(人事評価)
  "HbA1c 7.2%"       → JPII_MED_TEST(検査結果)
💡 ポイント

同じ「500万円」でも、周辺の文脈によって個人収入・企業収益・M&A情報を正確に分類します。

特徴

高速かつ高精度

独自に最適化されたNLPパイプラインにより、処理速度を犠牲にすることなく、 文脈に基づいた精密な分類を実現。数千キーワード規模の辞書でも数ミリ秒オーダーの検索性能を維持 ※

📈
機密度に基づくスコアリング

4段階の機密度レベル(LOW/MEDIUM/HIGH/CRITICAL)に基づいて信頼度スコアを算出。 「極秘」「社外秘」等の修飾語で自動的にスコアをブースト。

🛠
設定ベースの柔軟性

検出パターン・キーワード辞書・スコアリングルールはすべてJSON設定で管理。 コード変更なしに検出ロジックをカスタマイズ可能。

🔌
パイプライン単位でオンオフ可能

ポリシー設定でパイプラインごとに有効/無効を切り替え可能。 必要なドメインのみを有効化することで、処理効率と検出精度を最適化。

標準搭載の7パイプライン

パイプライン 検出対象 カテゴリ数 検出例
金融PII 個人収入・資産・負債、企業収益・戦略情報、口座番号など 12 年収500万円→個人収入、売上高10億円→企業収益
認証情報・シークレット APIキー、アクセストークン、秘密鍵、DB接続情報、クラウド認証情報 6 AWSアクセスキー、Bearer Token、PEM秘密鍵
人事労務 人事評価、懲戒処分、勤怠記録、休職・傷病情報、人事異動 6 評価グレードS、懲戒処分通知、休職届
医療健康 診断、検査結果、処方、保険情報、病歴 6 血圧150/90mmHg、HbA1c 7.2%、ICD-10コード
経営戦略 M&A、業績予想、取締役会決議、事業計画、インサイダー情報 6 買収金額、決算予想、中期経営計画
法務・契約 契約条項、NDA、知的財産、訴訟、損害賠償・違約金 6 契約番号、秘密保持義務、和解条件
社内識別子 プロジェクトID、社員番号、顧客番号、社内URL、文書参照番号 6 チケット番号、従業員ID、イントラネットURL

※ 処理速度はエンジン内部の検索処理単体の参考値です。実際のパフォーマンスは入力テキストの長さやパイプラインの構成により変動します。


ドメイン特化型パイプラインの構築

標準搭載の7パイプラインに加え、お客様の業務ドメインに特化したパイプラインを追加構築できます。

ドメイン 検出対象の例
製造業 製造原価、配合比率、取引先単価、営業秘密
保険 保険金額、給付条件、事故報告、査定情報
不動産 物件情報、取引価格、顧客属性
教育 成績情報、学生個人情報、奨学金情報

シンプルな構築はお客様自身で

パイプラインの作成・追加・更新・削除はすべてAPI経由で行えるため、 シンプルなルール定義であればお客様ご自身で手軽に構築・運用いただけます。

高度な構築は認識器学習構築サービスで

業界によっては数千オーダーのキーワードや周辺文脈を考慮した高度なルール設計が求められるケースがあります。 このような本格的なドメイン特化型認識器の構築には、当社独自のトレーニングアルゴリズムをご活用いただくことで、 高精度と高速処理のバランスに優れたエンジンを短期間で構築できます。

🛠 認識器学習構築サービス

精度の追い込みやドメイン固有のチューニングをご希望の場合は、 当社の認識器学習構築サービス(有償)をご利用ください。 詳しくはお問い合わせフォームからご連絡ください。


基本的な使い方

パイプラインの作成

bash
# ETag取得
ETAG=$(curl -s -I https://api.pii-fi.com/api/policy/active \
  -H "Authorization: Bearer YOUR_API_KEY" | grep -i etag | awk '{print $2}' | tr -d '\r')

# 金融情報分類パイプラインを作成
curl -X POST https://api.pii-fi.com/api/policy/pipelines \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "If-Match: $ETAG" \
  -d '{
    "id": "pipeline.financial",
    "name": "金融情報分類パイプライン",
    "description": "金額の文脈を解析し、機密カテゴリを自動分類",
    "categories": [
      {
        "id": "PERSONAL_INCOME",
        "label": "個人収入",
        "context_keywords": ["年収", "月収", "給与", "給料", "手取り", "所得"],
        "entity_type": "JPII_PERSONAL_INCOME"
      },
      {
        "id": "CORPORATE_EARNINGS",
        "label": "企業収益",
        "context_keywords": ["売上", "売上高", "収益", "利益", "営業利益", "経常利益"],
        "entity_type": "JPII_CORPORATE_EARNINGS"
      },
      {
        "id": "STRAT_MA",
        "label": "M&A情報",
        "context_keywords": ["M&A", "買収", "合併", "出資", "投資額", "資金調達"],
        "entity_type": "JPII_STRAT_MA"
      }
    ],
    "priority": 85
  }'

文脈分類の動作確認

bash
# 同じ「500万円」が文脈によって異なるカテゴリに分類される
curl -X POST https://api.pii-fi.com/api/detect \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "text": "田中氏の年収は500万円です。A社の売上高は500万円でした。B社のM&A金額は500万円と報道されています。",
    "deidentification_type": "replace"
  }'

レスポンス例

json
{
  "deidentified_text": "<人名>の<個人収入>です。A社の<企業収益>でした。B社の<M&A情報>と報道されています。",
  "entities": [
    {
      "entity_type": "JPII_PERSON_NAME",
      "original_text": "田中氏",
      "masked_text": "<人名>",
      "confidence_score": 0.95
    },
    {
      "entity_type": "JPII_PERSONAL_INCOME",
      "original_text": "年収は500万円",
      "masked_text": "<個人収入>",
      "confidence_score": 0.92,
      "context_classification": {
        "pipeline_id": "pipeline.financial",
        "category": "PERSONAL_INCOME",
        "category_label": "個人収入",
        "context_keywords_matched": ["年収"]
      }
    },
    {
      "entity_type": "JPII_CORPORATE_EARNINGS",
      "original_text": "売上高は500万円",
      "masked_text": "<企業収益>",
      "confidence_score": 0.91,
      "context_classification": {
        "pipeline_id": "pipeline.financial",
        "category": "CORPORATE_EARNINGS",
        "category_label": "企業収益",
        "context_keywords_matched": ["売上高"]
      }
    },
    {
      "entity_type": "JPII_STRAT_MA",
      "original_text": "M&A金額は500万円",
      "masked_text": "<M&A情報>",
      "confidence_score": 0.89,
      "context_classification": {
        "pipeline_id": "pipeline.financial",
        "category": "STRAT_MA",
        "category_label": "M&A情報",
        "context_keywords_matched": ["M&A"]
      }
    }
  ]
}

Pythonでの使用例

python
import requests

class ContextualPipelineManager:
    # base_url: デモ環境(本番環境では専用エンドポイントを提供)
    def __init__(self, api_key, base_url="https://api.pii-fi.com/api"):
        self.api_key = api_key
        self.base_url = base_url
        self.headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {api_key}"
        }

    def _get_etag(self):
        """アクティブポリシーからETagを取得"""
        response = requests.get(
            f"{self.base_url}/policy/active",
            headers=self.headers
        )
        response.raise_for_status()
        return response.headers.get("ETag")

    def create_pipeline(self, config):
        """パイプラインを作成(ETag必須)"""
        etag = self._get_etag()
        headers = {**self.headers, "If-Match": etag}
        response = requests.post(
            f"{self.base_url}/policy/pipelines",
            headers=headers,
            json=config
        )
        response.raise_for_status()
        return response.json()

    def detect(self, text, deidentification_type="replace"):
        """テキストを検出(文脈分類情報付き)"""
        response = requests.post(
            f"{self.base_url}/detect",
            headers=self.headers,
            json={
                "text": text,
                "deidentification_type": deidentification_type
            }
        )
        response.raise_for_status()
        return response.json()


# === 使用例 ===
manager = ContextualPipelineManager("YOUR_API_KEY")

# 金融情報分類パイプラインを作成
manager.create_pipeline({
    "id": "pipeline.financial",
    "name": "金融情報分類パイプライン",
    "categories": [
        {
            "id": "PERSONAL_INCOME",
            "label": "個人収入",
            "context_keywords": ["年収", "月収", "給与", "給料", "手取り"],
            "entity_type": "JPII_PERSONAL_INCOME"
        },
        {
            "id": "CORPORATE_EARNINGS",
            "label": "企業収益",
            "context_keywords": ["売上", "売上高", "収益", "利益"],
            "entity_type": "JPII_CORPORATE_EARNINGS"
        },
        {
            "id": "STRAT_MA",
            "label": "M&A情報",
            "context_keywords": ["M&A", "買収", "合併", "出資"],
            "entity_type": "JPII_STRAT_MA"
        }
    ]
})

# 文脈分類の動作確認
result = manager.detect(
    "田中氏の年収は500万円です。A社の売上高は500万円でした。"
)
print(result["deidentified_text"])
# → "<人名>の<個人収入>です。A社の<企業収益>でした。"

# 各エンティティの分類詳細を確認
for entity in result.get("entities", []):
    ctx = entity.get("context_classification")
    if ctx:
        print(f"  {entity['original_text']} → {ctx['category_label']}"
              f" (キーワード: {ctx['context_keywords_matched']})")

# ※ 大量の自社ドキュメントからの学習による高精度なパイプライン構築は
#   「認識器学習構築サービス」(有償)にて承ります。
#   詳しくは /docs/training-service をご参照ください。

設定パラメータ

パラメータ 必須 説明
id Required パイプラインID(例: pipeline.financial
name Required パイプライン名
categories Required 分類カテゴリのリスト
description Optional 説明
context_rules Optional 文脈ルール(キーワードベースの分類ルール)
priority Optional 優先度(default: 85)

カテゴリの定義

json
{
  "id": "PERSONAL_INCOME",
  "label": "個人収入",
  "context_keywords": ["年収", "月収", "給与", "給料", "手取り", "所得"],
  "entity_type": "JPII_PERSONAL_INCOME"
}

API Reference

文脈解析パイプラインの詳細なAPI仕様は以下を参照してください。