特許分類を日本語に置き換えてみる

# はじめに
前回Fタームを使った特許マップを作成しましたが、軸項目がFタームのままであり、理解しにくいマップとなっておりました。

そこで今回は、Fタームを日本語に置き換えることにチャレンジしたいと思います。ここでは、Fターム-日本語の辞書を作り、Fタームを日本語に置き換えるプログラムを作成します。
# プログラム
### 前処理
前回同様、吸収性物品の特許データを使用します。このコード部分は、前回使用したコードと同一ですので、説明は割愛いたします。
```python
! pip install japanize-matplotlib
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import japanize_matplotlib
# googleドライブの利用
from google.colab import drive
drive.mount('/content/drive')
# データの前処理
# データの読み込み(google ドライブから)
df_fterm = pd.read_csv("/content/drive/MyDrive/吸収性物品_2553.csv",encoding = "shift-jis" )
#必要な列のみ抽出
df_fterm = df_fterm[['Ｆターム(最新)']]
# 欠落データを削除
df_fterm = df_fterm.dropna()
# Fターム列をコピーして追加
df_fterm['課題'] = df_fterm['Ｆターム(最新)']
df_fterm['解決手段']= df_fterm['Ｆターム(最新)']
# ;で課題を分割
df_fterm['課題'] = df_fterm['課題'].str.split(';')
# ;で解決手段を分割
df_fterm['解決手段'] = df_fterm['解決手段'].str.split(';')
# 課題と解決手段をエクスプロード
df_fterm = df_fterm.explode('課題').explode('解決手段')
# 「'課題'」と「'解決手段'」の列でグループ化し、グループ内の要素数を数える
result = df_fterm.groupby(['課題', '解決手段']).size().reset_index(name='Counts')
# 課題と解決手段に限定
result = result.query('課題 in ["3B200 BA01","3B200 BA02","3B200 BA03","3B200 BA04","3B200 BA05","3B200 BA06","3B200 BA07","3B200 BA08","3B200 BA09","3B200 BA10","3B200 BA11","3B200 BA12","3B200 BA13","3B200 BA14","3B200 BA15","3B200 BA16","3B200 BA17","3B200 BA18","3B200 BA19","3B200 BA20"] and 解決手段 in ["3B200 BB01","3B200 BB02","3B200 BB03","3B200 BB04","3B200 BB05","3B200 BB06","3B200 BB08","3B200 BB09","3B200 BB10","3B200 BB11","3B200 BB13","3B200 BB14","3B200 BB16","3B200 BB17","3B200 BB18","3B200 BB20","3B200 BB21","3B200 BB22","3B200 BB23","3B200 BB24","3B200 BB25","3B200 BB26","3B200 BB27","3B200 BB30"]')
```
### 辞書作成
作成した辞書は以下となります。Fタームに対応する日本語をFタームリストから抽出して辞書化しました。この作業は人間がFタームリストを読んで地道に行う作業となります。

