🐙

不適切な言葉をシステムに登録させないように頑張ってみた話②

2022/07/08に公開

こんにちは。地図パズル製作所管理人の都島です。

今回の記事は少し前に反響をいただいた、不適切な言葉をシステムに登録させない方法を考えてみる、第二弾です!今回は日本語で Content Moderator を使う方法について考えていきます。

第一弾を読んでいない方は、読んでみてください~

https://zenn.dev/chizu_puzzle/articles/7e0ff671ee91e7

それと、地図パズル製作所の地図パズルで遊んだことのない方はぜひ遊んでみてください!

https://chizu-puzzle.com

Content Moderator は英語以外でも使える?

不適切な言葉をシステムに登録させないようにするのに、Azure の Content Moderator というシステムを使っています。でも、第一弾で書いたように、categoryN.score の値でフィルタリングする方法は日本語では使えないようです。ちなみにこの機能は「コンピューター支援による分類応答」というプレビュー機能で、英語だけが対応しているようです。以下のページに書かれていました。

https://docs.microsoft.com/ja-jp/azure/cognitive-services/content-moderator/language-support

そして、同じページを見てみると、不適切な表現の検出については、日本語を含めとてもたくさんの言語が対応していることが分かります。ちなみに、不適切な表現の検出というのは、Content Moderator では NG ワードを認識して返してくれるものです。例えば、「馬鹿」という言葉が登録されているので、「馬鹿」という言葉が含まれた言葉を送ると、認識して送り返してくれます。

不適切な表現の検出はどうやる?

categoryN.score の値でフィルタリングと合わせて、こんな感じのソースコードで動きました。

export const checkHandle = async (
  db: Firestore,
  transaction: Transaction,
  uid: string,
  handle: string,
  key: string | undefined
): Promise<UserProfileStatusEnum> => {
  if (key == null) {
    functions.logger.error("Cognitive service key is not setted.");
    return UserProfileStatusEnum.Error;
  }

  if (handle.length <= 0) {
    functions.logger.error("New handle name is empty.");
    return UserProfileStatusEnum.Error;
  }

  if (handle.length >= 16) {
    functions.logger.error("New handle is too long.");
    return UserProfileStatusEnum.Error;
  }

  try {
    const credentials = new CognitiveServicesCredentials(key);
    const client = new ContentModeratorClient(
      credentials,
      "https://chizu-puzzle.cognitiveservices.azure.com/"
    );

    // Azure Content Moderator でのチェック
    const response = await client.textModeration.screenText(
      "text/plain",
      handle,
      {
        classify: true,
      }
    );

    functions.logger.debug(response);

    if (response.classification != null) {
      if (
        response.classification.category1 != null &&
        response.classification.category1.score != null &&
        response.classification.category1.score >= 0.3
      ) {
        return UserProfileStatusEnum.Fail;
      }
      if (
        response.classification.category2 != null &&
        response.classification.category2.score != null &&
        response.classification.category2.score >= 0.3
      ) {
        return UserProfileStatusEnum.Fail;
      }
      if (
        response.classification.category3 != null &&
        response.classification.category3.score != null &&
        response.classification.category3.score >= 0.3
      ) {
        return UserProfileStatusEnum.Fail;
      }
    }
    if (response.terms != null) {
      return UserProfileStatusEnum.Fail;
    }
  } catch (e) {
    functions.logger.debug(e);
    return UserProfileStatusEnum.Error;
  }

  return UserProfileStatusEnum.Success;
};

response.terms が設定されている場合は、不適切な用語が含まれている場合なので、NG としています。

Content Moderator にカスタム用語を登録する

Content Moderator では、デフォルトでは NG 判定されないけれども、NG 判定してほしい用語を登録することができます。下の URL からご覧ください。

https://docs.microsoft.com/ja-jp/azure/cognitive-services/content-moderator/try-terms-list-api

うまく抜け道を見つけて不適切な用語を登録してくる人もいるかもしれないので、そういう時に使ってみたいと思います。

最後に

今日は Content Moderator の使い方、第二弾を紹介しました。これからも地図パズル製作所をよろしくお願いします!

ツイッターもよろしくお願いします!

https://twitter.com/chizu_puzzle

アメブロもやってます!

https://ameblo.jp/chizu-puzzle

Discussion