🙅

【Natural Language API】テキストから「有害なカテゴリ」を検出する。

2024/10/20に公開

今回は「Cloud Natural Language API」のmoderateTextメソッドを使って、テキストのフィルタを作ります。

【関連】
【OpenAI】ModerationAPIでテキストから「有害なカテゴリ」を検出する。
【Azure】Content Safetyでテキストから「有害なカテゴリ」を検出する。

Natural Language API「moderateText メソッド」とは

「入力テキスト」から、各カテゴリごと「信頼度」と「重大度(深刻度)」 を算出してくれます。

  • 信頼度 confidence → どのくらい関連性があるか(範囲: 0~1)
  • 重大度 severity → どのくらい深刻な内容か(範囲: ??? 不明でした...)
検出カテゴリ
APIカテゴリ 日本語 説明
Toxic 有害 粗暴、無礼、または理不尽なコンテンツ。
Derogatory 中傷 ID や保護されている属性をターゲットとする否定的なコメントや有害なコメント。
Violent 暴力的 個人やグループに対する暴力を描写したシナリオ、または残虐行為の一般的な説明についての記述。
Sexual 性的 性行為やわいせつな内容に関する情報が含まれるコンテンツ。
Insult Insult 個人またはグループに対する不快、挑発的、または否定的なコメント。
Profanity 冒とく 呪いなどの非常識または乱暴な言葉。
Death, Harm & Tragedy 死、害、悲劇 人の死、悲劇、事故、災害、自傷行為。
Firearms & Weapons 銃、武器 ナイフ、銃、個人用武器、および弾薬、ホルスターなどのアクセサリーについて言及するコンテンツ。
Public Safety 公共の安全 安心感を与え、公共の安全を維持するサービスや組織。
Health 健康 人間の健康(健康状態、病気、障害を含む)、医学的治療、投薬、ワクチン、医療慣行、回復のためのリソース(サポート グループを含む)。
Religion & Belief 宗教、信仰 超自然的な法則や存在の可能性を扱う信条システム。宗教、信条、信仰、精神修行、教会、宗教施設。占星術や神秘学を含む。
Illicit Drugs 違法ドラッグ 危険ドラッグと違法な薬物。麻薬道具、麻薬栽培、麻薬吸引関係の道具などを扱っている店など。一般的に娯楽として使用される薬物(例:マリファナ)の薬事使用を含む。
War & Conflict 戦争、紛争 戦争、軍事衝突、多数の人が関与する大規模な物理的衝突。戦争や紛争と直接関係ない場合でも、軍務に関する議論を含む。
Finance ファイナンス 消費者および企業向け金融サービス(銀行、ローン、クレジット、投資、保険など)。
Politics 政治 政治関連のニュースとメディア。地域や国の公共政策に関する議論。
Legal リーガル 法律に関連するコンテンツ(法律事務所、法的情報、主要な法的資料、パラリーガル サービス、法律関連出版物とテクノロジー、鑑定人、訴訟コンサルタント、その他の法的サービス プロバイダなど)。

(参考:テキストを管理する  |  Cloud Natural Language API  |  Google Cloud

実装の手順

0)準備するもの

  • GCPのアカウント(課金の有効化)
  • GCPのAPIキー

1)GCPで「Natural Language API」を有効化する

今回使用する「Natural Language API」を有効化します。

2)ライブラリをインストールする

$ npm install @google-cloud/language

3)テキスト検出する関数を作る

import { LanguageServiceClient } from "@google-cloud/language/build/src/v2";

export async function filterText(text: string) {
    // --- クライアント作成 ---
    const client = new LanguageServiceClient({
        apiKey: process.env.GOOGLE_CLOUD_API_KEY || ""
    });
    // --- リクエスト ---
    const request = {
        document: {
            type: 'PLAIN_TEXT' as const,
            languageCode: 'ja'
            content: text,
        },
        modelVersion: "MODEL_VERSION_2" as const // MODEL_VERSION_1 or MODEL_VERSION_2 or MODEL_VERSION_UNSPECIFIED
    };
    const response = await client.moderateText(request);
    return response
}

4)関数を呼び出す

export function Main() {
    // ...

    const text = "こんにちは!";
    const res = await GcpFilter(text);
    console.log("--- res ---");
    console.log(res);

    // ...
}
出力データ例
// --- res ---
// {
//     "moderationCategories": [
//         {
//             "name": "Toxic",
//             "confidence": 0.6740990877151489,
//             "severity": 0
//         },
//         {
//             "name": "Insult",
//             "confidence": 0.1967933475971222,
//             "severity": 0
//         },
//         {
//             "name": "Profanity",
//             "confidence": 0.7462224364280701,
//             "severity": 0
//         },
//         {
//             "name": "Derogatory",
//             "confidence": 0.13765175640583038,
//             "severity": 0
//         },
//         {
//             "name": "Sexual",
//             "confidence": 0.7263020873069763,
//             "severity": 0
//         },
//         {
//             "name": "Death, Harm & Tragedy",
//             "confidence": 0.08539944887161255,
//             "severity": 0
//         },
//         {
//             "name": "Violent",
//             "confidence": 0.1867469847202301,
//             "severity": 0
//         },
//         {
//             "name": "Firearms & Weapons",
//             "confidence": 0.07692307978868484,
//             "severity": 0
//         },
//         {
//             "name": "Public Safety",
//             "confidence": 0.06372549384832382,
//             "severity": 0
//         },
//         {
//             "name": "Health",
//             "confidence": 0.347457617521286,
//             "severity": 0
//         },
//         {
//             "name": "Religion & Belief",
//             "confidence": 0.10110294073820114,
//             "severity": 0
//         },
//         {
//             "name": "Illicit Drugs",
//             "confidence": 0.05737704783678055,
//             "severity": 0
//         },
//         {
//             "name": "War & Conflict",
//             "confidence": 0.12195122241973877,
//             "severity": 0
//         },
//         {
//             "name": "Politics",
//             "confidence": 0.03090507723391056,
//             "severity": 0
//         },
//         {
//             "name": "Finance",
//             "confidence": 0.2142857164144516,
//             "severity": 0
//         },
//         {
//             "name": "Legal",
//             "confidence": 0.10094637423753738,
//             "severity": 0
//         }
//     ],
//     "languageCode": "ja",
//     "languageSupported": true
// }

まとめ

カテゴリごとの検出結果(現状は「信頼度」)と、決めておいた基準を超えているかどうかを判断して、使用可能なテキストかどうかを判定する処理ができます。

参考

https://github.com/googleapis/google-cloud-node/blob/main/packages/google-cloud-language/samples/generated/v1beta2/language_service.moderate_text.js

Discussion