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

## GCP Natural Language
[GCP Cloud Natural Language APIの「コンテンツの分類（Classifying Text）API」](https://cloud.google.com/natural-language/docs/classifying-text?hl=ja)を使うと、テキストを「Arts & Entertainment」や「Computers & Electronics」といったカテゴリに自動で分類できます。GCPの構築済モデルを使うので、特に機械学習の準備は必要ありません。

このコンテンツ分類機能は日本語には対応していませんが、同じくGCPの[Cloud Translation](https://cloud.google.com/translate?hl=ja)を使って日本語を英語に変換してからであれば使うことができます。機械翻訳を介しても実際に実用に足る精度が出るのかどうか、[自分のブログ](https://blog.s2terminal.com)の記事を実際に分類することで試してみました。

### 環境
- Python 3.9.5
- google-cloud-language v2.0.0

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

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

https://qiita.com/suzuki_sh/items/6bc15446965df20b6c5a

[Google Colab](https://colab.research.google.com/notebooks/intro.ipynb?hl=ja#recent=true)を使えばPython環境を構築する事なく実行できますが、デフォルトで入っている`google-cloud-language`と`google-cloud-translate`ライブラリのバージョンが古くてうまく行かないので、アップグレードする必要があります。

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

### ソースコード
翻訳部分

```python
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
```

カテゴリ分類部分

```python
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の小カテゴリに分類されます。具体的にどんなカテゴリがあるのかは公式ドキュメントに記載があります。

https://cloud.google.com/natural-language/docs/categories?hl=ja

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

記事|category|confidence
--|--|--
[Fastlyが落ちた時アマゾンはDNSフェイルオーバーしてた（かもしれない）](https://blog.s2terminal.com/if-fastly-down-amazon-failover)|/Internet & Telecom/Web Services|0.9700000286
[Ruby on RailsでHeadless CMSを作った](https://blog.s2terminal.com/rails-headless-cms)|/Computers & Electronics/Programming|0.9700000286
[七つの大罪とアルストとマスターオブマスターの対応表](https://blog.s2terminal.com/seven-cardinal-sins-and-alrest-or-master-of-master)|/Games/Roleplaying Games|0.9399999976
[ポケモン25周年動画の元ネタを全部調べた](https://blog.s2terminal.com/pokemon25-movie)|/Games/Computer & Video Games|0.8600000143
[ブログをAWS AppRunnerに移行したかった](https://blog.s2terminal.com/aws-app-runner-failed)|/Internet & Telecom/Web Services|0.8299999833
[Microsoft Ignite 2021でPokémon GO on HoloLens技術デモ映像が披露](https://blog.s2terminal.com/pokemon-go-on-hololens)|/Games/Computer & Video Games|0.8299999833
[Microsoft Build 2021基調講演を聴講](https://blog.s2terminal.com/microsoft-build-2021-keynote)|/News|0.7799999714
[JavaScriptで自動音楽生成してみた](https://blog.s2terminal.com/auto-music-js)|/Computers & Electronics/Software/Multimedia Software|0.7400000095
[ブログ作ってみた](https://blog.s2terminal.com/made-blog)|/Online Communities/Blogging Resources & Services|0.7099999785
[ファイナンシャルプランナー（FP）の勉強をして良かったこと](https://blog.s2terminal.com/financial-planner-exam-merits)|/Finance/Accounting & Auditing/Tax Preparation & Planning|0.6700000167
[VS Code 1.53はCentOS7で動かない](https://blog.s2terminal.com/vscode-1-53-not-working-centos-7)|/Computers & Electronics/Software|0.6600000262
[Zenn書いてみた](https://blog.s2terminal.com/zenn-yattemita)|/Science/Computer Science|0.6299999952
[Ghost of Tsushimaがおもしろい](https://blog.s2terminal.com/ghost-of-tsushima-team-members)|/Games/Computer & Video Games|0.5500000119

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

- 「Microsoft Build 2021」というイベントを見たその日に書いた記事を **"News"** と分類している
- 「[Xenoblade 2](https://www.nintendo.co.jp/switch/adena/index.html)」と「[KINGDOM HEARTS](https://www.jp.square-enix.com/kingdom/timeline/xbc.html)」というロールプレイングゲームを取り上げた記事を **"Roleplaying Games"** と分類できている

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

特に、「Microsoft Ignite 2021」という技術系イベントで「Pokémon GO on HoloLens」というゲームネタを取り扱った「[Microsoft Ignite 2021でPokémon GO on HoloLens技術デモ映像が披露](https://blog.s2terminal.com/pokemon-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を使うことで、ブログのカテゴリを自動的に分類できました。

https://cloud.google.com/natural-language/docs/classifying-text?hl=ja

## 参考
- https://cloud.google.com/translate/docs/basic/quickstart?hl=ja