(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024137709
(43)【公開日】2024-10-07
(54)【発明の名称】分類処理プログラム、システム及び方法
(51)【国際特許分類】
G06F 16/35 20190101AFI20240927BHJP
G06F 40/216 20200101ALI20240927BHJP
G06F 40/279 20200101ALI20240927BHJP
【FI】
G06F16/35
G06F40/216
G06F40/279
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2024007107
(22)【出願日】2024-01-20
(31)【優先権主張番号】P 2023044838
(32)【優先日】2023-03-21
(33)【優先権主張国・地域又は機関】JP
【新規性喪失の例外の表示】特許法第30条第2項適用申請有り 令和5年7月2日のMPUF R&Dイノベーション研究会年次総会にて発表 [刊行物等] 令和5年9月13日に、公益社団法人日本マーケティング協会のウェブサイトにて公開 [刊行物等]令和5年11月18日の日本知財学会第21回年次学術研究発表会にて発表 [刊行物等] 令和5年10月25日に、公益社団法人日本マーケティング協会のウェブサイトにて公開
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.PYTHON
(71)【出願人】
【識別番号】510255004
【氏名又は名称】川上 成年
(72)【発明者】
【氏名】川上 成年
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175FA03
5B175FB04
(57)【要約】
【課題】 文字列を分類するプログラムを提供する。
【解決手段】 大規模言語モデルによる自然言語処理を提供する生成AIサーバーにネットワークを介して接続したコンピュータに、複数の自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を生成AIサーバーへ送信する処理と、生成AIサーバーが、分類指示情報に基づいて、複数の自然言語からなる文字列情報の各々を、複数の自然言語による分類に分類した分類結果情報を、生成AIサーバーから受信する処理と、分類結果情報に基づいて、複数の自然言語からなる文字列情報を、複数の自然言語による分類ごとに集計する処理と、を実行させる。
【選択図】
図1
【特許請求の範囲】
【請求項1】
大規模言語モデルによる自然言語処理を提供する生成AIサーバーにネットワークを介して接続したコンピュータに、
複数の自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を前記生成AIサーバーへ送信する処理と、
前記生成AIサーバーが、前記分類指示情報に基づいて、前記複数の自然言語からなる文字列情報の各々を、前記複数の自然言語による分類に分類した分類結果情報を、前記生成AIサーバーから受信する処理と、
前記分類結果情報に基づいて、前記複数の自然言語からなる文字列情報を、前記複数の自然言語による分類ごとに集計する処理と、
を実行させる分類処理プログラム。
【請求項2】
前記複数の自然言語からなる文字列情報と、複数の自然言語による第1カテゴリ分類と複数の自然言語による第2カテゴリ分類とを含む分類指示情報と、を前記生成AIサーバーへ送信する処理と、
前記生成AIサーバーが、前記分類指示情報に基づいて、前記複数の自然言語からなる文字列情報の各々を、前記複数の自然言語による第1カテゴリ分類に分類するとともに、前記複数の自然言語による第2カテゴリ分類に分類した分類結果情報を、前記生成AIサーバーから受信する処理と、
前記分類結果情報に基づいて、前記複数の自然言語からなる文字列情報を、前記複数の自然言語による第1カテゴリ分類及び前記複数の自然言語による第2カテゴリ分類ごと、にクロス集計する処理と、
を実行させる請求項1に記載の分類処理プログラム。
【請求項3】
前記分類は、課題、解決手段、品質、効果、用途、ニーズ、及び、便益の中から選択された自然言語によるカテゴリ分類である、請求項1に記載の分類処理プログラム。
【請求項4】
前記集計処理の結果を視覚化する処理をさらに実行させる請求項1または2に記載の分類処理プログラム。
【請求項5】
大規模言語モデルによる自然言語処理を提供する生成AIサーバーと、端末とが、ネットワークを介して接続した分類処理システムであって、
前記端末が、自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を前記生成AIサーバーへ送信し、
前記生成AIサーバーが、前記分類指示情報に基づいて、前記自然言語からなる文字列情報を、前記複数の自然言語による分類に分類して前記端末へ送信する、分類処理システム。
【請求項6】
大規模言語モデルによる自然言語処理を提供する生成AIサーバーと、端末とが、ネットワークを介して接続したシステムで実行される分類処理方法であって、
前記端末が、自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を前記生成AIサーバーへ送信し、
前記生成AIサーバーが、前記分類指示情報に基づいて、前記自然言語からなる文字列情報を、前記複数の自然言語による分類に分類して前記端末へ送信する、分類処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、分類処理プログラム、システム及び方法に関する。
【背景技術】
【0002】
特許文献1には、特許マップ生成プログラムが開示されている。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
特許文献1では、文字列の分類処理にテキストマイニング処理が使用されている。しかしながら、自然言語からなる文字列を分類する処理は難易度が高い。
【0005】
本発明は、このような従来の問題を解決するためになされたもので、自然言語からなる文字列の分類処理を行うことを目的とする。
【課題を解決するための手段】
【0006】
本発明は、大規模言語モデルによる自然言語処理を提供する生成AIサーバーにネットワークを介して接続したコンピュータに、複数の自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を生成AIサーバーへ送信する処理と、生成AIサーバーが、分類指示情報に基づいて、複数の自然言語からなる文字列情報の各々を、複数の自然言語による分類に分類した分類結果情報を、生成AIサーバーから受信する処理と、分類結果情報に基づいて、複数の自然言語からなる文字列情報を、複数の自然言語による分類ごとに集計する処理と、を実行させる分類処理プログラムである。
【0007】
本発明は、大規模言語モデルによる自然言語処理を提供する生成AIサーバーと、端末とが、ネットワークを介して接続した分類処理システムであって、端末が、自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を生成AIサーバーへ送信し、生成AIサーバーが、分類指示情報に基づいて、自然言語からなる文字列情報を、複数の自然言語による分類に分類して端末へ送信する分類処理システムである。
【0008】
本発明は、大規模言語モデルによる自然言語処理を提供する生成AIサーバーと、端末とが、ネットワークを介して接続したシステムで実行される分類処理方法であって、端末が、自然言語からなる文字列情報と、複数の自然言語による分類を含む分類指示情報と、を生成AIサーバーへ送信し、生成AIサーバーが、分類指示情報に基づいて、自然言語からなる文字列情報を、複数の自然言語による分類に分類して端末へ送信する分類処理方法である。
【発明の効果】
【0009】
本発明の分類処理プログラム、システム及び方法によれば、自然言語からなる文字列の分類処理を行うことが可能となる。
【図面の簡単な説明】
【0010】
【
図1】分類処理プログラムを実行するシステムの概略図
【
図2】分類処理プログラムを実行する装置のブロック図
【発明を実施するための形態】
【0011】
以下、実施形態の分類処理プログラム、システム及び方法について、図を参照して詳細に説明をする。
【0012】
図1は、分類処理プログラムを実行するシステムの概略図である。分類処理プログラムを実行するための情報処理装置(端末1)は、ネットワークを介して生成AIサーバー2と接続する。
【0013】
生成AIサーバー2は、入力された文字列の分類を実行するコンピュータである。実施形態の生成AIサーバー2は、例えばOpenAI社のChatGPT(以上、会話型サービス)、GPT-4 Turbo、GPT-4、GPT-3.5 Turbo、GPT-3.5、GPT-3(以上、APIサービス)という大規模言語モデルを組み込んだクラウドベースのサービスを提供する生成AIサーバーである。なお、生成AIサーバー2はこれに限られず、同様の機能を提供する大規模言語モデルを組み込んだ自然言語処理サービスを提供する生成AIサーバー(例えば、Google社が開発したBard(以上、会話型サービス)やGemini(以上、APIサービス)など)であってもよい。
【0014】
実施形態の生成AIサーバー2は、CPU、メモリ、入出力装置、外部インターフェースを有し、外部装置からの入力に対し、大規模言語モデルを組み込んだ自然言語処理(実施形態では分類処理)を実行し出力する。
【0015】
図2は、実施形態の分類処理プログラムを実行するための情報処理装置(端末1)のブロック図である。
【0016】
システムバス108を介して、CPU(Central Processing Unit)101、ROM(Read Only Memory)102、RAM(Random Access Memory)103、HDD(Hard Disk Drive)105、外部I/F(Interface)106、及び、入力部107が接続される。CPU101とROM102とRAM103とで制御部104を構成する。
【0017】
ROM102は、CPU101により実行されるプログラムや閾値を予め記憶する。RAM103は、CPU101が実行するプログラムを展開するエリアと、プログラムによるデータ処理の作業領域となるワークエリアなどの様々なメモリエリア等を有する。
【0018】
HDD105は、入力部107から入力された自然言語文データ(特許データやアンケートデータ等)を記憶する。外部I/F106は、例えば、外部サーバーなどの外部装置と通信するためのインターフェースである。
【0019】
外部I/F106は、外部装置とデータ通信を行うインターフェースであれば良く、たとえば、外部装置にローカルに接続する機器(USBメモリ等)であってもよいし、有線又は無線ネットワークを介して通信するためのネットワークインターフェースであってもよい。
【0020】
制御部104は、外部I/F106を介して、外部装置(生成AIサーバー等)とデータをやり取りすることにより、プログラムの実行に必要なpythonライブラリを取得したり、文字列データの送信や、分類結果の受信を行ったりする。
【0021】
外部I/F106は、液晶ディスプレイ等の表示装置(不図示)と接続する。入力部107は、キーボード、マウス、スキャナ(読取装置)等の入力装置である。
【0022】
(実施形態1:特許データ分析)
次に、実施形態1の分類処理プログラム及び方法の処理手順を説明する。なお、実施形態1では、吸収性物品に関する課題-解決手段マップを作成する例を示す。下記コードブロック1から9を連続してつなげたものが、実施形態のプログラム及び方法であり、基本的には連続して記載すべきものである。ただし、説明しやすさを考慮して、9個に分割して説明する。
【0023】
図3は、実施形態の分類処理プログラム及び方法の処理のフローチャートである。STEP1で、要約(文字列情報)から課題部分と解決部分を抽出し、STEP2で、抽出した課題(第1カテゴリ分類)を分類し、STEP3で、抽出した解決手段(第2カテゴリ分類)で分類し、STEP4で、分類した課題と解決手段でクロス集計を行い、STEP5で集計結果を視覚化する。
【0024】
なお、実施形態では、処理対象の文字列として特許データ(の要約)を用いているが、文字列の対象はこれに限られず、明細書本文や請求項内の文字列を用いてもよく、特許データ以外のアンケートやユーザーレビュー等の文字列を処理対象としてもよい。
【0025】
(STEP1:課題と解決手段の抽出ステップ)
まず、制御部104は、複数の特許データの要約書からの課題の文字列と解決手段の文字列を抽出する。プログラムは以下の通りである。なお、下記プログラムは、情報処理装置(端末1)の制御部に格納された、Pythonによるプログラムである。ただし、他のプログラミングツールやプログラミング言語を使用することでもよい。また、下記プログラムはあくまで一例であり、処理順序や使用するライブラリや関数や変数名は変更してよい。
【0026】
(コードブロック1)
import pandas as pd
from google.colab import drive
drive.mount('/content/drive')
df = pd.read_excel('/content/drive/MyDrive/patdata.xlsx')
df['problem'] = df['summary'].str.extract('[課題](.+?)[解決手段]', expand=False)
df['solution'] = df['summary'].str.extract('[解決手段](.+?)[選択図]', expand=False)
【0027】
このプログラムの説明を詳しくすると、以下のようになる。まず、制御部104は、pandasというモジュールをインポートする。pandasはPythonでデータ分析を行うためのツールである。次に、google.colabというモジュールからdriveという関数をインポートする。driveはGoogleドライブにアクセスするための関数である。
【0028】
制御部104は、drive関数を実行して、Googleドライブを'/content/drive'というパスにマウントする。マウントとは、GoogleドライブのファイルやフォルダをColab上で操作できるようにすることである。
【0029】
制御部104は、pd.read_excel関数を使って、'/content/drive/MyDrive/patdata.xlsx'というパスにあるpatdata.xlsxというExcelファイルを読み込む。このExcelファイルには複数件の要約書データを格納した特許データが格納されている。データフレームの一部を
図4に示す。特許データのsummary列には特許の要約書の内容が格納されている。なお、
図4ではスペースの関係上3件(3行)のみの例示となっているが、実施形態では50件(50行)のデータフレームを使用している。もちろんこれ以上の件数も可能である。
【0030】
制御部104は、読み込んだファイルをdfという変数に代入する。dfはデータフレームと呼ばれる表形式のデータ構造である。df['summary']とすることで、dfの中からsummaryという列だけを取り出す。summary列には、自然言語からなる特許の要約書の内容が格納されている。
【0031】
制御部104は、str.extract関数を使って、summary列から「課題」から「解決手段」までの部分の文字列を抽出する。この部分の文字列は特許の課題を表す(課題文字列情報とする)。抽出した部分文字列をproblemという新しい列に追加する。df['problem'] = ... とすることで、dfに新しい列problemが作成される。
【0032】
同様に制御部104は、str.extract関数を使って、summary列から「解決手段」から「選択図」までの部分の文字列を抽出する。この部分の文字列は特許の解決手段を表す(解決手段文字列情報とする)。抽出した部分の文字列をsolutionという新しい列に追加する。df['solution'] = ... とすることで、dfに新しい列solutionが作成される。
【0033】
図5は、problem列とsolution列が、STEP1の処理により追加されたデータフレームを示す。なお、
図5ではスペースの関係上3件(3行)のみの例示となっているが、実施形態では50件(50行)からなるデータフレームが生成される。なお、summary列の文字列は
図4に記載したので省略している。
【0034】
なお、この要約からの「課題」及び「解決手段」の文字列の抽出工程は必須のものではない。つまり、要約全体をそのまま文字列情報として生成AIサーバーへ送信し、分類することでもよい。ただし、「課題」、「解決手段」の文字列を個別に抽出して分類することにより、生成AIサーバー2による分類精度の向上を図ることができるので、「課題」及び「解決手段」の文字列の抽出工程を設けることが好ましい。
【0035】
(STEP2:課題分類ステップ)
次に、制御部104は、複数の課題文字列情報と複数の課題分類(第1カテゴリの分類)を含む課題分類指示情報を生成AIサーバーへ送信し、生成AIサーバーから課題分類結果情報を受信する。プログラムは以下の通りである。
【0036】
(コードブロック2)
! pip install openai
import openai
import re
【0037】
このコマンドは、OpenAIのPythonライブラリをインストールするためのものである。!は、コマンドをシェルコマンドとして解釈することを示す。pipは、Pythonのパッケージマネージャーで、installはライブラリをインストールするために使用されるコマンドである。
【0038】
制御部104は、openaiとreというPythonライブラリをインポートする。openaiライブラリは、OpenAIのAPIを使用して様々な自然言語処理タスクを実行するためのものであり、reライブラリは正規表現を使用するためのものである。なお、openaiライブラリの使用には、実際にはAPIキーの入力が必要であるが、公開には支障があるため、プログラムの記載からは割愛している。
【0039】
(コードブロック3)
def generate_p_class(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "・次に入力する文章について、‘漏れない性’、‘蒸れない性’、‘動きやすい性’、‘肌に優しい性’、‘その他’、の5つの分類の中のいずれか1つの分類を付与してください。"},
{"role": "user", "content": text}])
p_class = response["choices"][0]["message"]["content"]
return p_class
【0040】
このプログラムは、OpenAIの言語モデル「GPT-4」を使用して、与えられた文章を5つの分類のうちの1つに分類する機能を提供する。なお、言語モデルは「GPT-4」に限られず、「GPT-4 Turbo」や「GPT-3.5 Turbo」であってもよいし、次バージョンのGPTシリーズであってもよい。これらは、自然言語処理タスクにおいて高い精度を発揮することが知られている。
【0041】
generate_p_class(text)関数は、1つのテキスト(text)を引数として受け取り、制御部104は、そのテキストを分類するためにOpenAIのChat Completion APIを呼び出す。APIは、システムとユーザーの2つの役割で構成されるメッセージを送信し、システム側から「次に入力する文章について、‘漏れない性’、‘蒸れない性’、‘動きやすい性’、‘肌に優しい性’、‘その他’、の5つの分類の中のいずれか1つの分類を付与してください。」という指示を送信する。この指示情報を課題分類指示情報とする。
【0042】
なお、‘漏れない性’、‘蒸れない性’、‘動きやすい性’、‘肌に優しい性’、‘その他’は予め定めた自然言語からなる課題の分類(第1カテゴリの分類)である。また、課題の表現については、「~性」に限られず、他の表現を用いてもよい。また、自然言語による指示内容(プロンプト)をさら詳しくしてもよい。また、実施形態では、いずれか1つに分類する指示としているが、複数に分類する指示としてもよい。また、分類数は5つに限られず、それ以上でも以下でもよい。
【0043】
生成AIサーバー2は、与えられたテキスト(課題文字列情報)を課題分類指示情報に基づいて適切な分類に分類して返信する。生成AIサーバー2からのレスポンスには、分類された分類のテキスト(課題分類結果情報)が含まれている。課題分類結果情報は、p_class変数に格納され、関数の出力として返される。
【0044】
(コードブロック4)
def clean_text(text):
text = re.sub(r'\s+', ' ', text)
text = re.sub(r'[^\w\s]', '', text)
return text
【0045】
このプログラムは、引数として受け取った文字列(text)から、特殊文字や余分な空白を取り除いた文字列を返す関数である。具体的には、Pythonの標準ライブラリであるre(正規表現操作)を使って、文字列の操作を行っている。
【0046】
re.sub(r'\s+', ' ', text)は、連続する空白文字を一つの空白文字に置き換える。\sは、空白文字を表し、+はそれが一回以上続くことを示す。つまり、複数回の空白文字を一つに置き換えている。
【0047】
次に、re.sub(r'[^\w\s]', '', text)は、英数字と空白文字以外の文字を削除する。[^\w\s]は、英数字と空白文字以外の文字を表し、^は否定を表す。つまり、これは英数字と空白文字以外の文字を取り除くことを意味する。
【0048】
最後に、クリーン化された文字列を返す。return textは、関数の出力として、クリーン化された文字列を返すことを示す。なお、このコードブロック4は必須ではない。
【0049】
(コードブロック5)
df['p_class'] = df['problem'].apply(lambda x: generate_p_class(clean_text(x)))
【0050】
このプログラムは、Pandasのデータフレームdfのproblem列に格納されている各行の文章を、clean_text関数でクリーン化した後、generate_p_class関数で分類(p_class)を生成した結果をdfの新しい列p_classに追加するためのものである。
【0051】
制御部104は、applyメソッドを使って、df['problem']列の各行の文字列にclean_text関数を適用して、文章をクリーン化する。lambda x:は、clean_text関数に適用される引数を表す。
【0052】
次に、制御部104は、generate_p_class関数にクリーン化された文章を渡して、文章を5つの分類のいずれかに分類した結果を、df['p_class']列に代入する。最終的に、
図6に示すように、新しいp_class列を含むデータフレームdfが返される。
【0053】
(STEP3:解決手段分類ステップ)
次に、制御部104は、複数の解決手段文字列情報と複数の解決手段分類(第2カテゴリ分類)を含む解決手段分類指示情報を生成AIサーバーへ送信し、生成AIサーバーから解決手段結果情報を受信する。プログラムは以下の通りである。
【0054】
(コードブロック6)
def generate_s_class(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "・次に入力する文章について、'吸収構造'、'通気構造'、'肌触り構造'、'固定構造'、'その他'、の5つの分類の中のいずれか1つの分類を付与してください。"},
{"role": "user", "content": text}])
s_class = response["choices"][0]["message"]["content"]
return s_class
【0055】
このプログラムは、引数として受け取った文字列(text)に対して、OpenAIのGPT-4(GPT-3.5も可)を用いて文章の構造を分類するための関数である。
【0056】
generate_s_class(text)関数は、1つのテキスト(text)を引数として受け取り、制御部104は、そのテキストを分類するためにOpenAIのChat Completion APIを呼び出す。APIは、システムとユーザーの2つの役割で構成されるメッセージを送信し、システム側から「次に入力する文章について、'吸収構造'、'通気構造'、'肌触り構造'、'固定構造'、'その他'、の5つの分類の中のいずれか1つの分類を付与してください。」という指示を送信する。この指示情報を解決手段分類指示情報とする。
【0057】
なお、'吸収構造'、'通気構造'、'肌触り構造'、'固定構造'、'その他'は、予め定めた自然言語からなる解決手段の分類(第2カテゴリの分類)である。また、解決手段の表現については、「~構造」に限られず、他の表現を用いてもよい。また、自然言語による指示内容をさら詳しくしてもよい。また、実施形態では、いずれか1つに分類する指示としているが、複数に分類する指示としてもよい。また、分類数は5つに限られず、それ以上でも以下でもよい。
【0058】
生成AIサーバー2は、与えられたテキスト(解決手段文字列情報)を解決手段分類指示情報に基づいて適切な分類に分類して返信する。生成AIサーバー2からのレスポンスには、分類された分類テキスト(解決手段分類結果情報)が含まれている。解決手段分類結果情報はs_class変数に格納され、関数の出力として返される。
【0059】
APIへのリクエストには、openai.ChatCompletion.create()メソッドが使用される。APIに対して送信されるメッセージは、2つの要素を持つリストとして与えられる。最初の要素は、ロールがシステムで、分類の指示を表すメッセージである。次の要素は、ロールがユーザーで、入力された文章を表す。APIがこれらのメッセージを受け取ると、適切な分類を生成して返す。最後に、分類結果(s_class)が返される。
【0060】
(コードブロック7)
df['s_class'] = df['solution'].apply(lambda x: generate_s_class(clean_text(x)))
【0061】
このプログラムは、データフレームdfのsolution列に含まれる各文章に対して、OpenAIのGPT-4を用いて文章の構造を分類するための関数を適用することで、s_class列を作成する。
【0062】
具体的には、制御部104は、df['solution']に含まれる各文章をclean_text関数で前処理した後、generate_s_class関数で文章の構造を分類した結果をs_class列に格納する。ここでも、lambda式を使用して各文章に対して関数を適用する。
【0063】
generate_s_class関数は、先程説明したようにOpenAIのAPIを利用して、与えられた文章に対して分類を行う。具体的には、文章に含まれる構造に基づいて、'吸収構造'、'通気構造'、'肌触り構造'、'固定構造'、'その他'、のいずれか1つの分類を付与するように促す。最終的に、
図6に示すように、df['s_class']には、各解決手段に対する分類結果が格納される。
【0064】
図6は、p_class列とs_class列が、STEP2と3の処理により追加されたデータフレームを示す。なお、
図6ではスペースの関係上20件(20行)のみの例示となっているが、実施形態では50件(50行)からなるデータフレームdfが生成される。また、summary列とproblem列とsolution列の記載は
図4、5に記載したので省略している。
【0065】
(STEP4:集計ステップ)
次に、制御部104は、複数の要約(文字列情報)を、課題分類及び解決手段分類ごとに、クロス集計を行う。プログラムは以下の通りである。
【0066】
(コードブロック8)
result = df.groupby(['p_class', 's_class']).size().reset_index(name='Counts')
【0067】
このプログラムでは、制御部104は、データフレームを p_class と s_class でグループ化し、要約を、課題分類及び解決手段分類ごとに、カウント(集計)する、いわゆるクロス集計を実行する。この操作により、各課題に対する解決手段の出現頻度を知ることができる。
(STEP5:視覚化ステップ)
次に、制御部104は、集計結果を視覚化する。プログラムは以下の通りである。
【0068】
(コードブロック9)
! pip install japanize-matplotlib
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import japanize_matplotlib
y = result['p_class'].tolist()
x = result['s_class'].tolist()
sizes = [size * 100 for size in result['Counts'].tolist()]
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=[8,8])
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')
ax.set_xlabel("解決手段")
ax.set_ylabel("課題")
ax.set_title("課題-解決手段マップ")
plt.xticks(rotation=90)
plt.show()
【0069】
このプログラムでは、いわゆる課題-解決手段マップを作成している。制御部104は、matplotlibを使用して散布図を作成する。x軸には s_class、y軸には p_class を配置し、各点の大きさと色を、それぞれのカテゴリに基づいて設定する。具体的には、グループ化した結果のy列の値(課題のカテゴリ)に対応する色を、rainbow カラーマップで生成したカラーリストから取得する。また、各点には、その点が表すカテゴリのカウント数が表示される。
【0070】
最後に、制御部104は、グラフのスタイルを設定し、外部I/F106を介して接続した液晶ディスプレイ等の表示装置(不図示)にグラフを表示する(
図7)。なお、マップ化はmatplotlibではなくseaborn等の他のライブラリを使用してもよいし、crosstab関数によりクロス集計を行い、二元表の形式やヒートマップ形式で出力することでもよい。
【0071】
また、視覚化はこれに限られず、特許データの出願日と上記分類との関係を示す時系列図としたり、特許データの出願人と上記分類との関係を示す折れ線や棒グラフとしてもよい。matplotlibを使用することにより、様々な形式の視覚化が可能である。
【0072】
(実施形態2:アンケート分析)
次に、実施形態2の分類処理プログラム及び方法の処理手順を説明する。なお、実施形態2では、掃除機のユーザーレビューを、分類、集計し、視覚化する例を示す。下記コードブロック1から6を連続してつなげたものが、実施形態のプログラム及び方法であり、基本的には連続して記載すべきものである。ただし、説明しやすさを考慮して、6個に分割して説明する。
【0073】
実施形態2の分類処理プログラム及び方法の処理では、STEP1で、ユーザーレビューを分類し、STEP2で、分類したユーザーレビューを集計し、STEP3で集計結果を視覚化する(フローチャートは省略)。
【0074】
(STEP1:分類ステップ)
まず、制御部104は、複数のユーザーレビューからデータフレームを作成する。プログラムは以下の通りである。なお、下記プログラムは、情報処理装置(端末1)の制御部に格納された、Pythonによるプログラムである。ただし、他のプログラミングツールやプログラミング言語を使用することでもよい。また、下記プログラムはあくまで一例であり、処理順序や使用するライブラリや関数や変数名は変更してよい。
【0075】
(コードブロック1)
import pandas as pd
from google.colab import drive
drive.mount('/content/drive')
df = pd.read_excel('/content/drive/MyDrive/reviewdata.xlsx')
【0076】
このプログラムの説明を詳しくすると、以下のようになる。まず、制御部104は、pandasというモジュールをインポートする。pandasはPythonでデータ分析を行うためのツールである。次に、google.colabというモジュールからdriveという関数をインポートする。driveはGoogleドライブにアクセスするための関数である。
【0077】
制御部104は、drive関数を実行して、Googleドライブを'/content/drive'というパスにマウントする。マウントとは、GoogleドライブのファイルやフォルダをColab上で操作できるようにすることである。
【0078】
制御部104は、pd.read_excel関数を使って、'/content/drive/MyDrive/reviewdata.xlsx'というパスにあるreviewdata.xlsxというExcelファイルを読み込む。このExcelファイルには複数件のユーザーレビューが格納されている。データフレームの一部を
図8に示す。レビューデータのreview列にはユーザーレビューの内容が格納されている。なお、
図8ではスペースの関係上3件(3行)のみの例示となっているが、実施形態では100件(100行)のデータフレームを使用している。もちろんこれ以上の件数も可能である。
【0079】
制御部104は、読み込んだファイルをdfという変数に代入する。dfはデータフレームと呼ばれる表形式のデータ構造である。df['review']とすることで、dfの中からreviewという列だけを取り出す。review列には、自然言語からなるユーザーレビューの内容(レビュー文字列情報)が格納されている。
【0080】
次に、制御部104は、複数のレビュー文字列情報と複数のニーズ分類を含むニーズ分類指示情報を生成AIサーバーへ送信し、生成AIサーバーからニーズ分類結果情報を受信する。プログラムは以下の通りである。
【0081】
(コードブロック2)
! pip install openai
import openai
【0082】
このコマンドは、OpenAIのPythonライブラリをインストールするためのものである。!は、コマンドをシェルコマンドとして解釈することを示す。pipは、Pythonのパッケージマネージャーで、installはライブラリをインストールするために使用されるコマンドである。
【0083】
制御部104は、openaiというPythonライブラリをインポートする。openaiライブラリは、OpenAIのAPIを使用して様々な自然言語処理タスクを実行するためのものである。なお、openaiライブラリの使用には、実際にはAPIキーの入力が必要であるが、公開には支障があるため、プログラムの記載からは割愛している。
【0084】
(コードブロック3)
def generate_n_class(text):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "・次に入力する文章について、‘心地よい清潔感’、‘労力の軽減感’、‘家事の効率向上’、‘安心の衛生管理’、‘ストレスフリー操作’、‘自宅への誇り感’、‘使い心地の満足度’、‘快適な居住環境’、‘時間節約の充実感’、‘賢い選択の自信’、の10つの分類の中のいずれか1つの分類を付与してください。"},
{"role": "user", "content": text}])
n_class = response["choices"][0]["message"]["content"]
return n_class
【0085】
このプログラムは、OpenAIの言語モデル「GPT-4」を使用して、与えられた文章を5つの分類のうちの1つに分類する機能を提供する。なお、言語モデルは「GPT-4」に限られず、「GPT-4 Turbo」や「GPT-3.5 Turbo」であってもよいし、次バージョンのGPTシリーズであってもよい。これらは、自然言語処理タスクにおいて高い精度を発揮することが知られている。
【0086】
generate_n_class(text)関数は、1つのテキスト(text)を引数として受け取り、制御部104は、そのテキストを分類するためにOpenAIのChat Completion APIを呼び出す。APIは、システムとユーザーの2つの役割で構成されるメッセージを送信し、システム側から「次に入力する文章について、‘心地よい清潔感’、‘労力の軽減感’、‘家事の効率向上’、‘安心の衛生管理’、‘ストレスフリー操作’、‘自宅への誇り感’、‘使い心地の満足度’、‘快適な居住環境’、‘時間節約の充実感’、‘賢い選択の自信’、の10つの分類の中のいずれか1つの分類を付与してください。」という指示を送信する。この指示情報をニーズ分類指示情報とする。
【0087】
なお、‘心地よい清潔感’、‘労力の軽減感’、‘家事の効率向上’、‘安心の衛生管理’、‘ストレスフリー操作’、‘自宅への誇り感’、‘使い心地の満足度’、‘快適な居住環境’、‘時間節約の充実感’、‘賢い選択の自信’は予め定めた自然言語からなるニーズの分類である。また、ニーズの表現については、他の表現を用いてもよい。また、指示内容(プロンプト)をさら詳しくしてもよい。また、実施形態では、いずれか1つに分類する指示としているが、複数に分類する指示としてもよい。また、分類数は10に限られず、それ以上でも以下でもよい。
【0088】
生成AIサーバー2は、与えられたテキスト(ニーズ文字列情報)をニーズ分類指示情報に基づいて適切な分類に分類して返信する。生成AIサーバー2からのレスポンスには、分類された分類のテキスト(ニーズ分類結果情報)が含まれている。ニーズ分類結果情報は、n_class変数に格納され、関数の出力として返される。
【0089】
(コードブロック4)
df['n_class'] = df['review'].apply(lambda x: generate_n_class(x))
【0090】
このプログラムは、Pandasのデータフレームdfのreview列に格納されている各行の文章をgenerate_n_class関数で処理、分類(n_class)を生成した結果をdfの新しい列n_classに追加するためのものである。
【0091】
制御部104は、applyメソッドを使って、df['review']列の各行の文字列に、lambda x:は、xに適用される引数を表す。
【0092】
制御部104は、generate_n_class関数に文章を渡して、文章を10つの分類のいずれかに分類した結果を、df['n_class']列に代入する。最終的に、
図9に示すように、新しいn_class列を含むデータフレームdfが返される。
【0093】
図9は、n_class列が、STEP2の処理により追加されたデータフレームを示す。なお、
図9ではスペースの関係上20件(20行)のみの例示となっているが、実施形態では100件(100行)からなるデータフレームdfが生成される。また、review列の記載は
図8に記載したので省略している。
【0094】
(STEP2:集計ステップ)
次に、制御部104、分類結果情報(ニーズ分類結果)に基づいて、複数のレビュー(文字列情報)を、複数の分類(ニーズ分類)ごとに集計する処理を行う。
【0095】
(コードブロック5)
df_n_class_counts = df['n_class'].value_counts().sort_index().reset_index()
df_n_class_counts.columns = ["ニーズ分類", "件数"]
【0096】
df['n_class'].value_counts(): この部分では、データフレーム df の n_class という列に含まれる値の出現頻度を計算している。value_counts() 関数は、異なる値がデータフレーム内にどの程度の頻度で出現するかを数え、それらの頻度を持つ新しいデータフレームまたはシリーズを返す。
【0097】
.sort_index(): このメソッドは、得られた頻度のデータをインデックス(ここでは n_class の値)に基づいて並び替える。これは、デフォルトでは値の出現頻度に基づいて並べ替えられるので、元の値(n_class)に基づいて再度並べ替えるために使用される。
【0098】
.reset_index(): このメソッドはインデックスをリセットし、既存のインデックスを通常の列に変換する。これにより、元のインデックス(n_class の値)が新しいデータフレームの列として保持される。
【0099】
df_n_class_counts.columns = ["ニーズ分類", "件数"]: 最後に、新しく作成されたデータフレーム df_n_class_counts の列名を変更する。最初の列(元の n_class の値)を「ニーズ分類」と名付け、頻度の値を持つ2番目の列を「件数」と名付けている。
(STEP3:視覚化ステップ)
次に、制御部104は、集計結果を視覚化する。プログラムは以下の通りである。
【0100】
(コードブロック6)
! pip install japanize-matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib
plt.figure(figsize=(10, 6))
plt.plot(df_n_class_counts['ニーズ分類'], df_n_class_counts['件数'])
plt.title('ニーズ分類ごとの件数')
plt.xlabel('ニーズ分類')
plt.ylabel('件数')
plt.show()
【0101】
!pip install japanize-matplotlib: これは japanize-matplotlib パッケージをインストールするコマンドである。このパッケージは、matplotlibで日本語を正しく表示するために使用される。
【0102】
import matplotlib.pyplot as plt: ここでは、matplotlibのpyplotモジュールを plt という名前でインポートする。
【0103】
import japanize_matplotlib: この行では、先ほどインストールした japanize-matplotlib ライブラリをインポートする。
【0104】
plt.figure(figsize=(10, 6)): これは、グラフのサイズを指定している。ここでは、幅が10インチ、高さが6インチの図(グラフ)を作成する。
【0105】
plt.plot(df_n_class_counts['ニーズ分類'], df_n_class_counts['件数']): この行で、df_n_class_counts データフレームのニーズ分類列をx軸に、件数列をy軸にプロットしている。これにより、ニーズ分類と件数の関係がラインチャート(折れ線グラフ)で表示される。
【0106】
plt.title('ニーズ分類ごとの件数'): ここでグラフにタイトルを設定している。タイトルは「ニーズ分類ごとの件数」とされる。
【0107】
plt.xlabel('ニーズ分類') と plt.ylabel('件数'): これらの行は、それぞれx軸とy軸にラベルを設定している。x軸のラベルは「ニーズ分類」、y軸のラベルは「件数」としている。
【0108】
plt.show(): 最後に、この行はmatplotlibで作成したグラフを表示するためのものである。これにより、上述の設定に基づいたグラフが画面に表示される。
【0109】
制御部104は、外部I/F106を介して接続した液晶ディスプレイ等の表示装置(不図示)にグラフを表示する(
図10)。
【0110】
また、視覚化はこれに限られず、棒グラフとしてもよい。matplotlibを使用することにより、様々な形式の視覚化が可能である。
【0111】
上記実施形態では、Pythonによる処理について説明したが、これに限られず、エクセルなどのスプレッドシートとChatGPTやAPIを組み合わせて使用することでも同様の処理を行うことが可能である。
【0112】
また、分類のカテゴリは、課題と解決手段やニーズに限られず、分析の目的に応じて、品質、効果、用途、及び、便益の自然言語によるカテゴリーの分類としてもよい。また、分類対象の文字列は特許データに限られず、例えば論文などの、自然言語による文字列であれば限定はない。
【0113】
以上、実施形態を説明したが、この実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。この新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。この実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0114】
1 端末、2 生成AIサーバー、101 CPU、102 ROM、103 RAM、104 制御部、105 HDD、106 外部I/F、107 入力部、108 システムバス