LoginSignup
4

More than 1 year has passed since last update.

posted at

updated at

Organization

GCP Natural Languageでブログのカテゴリを自動で付けてみた

GCP Natural Language

GCP Cloud Natural Language APIの「コンテンツの分類(Classifying Text)API」を使うと、テキストを「Arts & Entertainment」や「Computers & Electronics」といったカテゴリに自動で分類できます。GCPの構築済モデルを使うので、特に機械学習の準備は必要ありません。

このコンテンツ分類機能は日本語には対応していませんが、同じくGCPのCloud Translationを使って日本語を英語に変換してからであれば使うことができます。機械翻訳を介しても実際に実用に足る精度が出るのかどうか、自分のブログの記事を実際に分類することで試してみました。

環境

  • Python 3.9.5
  • google-cloud-language v2.0.0

本稿に掲載している実行結果は2021/06/12時点のものです。

なお実際には、下記記事のようにDocker+Poetryで環境構築して実行しています。

Google Colabを使えばPython環境を構築する事なく実行できますが、デフォルトで入っているgoogle-cloud-languagegoogle-cloud-translateライブラリのバージョンが古くてうまく行かないので、アップグレードする必要があります。

!pip install --upgrade google-cloud-language google-cloud-translate

ソースコード

翻訳部分

from google.cloud import translate_v2

def translate_text(text: str) -> str:
    client = translate_v2.Client()
    result = client.translate(text, target_language="en") # type: ignore
    return result['translatedText'] # type: ignore

カテゴリ分類部分

from google.cloud import language_v1

def sample_classify_text(text: str):
    client = language_v1.LanguageServiceClient()
    document = language_v1.Document(
        content=text, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    response = client.classify_text({'document': document}) # type: ignore
    return response

カテゴリ分類結果

25の大カテゴリ・620の小カテゴリに分類されます。具体的にどんなカテゴリがあるのかは公式ドキュメントに記載があります。

これを実際に自分がブログで書いた記事に適用してみて、最もConfidenceが高かったカテゴリの一覧が下記です。

記事 category confidence
Fastlyが落ちた時アマゾンはDNSフェイルオーバーしてた(かもしれない) /Internet & Telecom/Web Services 0.9700000286
Ruby on RailsでHeadless CMSを作った /Computers & Electronics/Programming 0.9700000286
七つの大罪とアルストとマスターオブマスターの対応表 /Games/Roleplaying Games 0.9399999976
ポケモン25周年動画の元ネタを全部調べた /Games/Computer & Video Games 0.8600000143
ブログをAWS AppRunnerに移行したかった /Internet & Telecom/Web Services 0.8299999833
Microsoft Ignite 2021でPokémon GO on HoloLens技術デモ映像が披露 /Games/Computer & Video Games 0.8299999833
Microsoft Build 2021基調講演を聴講 /News 0.7799999714
JavaScriptで自動音楽生成してみた /Computers & Electronics/Software/Multimedia Software 0.7400000095
ブログ作ってみた /Online Communities/Blogging Resources & Services 0.7099999785
ファイナンシャルプランナー(FP)の勉強をして良かったこと /Finance/Accounting & Auditing/Tax Preparation & Planning 0.6700000167
VS Code 1.53はCentOS7で動かない /Computers & Electronics/Software 0.6600000262
Zenn書いてみた /Science/Computer Science 0.6299999952
Ghost of Tsushimaがおもしろい /Games/Computer & Video Games 0.5500000119

私のブログはIT系の話とゲームの話がほとんどなのですが、たとえば

  • 「Microsoft Build 2021」というイベントを見たその日に書いた記事を "News" と分類している
  • Xenoblade 2」と「KINGDOM HEARTS」というロールプレイングゲームを取り上げた記事を "Roleplaying Games" と分類できている

以上より、分類の精度は結構高いように感じます。

特に、「Microsoft Ignite 2021」という技術系イベントで「Pokémon GO on HoloLens」というゲームネタを取り扱った「Microsoft Ignite 2021でPokémon GO on HoloLens技術デモ映像が披露」という記事があるのですが、この分類結果は以下のようになっていました。

Category Confidence
/Games/Computer & Video Games 0.8299999833106995
/Science/Engineering & Technology 0.6499999761581421
/Computers & Electronics 0.5699999928474426
/Arts & Entertainment 0.5400000214576721

ゲーム系と技術系の両方のカテゴリをバランス良く予測結果として返しているのが分かります。

一方で「/Computers & Electronics/Programming」と「/Computers & Electronics/Software」のように、小カテゴリの細かい分類の違いがよくわからないものが多いです。実際に私のブログのカテゴリとしてはそこまで細かい分類は不要なので、いくつかをまとめて「Technology」や「VideoGame」といった独自のカテゴリにマッピングしたものを表示しています。

まとめ

GCP Cloud Natural Languageを使うことで、ブログのカテゴリを自動的に分類できました。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4