この作業は面倒に見えますが、今回はChatGPTにデータ加工の協力をお願いしましたので、労力はたいしたことはありませんでした。
```python
# map置き換え用の辞書作成
replace_dict_1 = {
    '3B200 BA01': '吸水性',
    '3B200 BA02': '親水性',
    '3B200 BA03': '透水性',
    '3B200 BA04': '拡散性',
    '3B200 BA05': '撥水性',
    '3B200 BA06': '逆流防止',
    '3B200 BA07': '通気性',
    '3B200 BA08': '風合',
    '3B200 BA09': '嵩高',
    '3B200 BA10': '膨張性',
    '3B200 BA11': '伸張性',
    '3B200 BA12': '伸縮性',
    '3B200 BA13': '剛性',
    '3B200 BA14': '密度',
    '3B200 BA15': '光透過性',
    '3B200 BA16': '接着性',
    '3B200 BA17': '分解性',
    '3B200 BA18': '水分解性',
    '3B200 BA19': '保温性',
    '3B200 BA20': 'その他'
}
replace_dict_2 = {
    '3B200 BB01': '繊維材料',
    '3B200 BB02': '紙',
    '3B200 BB03': '不織布',
    '3B200 BB04': '合成繊維',
    '3B200 BB05': 'パルプ',
    '3B200 BB06': '織編物',
    '3B200 BB08': '合成樹脂',
    '3B200 BB09': 'シート状',
    '3B200 BB10': 'スポンジ状',
    '3B200 BB11': '弾性材料',
    '3B200 BB13': '表面処理',
    '3B200 BB14': '化学的処理',
    '3B200 BB16': '高吸収性材料',
    '3B200 BB17': 'ポリマー',
    '3B200 BB18': '処理変性',
    '3B200 BB20': '接着剤',
    '3B200 BB21': '薬剤',
    '3B200 BB22': '脱臭剤',
    '3B200 BB23': '活性炭',
    '3B200 BB24': '抗菌剤',
    '3B200 BB25': '香料',
    '3B200 BB26': '潤滑剤',
    '3B200 BB27': '凝血剤',
    '3B200 BB30': 'その他'
}
```
### マップメソッドの使用
マップメソッドを使用して、Fタームを辞書の日本語に置き換えます。
```python
# mapメソッドを使用して分類を日本語に置き換える
result.loc[:, '課題'] = result['課題'].map(replace_dict_1)
result.loc[:, '解決手段'] = result['解決手段'].map(replace_dict_2)
# 結果を出力して確認
print(result)
```
マップメソッドを使用した結果は以下となりました。課題と解決手段は日本語に置き換えられ、バブルチャートにできる形式となりました。
```
        課題  解決手段  Counts
28369  吸水性  繊維材料      12
28370  吸水性     紙       6
28371  吸水性   不織布     165
28372  吸水性  合成繊維      62
28373  吸水性   パルプ     129
...    ...   ...     ...
37151  その他   脱臭剤       1
37152  その他   抗菌剤       4
37153  その他    香料       1
37154  その他   潤滑剤       1
37155  その他   その他       9

[344 rows x 3 columns]
```
### バブルチャート作成
今回もバブルチャートを作成します。コードは前回と同じです。
```python
# 「'出願人'」と「'分類'」の列からなる値をリスト形式に変換
y = result['課題'].tolist()
x = result['解決手段'].tolist()
# 「Counts」列からなる値を元に、散布図のすべての点の大きさを示すリストを作成
sizes = [size * 2 for size in result['Counts'].tolist()]
# 「Counts」列からなる値を元に、散布図のすべての点のカウント数を示すリストを作成
nums = [num for num in result['Counts'].tolist()]
# 「出願人」列からなる値を元に、カテゴリーのリストを作成
categories = list(set(y))
# 色マップを作成
colors = cm.rainbow(np.linspace(0, 1, len(categories)))
colors = {categories[i]: colors[i] for i in range(len(categories))}
colors = [colors[item] for item in y]
# 散布図を作成
fig, ax = plt.subplots(figsize=[10,10])
ax.scatter(x, y, s=sizes, c=colors)
# 散布図にカウント数を表示
for i, txt in enumerate(nums):
    ax.annotate(txt, (x[i], y[i]), textcoords="offset points", xytext=(0,0), ha='left', va='bottom')
# x 軸のラベルを設定する。
ax.set_xlabel("解決手段")
# y 軸のラベルを設定する。
ax.set_ylabel("課題")
# タイトルを設定する。
ax.set_title("課題-解決手段マップ")
# X軸項目を60°傾ける
plt.xticks(rotation=60)
# 図を表示
plt.show()
```
### バブルチャート
完成したバブルチャートは以下となります。縦軸、横軸とも日本語に置き換えられ、前回よりわかりやすい特許マップとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3110569/8d5bb410-0c7a-5b3b-7119-afcc3688583d.png)
# 感想
日本語への置き換えは辞書作りが面倒な作業となりますが、ChatGPTの登場により辞書作りも楽になりました。これからは、辞書をこまめに作ってわかりやすい特許マップを作ってゆきたいと思います。