▶ 株式会社日立製作所の特許一覧
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024165175
(43)【公開日】2024-11-28
(54)【発明の名称】テキスト生成システム
(51)【国際特許分類】
G06F 8/73 20180101AFI20241121BHJP
【FI】
G06F8/73
【審査請求】未請求
【請求項の数】13
【出願形態】OL
(21)【出願番号】P 2023081096
(22)【出願日】2023-05-16
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.PYTHON
2.JAVA
3.JAVASCRIPT
4.VISUAL BASIC
5.Mathematica
(71)【出願人】
【識別番号】000005108
【氏名又は名称】株式会社日立製作所
(74)【代理人】
【識別番号】110001689
【氏名又は名称】青稜弁理士法人
(72)【発明者】
【氏名】是枝 祐太
(72)【発明者】
【氏名】森下 皓文
(72)【発明者】
【氏名】今一 修
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BB03
5B376BB11
5B376BB15
(57)【要約】
【課題】テキスト生成システムにおいて、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成する。
【解決手段】プログラムコードからプログラムコード部分を特定する代表プログラムコード特定部と、プログラムコード部分とモデル情報に基づいてプログラムコードの説明テキストを生成するコンテンツ生成部を有する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
プロセッサによりプログラムコードから前記プログラムコードの説明テキストを生成するテキスト生成システムであって、
前記プログラムコードからプログラムの代表的な処理が記載されている前記プログラムコードの一部分であるプログラムコード部分を特定する代表プログラムコード特定部と、
前記プログラムコード部分と、モデル情報としての少なくとも一つの設定値に基づいて、前記プログラムコードの前記説明テキストを生成するコンテンツ生成部と、
を有することを特徴とするテキスト生成システム。
【請求項2】
前記代表プログラムコード特定部は、
前記プログラムコード部分として、前記プログラムコードの断片を構成するプログラムコード断片を特定することを特徴とする請求項1に記載のテキスト生成システム。
【請求項3】
前記代表プログラムコード特定部は、
前記プログラムの前記代表的な処理として、前記プログラムの抽象的な全体処理が記載されているプログラムコード部分を特定し、
前記プログラムコード部分として、ファイル、パッケージ、関数、クラス、コードブロック及びユーザーインターフェースコンポーネントの少なくとも一つを特定することを特徴とする請求項1に記載のテキスト生成システム。
【請求項4】
前記代表プログラムコード特定部は、
前記プログラムコードの内容に基づいて、前記プログラムコードから前記プログラムコード部分を特定することを特徴とする請求項1に記載のテキスト生成システム。
【請求項5】
前記代表プログラムコード特定部は、
前記プログラムコードを複数のプログラムコード部分に分割し、
分割された複数の前記プログラムコード部分の内容及び分割された複数の前記プログラムコード部分の間の構造的な関係性の少なくとも一つに基づいて、前記プログラムコード部分を特定することを特徴とする請求項1に記載のテキスト生成システム。
【請求項6】
前記コンテンツ生成部は、
前記設定値として、アフィン変換又は非線形変換のパラメータ値を用いて、前記アフィン変換又は前記非線形変換によって前記説明テキストを生成することを特徴とする請求項1に記載のテキスト生成システム。
【請求項7】
前記コンテンツ生成部の生成内容を制御する少なくとも一つの文字列を保持するプロンプトテンプレートデータベースを更に有し、
前記コンテンツ生成部は、
前記プロンプトテンプレートデータベースから前記文字列の入力受け付け、前記設定値と前記文字列に基づいて前記説明テキストを生成することを特徴とする請求項1に記載のテキスト生成システム。
【請求項8】
前記代表プログラムコード特定部で特定された前記プログラムコード部分から前記モデル情報を学習し、学習した前記モデル情報に基づいて前記設定値を生成するモデル学習部を更に有することを特徴とする請求項1に記載のテキスト生成システム。
【請求項9】
前記コンテンツ生成部は、
前記プログラムコードの前記説明テキストを複数生成することを特徴とする請求項1に記載のテキスト生成システム。
【請求項10】
複数の前記説明テキストに対して所定の順序を付与する出力ランキング部を更に有することを特徴とする請求項9に記載のテキスト生成システム。
【請求項11】
複数の前記説明テキストを集約した集約生成テキストを生成する生成テキスト集約部を更に有することを特徴とする請求項9に記載のテキスト生成システム。
【請求項12】
ユーザによるテキスト入力を受け付ける対話的入力受付部を更に有し、
前記コンテンツ生成部は、
前前記テキスト入力と前記プログラムコード部分と前記設定値に基づいて前記説明テキストを生成することを特徴とする請求項1に記載のテキスト生成システム。
【請求項13】
前記説明テキストを表示する表示部を更に有することを特徴とする請求項1に記載のテキスト生成システム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、テキスト生成システムに関する。
【背景技術】
【0002】
近年は、ローコード・ノーコード開発に代表されるようにソフトウェア開発の自動化の進展が著しい。一方、プログラムコードと同程度に重要な、readmeなどレポジトリ全体に関する説明テキスト(ドキュメンテーション)については、多くの開発者の悩みの種であるにもかかわらず、人手での作成に頼っているのが現状である。
【0003】
レポジトリ全体に関するドキュメンテーションの作成を支援する手段として、静的なテンプレートを開発者に提示し、ユーザの入力に基づきテンプレートを埋めるシステムが知られている。しかし、これらの手段は、あくまでもドキュメンテーション作成の要件を開発者に示すにすぎず、実際に開発者がドキュメンテーションの内容を書くことを支援できない。
【0004】
これに関連する技術として、例えば、特許文献1、非特許文献1がある。
【0005】
特許文献1は、プログラムコードから1つ以上のコードコメントを収集し、該コードコメントを結合することで、レポジトリ全体に関するドキュメンテーションを作成する方法を開示している。
【0006】
非特許文献1は、大規模言語モデルを活用することにより、クラスないしは関数のプログラムコードから該クラスないしは関数のコードコメントを生成するシステムを開示している。
【先行技術文献】
【特許文献】
【0007】
【非特許文献】
【0008】
【非特許文献1】Yue Wang, Weishi Wang, Shafiq Joty and Steven C.H. Hoi. 2021. CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code Understanding and Generation. In Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing, pp. 8696-8708. Association for Computational Linguistics.
【発明の概要】
【発明が解決しようとする課題】
【0009】
特許文献1は、開発者が記述済みのコードコメントを編纂するに過ぎず、プログラムコード自体からレポジトリ全体に関するドキュメンテーションを作成する方法を開示していない。
【0010】
非特許文献1は、クラスないしは関数のコードコメントの生成は、数十行のプログラムコードから、高々数行の具体性の高い説明テキストを生成することに過ぎない。
【0011】
その一方で、readmeに代表されるレポジトリ全体に関するドキュメンテーションの生成においては、数万から数百万行のプログラムコードを抽象的に要約して生成を行う必要があるところ、非特許文献1の計算量は入力プログラムコード長に対して二乗増加する。そのため、コードコメント生成技術をレポジトリ全体に関するドキュメンテーションの生成の問題に適用することはできない。
【0012】
本発明の目的は、テキスト生成システムにおいて、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することにある。
【課題を解決するための手段】
【0013】
本発明の一態様のテキスト生成システムは、プロセッサによりプログラムコードから前記プログラムコードの説明テキストを生成するテキスト生成システムであって、前記プログラムコードからプログラムの代表的な処理が記載されている前記プログラムコードの一部分であるプログラムコード部分を特定する代表プログラムコード特定部と、前記プログラムコード部分と、モデル情報としての少なくとも一つの設定値に基づいて、前記プログラムコードの前記説明テキストを生成するコンテンツ生成部とを有することを特徴とする。
【発明の効果】
【0014】
本発明の一態様によれば、テキスト生成システムにおいて、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することができる。
【図面の簡単な説明】
【0015】
【
図1】実施例1のテキスト生成システムの構成の一例を示す図である。
【
図1A】実施例1のテキスト生成システムの構成の一例を示す図である。
【
図2】実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
【
図3】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図4】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図5】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図6】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図7】実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
【
図8】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図9】実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
【
図10】実施例1のコンテンツ生成部112が実行する処理の一例を説明するフローチャートである。
【0016】
プロンプトテンプレートの一例を示す図である。
【0017】
プロンプトテンプレートの一例を示す図である。
【0018】
プロンプトテンプレートの一例を示す図である。
【
図13】実施例2のテキスト生成システムの構成の一例を示す図である。
【
図14】実施例2の学習部1310が実行する処理の一例を説明するフローチャートである。
【
図15A】プロンプトテンプレートの一例を示す図である。
【
図15B】プロンプトテンプレートの一例を示す図である。
【
図16】実施例3のテキスト生成システムの構成の一例を示す図である。
【
図17】実施例2の出力ランキング部1601が実行する処理の一例を説明するフローチャートである。
【
図18】実施例4のテキスト生成システムの構成の一例を示す図である。
【
図19A】プロンプトテンプレートの一例を示す図である。
【
図19B】プロンプトテンプレートの一例を示す図である。
【
図20】プロンプトテンプレートの一例を示す図である。
【
図21】実施例5のテキスト生成システムの構成の一例を示す図である。
【
図22】実施例5の対話的入力受付部2101が実行する処理の一例を説明するフローチャートである。
【
図23A】プロンプトテンプレートの一例を示す図である。
【
図23B】プロンプトテンプレートの一例を示す図である。
【
図23C】プロンプトテンプレートの一例を示す図である。
【
図23D】プロンプトテンプレートの一例を示す図である。
【
図24A】実施例6の出力部(表示部)のユーザインターフェースに表示する内容の一例を示す図である。
【
図24B】実施例6の出力部(表示部)のユーザインターフェースに表示する内容の一例を示す図である。
【
図24C】実施例6の出力部(表示部)のユーザインターフェースに表示する内容の一例を示す図である。
【
図25】プロンプトテンプレートの一例を示す図である。
【発明を実施するための形態】
【0019】
以下、本発明の実施例を、図面を用いて説明する。ただし、本発明は以下に示す実施の形態の記載内容に限定して解釈されるものではない。本発明の思想ないし趣旨から逸脱しない範囲で、その具体的構成を変更し得ることは当業者であれば容易に理解される。
【0020】
以下に説明する発明の構成において、同一又は類似する構成又は機能には同一の符号を付し、重複する説明は省略する。
【0021】
本明細書等における「第1」、「第2」、「第3」等の表記は、構成要素を識別するために付するものであり、必ずしも、数又は順序を限定するものではない。
【0022】
図面等において示す各構成の位置、大きさ、形状、及び範囲等は、発明の理解を容易にするため、実際の位置、大きさ、形状、及び範囲等を表していない場合がある。したがって、本発明では、図面等に開示された位置、大きさ、形状、及び範囲等に限定されない。
【実施例0023】
図1、
図1Aは、実施例1のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0024】
テキスト生成システムは、プログラムコードレポジトリを入力にレポジトリ全体に関するドキュメンテーションを出力する。実施例1では、Python言語で記述されたレポジトリを入力にレポジトリ全体に関するドキュメンテーションである英文のreadmeを1つ出力する計算機システムを想定する。
【0025】
なお、対象とするプログラムコードはPython言語に限定されず、Java、Javascript、C言語、R言語、Mathematica言語、Visual Basic for Applications、HTMLなどのプログラム言語・マークアップ言語や、ユーザが構築したドメイン固有言語(DSL)、それらの組み合わせなど、1つ以上の機能を給する目的で計算機が実行することが意図されたコンピュータ言語であれば、実際にコンピュータが実行できる状態・形態であるかは問わない。
【0026】
また、出力されるドキュメンテーションは、レポジトリ全体に対して抽象的なドキュメンテーションであれば、言語を問わず、readmeだけでなく設計仕様書の一部分やユーザ文書、利用マニュアルなどであっても良い。
【0027】
テキスト生成システムは、一つの計算機100から構成される。計算機100は、プロセッサ101、メモリ102、及びネットワークインタフェース103を有する。各ハードウェアは内部バスと介して互いに接続される。計算機100は、HDD(Hard Disk Drive)及びSSD(Solid State Drive)等の記憶装置、キーボード、マウス、及びタッチパネル等の入力装置、並びに、ディスプレイ等の出力装置を有してもよい。
【0028】
プロセッサ101は、メモリ102に格納されるプログラムを実行する。プロセッサ101がプログラムにしたがって処理を実行することによって、所定の機能を有する機能部(モジュール)として動作する。以下の説明では、機能部を主語に処理を説明する場合、プロセッサ101が、当該機能部を実現するプログラムを実行していることを表す。
【0029】
メモリ102は、プロセッサ101が実行するプログラム及び当該プログラムに必要な情報を格納する。また、メモリ102は、プログラムが一時的に使用するワークエリアを含む。ネットワークインタフェース103は、ネットワークを介して他の装置と接続する。
【0030】
ここで、計算機100のメモリ102に格納されるプログラム及び情報について説明する。
【0031】
計算機100のメモリ102は、モデル情報111とプロンプトテンプレートデータベース113を保持し、また、代表プログラムコード特定部110とコンテンツ生成部112を実現するプログラムを格納する。
【0032】
代表プログラムコード特定部110は、プログラムコードの入力を受けつけ、該プログラムコードからプログラムの代表的な処理が記載されているプログラムコード断片を特定する。前記プログラムの代表的な処理とは、例えば、プログラムの抽象的な全体処理である。
【0033】
前記代表プログラムコードは、アプリケーションのエントリーポイント、ファサードデザインパターンにおけるファサード、オブジェクト指向型のライブラリにおけるベースクラスなど、様々な形態をとりうる。
【0034】
プログラムコード断片は、前記プログラムコードの一部分であるプログラムコード部分であり、ファイル、パッケージ、関数、クラス、コードブロック、ユーザーインターフェースコンポーネントなどの少なくとも1つである。実施例1では、プログラムコード断片としてファイルを採用する。
【0035】
コンテンツ生成部112は、前記プログラムコード断片を受け付け、モデル情報111に格納された少なくとも1つ以上の設定値に基づいて、前記プログラムコードの説明テキストを生成する。
【0036】
なお、計算機システムは、計算機100にデータを入力し、また、計算機100からデータを取得するための端末等を含んでもよい。計算機100が有する機能を、ネットワークを介してつながった二つ以上の計算機で実現してもよい。また、計算機100は、仮想化技術を利用して実現してもよい。
【0037】
図2から
図9を用いて、代表プログラムコード特定部110が実行する処理について説明する。
図2、
図7、及び
図9は、実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
図3、
図4、
図5、
図6、及び
図8は、実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【0038】
まず、代表プログラムコード特定部110はプログラミング言語Pythonで記述された1つ以上のファイルから構成されるプログラムコードを受け付ける(ステップS201)。
【0039】
プログラムコードは単一のレポジトリで管理されるファイルの集合でも良いし、複数のレポジトリにまたがって管理されるファイルの集合でも良い。また、単一のレポジトリで管理されるファイルの部分集合であってもよいし、レポジトリ以外の手段で管理されるファイルの集合でもよい。
【0040】
次に、代表プログラムコード特定部110は前記プログラムコードをN個のファイル300に分割する(ステップS202)。該分割の単位はファイルでもよいし、関数・クラスなどファイル未満の単位でも良い。パッケージ等複数のファイルにまたがる単位でもよいし、パッケージと関数の組み合わせなど非排他的な単位でも良い。
【0041】
図3に示すように、ファイル300に固有のファイル識別子301、レポジトリ内におけるファイル300の格納場所であるファイルディレクトリ302、ファイルに記録されているファイル内容303を、ファイル300に格納する。
【0042】
次に、代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS203)。
【0043】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303を解析し、該ファイル内容303のプログラムコードが依存しているファイル300を特定する(ステップS204)。依存グラフ400(
図4参照)に該ターゲットファイル300から該依存先のファイル300に対して依存エッジ401を追加する。プログラムコードが依存しているファイル300を特定するには静的プログラム解析を活用してもよいし、正規表現などを活用してもよいし、動的解析や、プログラムコードをコンパイルした上でリバースエンジニアリングをしてもよい。
【0044】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303を解析し、該ファイルに含まれるクラスが継承しているクラスが含まれているファイル300を特定する(ステップS205)。継承グラフ500(
図5参照)に該ターゲットファイル300から該依存先のファイル300に対して継承エッジ501を追加する。
【0045】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300について処理を実行したか否かを判定する(ステップS206)。
【0046】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS203に戻り、同様の処理を実行する。
【0047】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、ステップS207に進む。
【0048】
次に、代表プログラムコード特定部110は、依存グラフ400から各ファイル300の依存グラフ序数602を算出する(ステップS207)。依存グラフ序数の算出S207を
図6と
図7を使い説明する。
【0049】
代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS701)。ターゲットファイル300をターゲットファイルiと呼称する。
【0050】
代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS702)。ターゲットファイル300をターゲットファイルjと呼称する。
【0051】
代表プログラムコード特定部110は、依存グラフ400におけるターゲットファイルjからターゲットファイルiへの有向グラフ上の距離(最短経路における辺数)を距離マトリクス601の(i,j)の座標に格納する(ステップS703)。ターゲットファイルjからターゲットファイルiに到達できない場合は0を格納する。
【0052】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300についてステップS703の処理を実行したか否かを判定する(ステップS704)。
【0053】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS702に戻り、同様の処理を実行する。
【0054】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、ステップS705に進む。
【0055】
代表プログラムコード特定部110は、距離マトリクス601のi列の最大値を計算し、ターゲットファイルiの依存グラフ序数602として格納する(ステップS705)。
【0056】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300についてステップS702からS705の処理を実行したか否かを判定する(ステップS706)。
【0057】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS701に戻り、同様の処理を実行する。
【0058】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、依存グラフ序数の算出S207を終了する。
【0059】
次に、代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS208)。
【0060】
次に、代表プログラムコード特定部110は、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801を算出する(ステップS209)。仮分類結果の算出S209を
図8と
図9を使い説明する。
【0061】
代表プログラムコード特定部110は、ターゲットファイル300の依存グラフ序数602が全ファイル300の依存グラフ序数602の最小値と同じ値である場合、ターゲットファイル300が依存グラフの最上位であると判定する(ステップS901)。依存グラフの最上位であるファイルはエントリーポイントなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,0)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,0)に「0」の値を格納する。
【0062】
次に、代表プログラムコード特定部110は、ターゲットファイル300の依存グラフ序数602が全ファイル300の依存グラフ序数602の最大値と同じ値である場合、ターゲットファイル300が依存グラフ400の最下位であると判定する(ステップS902)。
【0063】
依存グラフの最下位であるファイルは代表的かつ抽象的な処理を記述している可能性が高いエントリーポイントである可能性が低いため、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,1)に「-1」の値を、判定結果が負である場合は仮分類結果801の(i,1)に「0」の値を格納する。
【0064】
次に、代表プログラムコード特定部110は、継承グラフ500においてターゲットファイル300の入次数が3以上であるかを判定する(ステップS903)。
【0065】
あるクラスが多数のクラスから継承を受けている場合、該クラスはオブジェクト指向型のライブラリにおけるベースクラスなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,2)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,2)に「0」の値を格納する。なお、前記入次数の閾値は任意の値で良い。
【0066】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイルディレクトリ302に基づき、ターゲットファイル300のファイル名に文字列「main」が含まれるかを判定する(ステップS904)。
【0067】
あるファイルが文字列「main」を含むファイル名を持つとき、該ファイルはエントリーポイントなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,3)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,3)に「0」の値を格納する。なお、前記文字列「main」の代わりに、「cli」や「command」など任意の文字列を用いても良い。
【0068】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303に基づき、ターゲットファイル300に文字列「main」が含まれる関数が存在するかを判定する(ステップS905)。
【0069】
ある関数が文字列「main」を含むとき、該関数はエントリーポイントなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,4)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,4)に「0」の値を格納する。なお、前記文字列「main」の代わりに、「cli」など任意の文字列を用いても良い。
【0070】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303に基づき、ターゲットファイル300のファイルサイズが300バイト以下であるかを判定する(ステップS906)。あるファイルに記述されたプログラムコードが極端に短い場合、該ファイルに具体的な処理が書かれている可能性は低いため、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,5)に「-1」の値を、判定結果が負である場合は仮分類結果801の(i,5)に「0」の値を格納する。なお、前記閾値は300バイト以外の任意の値でもよく、前記判定対象はユニコード文字数など他の指標であっても良い。
【0071】
次に、代表プログラムコード特定部110は、仮分類結果の算出S209を終了する。
【0072】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300についてステップS209の処理を実行したか否かを判定する(ステップS210)。
【0073】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS208に戻り、同様の処理を実行する。
【0074】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、ステップS211に進む。
【0075】
次に、代表プログラムコード特定部110は、仮分類結果801をファイルごとに加算することで、ターゲットファイル300の代表プログラムコードらしさを示すファイルスコア802を算出する(ステップS211)。なお、仮分類結果801の統合には重み付け和や、投票など任意の統合方法を用いても良い。また、ファイルスコア802を擬似正解データとみなし仮分類結果801乃至はファイル内容303を特徴量としたファイルスコア802予測器を作成し、該予測器を用いファイルスコア802を計算しなおす弱教師付き学習を利用してもよい。
【0076】
次に、代表プログラムコード特定部110は、各ファイル300のファイルスコア802が最大なるファイル300を選択する(ステップS212)。なお、各ファイル300のファイルスコア802順に合計ファイルサイズが閾値を上回るまでファイル300を選択するなど、2つ以上のファイル300を選択してもよい。
【0077】
また、2つ以上のファイル300の選択にあたって、選択済みのファイル300とファイル内容303の類似度が高いファイル300を除外するなど、異なる観点を併用してファイル300の選択を行っても良い。実施例1において複数のファイル300を選択した場合、それらのファイル内容303を結合し、1つのファイル300であるかのように扱う。
【0078】
実施例1では6個の弱分類器を使う方法を説明したが、任意の数の弱分類器を用いても良い。また、利用する弱分類器は上記で開示内容に限定されず、「引数解析器を含むか」、「MVCモデルにおけるコントローラに相当する処理か」、「ファイル名が「test_」から始まらないか」、「バージョン管理のソフトウェア上で初期に登録されたファイルか」、「特定のユーザによって作成されたファイルか」など、プログラミング言語依存の処理、アプリケーション形態依存の処理、メタ情報依存の処理を含む多用な処理を含んで良い。また、ファイル内容303に依存せず、ユーザによる指定を受け付けても良い。
【0079】
以上が、代表プログラムコード特定部110が実行する処理の説明である。
【0080】
コンテンツ生成部112は、モデル情報111、プロンプトテンプレートデータベース113、及び選択されたファイル300を入力にreadmeを生成する。
図10から
図12を使いコンテンツ生成部112の処理を説明する。
【0081】
コンテンツ生成部112は、選択されたファイル300の入力を受け付ける(ステップS1001)。
【0082】
次に、コンテンツ生成部112は、前記ファイル300の前処理を行う(ステップS1002)。該前処理においては、各ファイル300のファイル内容303からコードレポジトリの抽象的な処理を把握するには不要と思われるインポート文やファイル先頭のライセンス表示などを正規表現で除去の上、各ファイル300のファイル内容303を結合する。なお、該前処理においては重複する記述の除去や、ヒューリスティクスに基づく重要箇所の特定などを行っても良い。
【0083】
次に、コンテンツ生成部112は、前記結合したファイル内容303を所定の閾値Kに基づき前方K文字の代表プログラムコード文字列に短縮する(ステップS1003)。なお、前方K文字以外を除去するかわりに、後方K文字以外を除去したり、前方K/2文字と後方K/2文字以外を除去するなど、任意の短縮方法をとっても良い。また、閾値Kは所望の計算時間にあわせて任意の値を指定して良い。
【0084】
次に、コンテンツ生成部112は、前記代表プログラムコード文字列とプロンプトテンプレート113から取得したプロンプトテンプレート1100-1(
図11A参照)を組み合わせることでプロンプト1110-2(
図11B参照)を作成する(ステップS1004)。
【0085】
図11Aに示すように、プロンプトテンプレート1100-1は、自然言語でドキュメンテーションの生成を促すプロンプトテキスト1101、代表プログラムコードプレースホルダ1102、ファイルプレースホルダ1103から構成される。コンテンツ生成部112は、前記代表プログラムコード文字列を代表プログラムコードプレースホルダ1102に格納し、レポジトリ内から無作為に抽出したファイル300のファイルディレクトリ302からファイル名を抽出し、該ファイル名を結合した上でファイルプレースホルダ1103に格納する。
【0086】
プロンプトテンプレート1100-1は、代表プログラムコードを活用しドキュメンテーションを生成することが志向されていれば、プロンプトテキスト1101、代表プログラムコードプレースホルダ1102、及びファイルプレースホルダ1103の構成を取る必要はなく、レポジトリ名やユーザ名、ライセンス情報など様々な情報を含みうる。また、それらの情報は対話的質問や設定ファイルなどを通し、ユーザから別途入力を受け付けてもよい(
図25参照)。
【0087】
次に、コンテンツ生成部112は、前記プロンプト1110-2を1つ以上のトークンから構成されるプロンプトトークン列に分割する(ステップS1005)。「トークン」は一般的には変数名、予約語、演算子などプログラミング言語を構成する最小単位を意味するが、本発明においてはバイトペアエンコーディングなどプログラミング言語における「トークン」とは異なる単位で分割を行っても良い。
【0088】
次に、コンテンツ生成部112は、前記プロンプトトークン列をトークン辞書1200(
図12参照)を使い、P個の整数からなるプロンプトトークンインデックス列{t
0,t
1,・・・t
P}に変換する(ステップS1006)。該変換は、前記プロンプトトークン列を構成する各トークンをトークン辞書1200のトークン1201と突合し、合致したトークン1201に紐付くインデックス1202を取得することによって実現される。なお、前記トークンに合致するトークン1201が存在しない場合、該トークンは所定のインデックス1202を紐つける。
【0089】
次に、コンテンツ生成部112は、変数iのループ処理を開始する(ステップS1007)。初期値として変数iに0を格納する。
GPT-3などトークンインデックス列に対する確率分布モデルを用いて、プロンプトトークンインデックス列と、生成済みの(i-1)番目までの生成トークンインデックス列を入力に、i番目における生成トークンインデックスxiの確率分布を計算する。
【0090】
p(xi|θ,t0,t1,・・・tP,x0,x1,・・・,xi-1)
ただし、θはモデル情報111に格納された確率分布モデルの設定値(パラメータ)である。
【0091】
確率値が最大なる生成トークンインデックスをi番目の生成トークンインデックスとして取得する。
【0092】
argmaxxi p(xi|t0,t1,・・・tP,x0, x1,・・・,xi-1)
なお、確率値が最大なるトークンインデックスを選択するかわりに、確率分布をもとにサンプリングを行ったり、beam searchなどを用いてトークンインデックスを選択しても良い。また、前記確率分布モデルはT5やBLOOMなどTransformerアーキテクチャに基づくモデルや、ELMoなどの再帰的計算に基づくモデル、GShardなど分散計算に基づくモデルで実現されてもよい。
【0093】
前記確率分布モデルは様々な文書を利用して単語の確率分布を学習したモデル、それらと同一のアーキテクチャを持つモデルを独自のコーパスで学習したモデル、それらのモデルをでもよい。入力トークンインデックス列をもとに入力トークンインデックスを生成できるのであれば、確率分布の要件を満たさなくても良い。
【0094】
次に、コンテンツ生成部112は、i番目の生成トークンインデックスが文書の終端を示すトークンインデックスであるか、あるいは前記変数iが所定の生成トークン数Lから1を減算したものであるかを判定する(ステップS1009)。
【0095】
該条件を満たさないと判定された場合コンテンツ生成部112は、変数iをインクリメントした上でステップS1007に戻り、同様の処理を実行する。該条件を満たしたと判定された場合、コンテンツ生成部112は、変数iのループ処理を終了し、ステップS1010に進む。
【0096】
コンテンツ生成部112は前記生成トークンインデックス列{x0, x1,・・・,xL-1}を生成テキスト1104に変換する(ステップS1010)。該変換においては、まず前記生成トークンインデックス列を構成する各トークンインデックスをトークン辞書1200のインデックス1202と突合し、合致したインデックス1202に紐付くトークン1201を取得することで生成トークン列をえる。その後、該生成トークン列を結合することで生成テキストを得る。
【0097】
このようにして、
図11Cのプロンプトテンプレート1100-3に示すような生成テキスト1104が得られる。
【0098】
次に、コンテンツ生成部112は前記生成テキストに対して後処理を行う(ステップS1011)。該後処理においては、前記生成テキストに存在する3つ以上の改行を2つの改行に変換する。なお、求められる生成テキストの状態応じて、ヒューリスティクスや機械学習に基づく任意の変換を行ってもよい。
【0099】
実施例1によれば、計算機システムは、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することができる。
【実施例0100】
図13は、実施例2のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0101】
実施例2では、計算機100は、プロンプトテンプレートデータベース113を用いずにドキュメンテーションを生成する。以下、実施例1との差異を中心に実施例2について説明する。
【0102】
実施例2の計算機システムの構成は実施例1と同一である。実施例2の計算機100のハードウェア構成は実施例1と同一である。また、実施例2の代表プログラムコード特定部110が実行する処理は実施例1と同一である。
【0103】
実施例2では、計算機100のソフトウェア構成が一部異なる。実施例3の計算機100のメモリ102には、コンテンツ生成部112を実現するプログラムに加えて、モデル学習部1301を実現するプログラムを格納する。
【0104】
モデル学習部1301は、1つ以上の選択されたファイル300を入力に、モデルの確率分布モデルの設定値(パラメータ)を計算し、モデル情報111に格納する。モデル学習部1301が行う処理を
図14、
図15A、
図15Bを使い説明する。
【0105】
モデル学習部1301は、ファイル300と、該ファイル300に対応する正解ドキュメンテーションペアのペアを1つ以上受け付ける(S1401)。
【0106】
正解ドキュメンテーションは人手で作成してもよいし、オープンソースソフトウェアとして公開されているレポジトリからreadmeファイルを抽出してもよい。
【0107】
次に、モデル学習部1301は、ファイル300と正解ドキュメンテーションペアのループ処理を開始する(ステップS1402)。
【0108】
S1002からS1006までの処理は実施例1と同様である。ただし、実施例2ではモデルの学習を行うため、実施例1のようにドキュメンテーションの生成を促すプロンプトテンプレートは必要なく、
図15Aのプロンプト1510-1に示すように代表プログラムコードプレースホルダ1102やファイルプレースホルダ1103を適当な文字列で結合し、プロンプト1510-2(
図15B参照)を作成する。
【0109】
S1403とS1404は、正解ドキュメンテーションを対象にそれぞれS1005とS1006と同様の処理を行い、正解ドキュメンテーショントークンインデックス列を得る。
【0110】
次に、モデル学習部1301は、変数iのループ処理を開始する(ステップS1405)。初期値として変数iに0を格納する。
【0111】
S1008の処理は請求項1と同様である。
【0112】
i番目における生成トークンインデックスxiの確率分布と、i番目における正解ドキュメンテーショントークンインデックスx’iの確率分布をもとに損失liを計算する。
【0113】
li=-logp(xi=x’i|θ,t0,t1,・・・tP,x0, x1,・・・,xi-1)
次に、モデル学習部1301は、i番目の正解ドキュメンテーショントークンインデックスが文書の終端を示すトークンインデックスであるかを判定する(ステップS1009)。
【0114】
該条件を満たさないと判定された場合コンテンツ生成部112は、変数iをインクリメントした上でステップS1007に戻り、同様の処理を実行する。該条件を満たしたと判定された場合、コンテンツ生成部112は、変数iのループ処理を終了し、ステップS1407に進む。
【0115】
次に、モデル学習部1301は、前記損失の和Lを計算する(ステップS1408)。
【0116】
L=Σili
次に、モデル学習部1301は、前記損失の和Lから各パラメータθk∈θに対する勾配Δkを計算し、該パラメータθkを勾配に基づき更新する(ステップS1409)。
【0117】
Δk=∂L/∂θk
θk←θk-ηΔk
次に、モデル学習部1301は、全てのファイル300と正解ドキュメンテーションペアに対してステップS1002からS1409の処理を実行したか否かを判定する(ステップS1410)。処理を実行していないファイル300と正解ドキュメンテーションペアが少なくとも一つ存在すると判定された場合、モデル学習部1301は、ステップS1002に戻り、同様の処理を実行する。
【0118】
全てのファイル300と正解ドキュメンテーションペアについて処理を実行したと判定された場合、モデル学習部1301は、ファイル300と正解ドキュメンテーションペアのループ処理を終了し、ステップS1409に進む。
【0119】
次に、モデル学習部1301は更新したパラメータθをモデル情報111に格納する(ステップS1401)。
【0120】
以上が、モデル学習部1301が実行する処理の説明である。
【0121】
上記では確率的勾配法を使ったモデルの学習を例示したが、ミニバッチ確率的勾配法を利用したり、AdamWや二次微分を用いたより洗練された最適化方法を活用してもよい。また、単語ごとの分類問題ではなく、対称学習や強化学習を用いても良い。
【0122】
実施例2におけるコンテンツ生成部112の処理は実施例1と同じである。ただし、モデル学習部1301と同様に、
図15Aに示すように代表プログラムコードプレースホルダ1102やファイルプレースホルダ1103を適当な文字列で結合し、プロンプト1510-2(
図15B)を作成する。
【0123】
実施例2によれば、計算機システムは、モデルを学習することで実施例1よりも相対的に小さいモデルを活用し効率的にドキュメンテーションを生成することができる。また、各モデルに対してプロンプトテンプレートを調整する必要がなくなり、よりロバストな生成ができる。
【実施例0124】
図16は、実施例3のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0125】
実施例3では、計算機100は、複数のドキュメンテーションの候補を生成する。以下、実施例1との差異を中心に実施例3について説明する。
【0126】
実施例3の計算機システムの構成は実施例1と同一である。実施例3の計算機100のハードウェア構成は実施例1と同一である。
【0127】
実施例3では、計算機100のソフトウェア構成が一部異なる。実施例3の計算機100のメモリ102には、入力部117及び代表プログラムコード特定部110及びコンテンツ生成部112及び出力部118を実現するプログラムに加えて、出力ランキング部1601を実現するプログラムを格納する。
【0128】
実施例3の代表プログラムコードコード特定部110を、
図2ならびに
図8を用いて説明する。
【0129】
ステップS201からS211の処理は実施例1と同様である。
【0130】
次に、代表プログラムコード特定部110は、各ファイル300のファイルスコア802が上位であるP個(P≧1)のファイル300を選択する(ステップS212)。また、複数のファイル300の選択にあたって、選択済みのファイル300とファイル内容303の類似度が高いファイル300を除外するなど、異なる観点を併用してファイル300の選択を行っても良い。なお、複数のファイル300を選択するかわりに、合計ファイルサイズが閾値を上回るまでファイル300を選択することをP回繰り返し、P組のファイル300集合を選択してもよい。複数のファイル300集合を選択した場合、各ファイル300集合ごとにファイル内容303を結合し、P個のファイル300であるかのように扱う。
【0131】
以上が、実施例3の代表プログラムコード特定部110が実行する処理の説明である。
【0132】
実施例3のコンテンツ生成部112が行う処理は実施例1と同様である。ただし、上記P個のファイル300と、Q個(Q≧1)のプロンプトテンプレート1100-1の組み合わせ(P×Q組)に対して処理を行う。なお、前記P×Q組の全組み合わせに対してコンテンツ生成部112を適用する必要はなく、例えば無作為に選択したR組(≦P×Q)に対してコンテンツ生成部112を適用しても良い。また、実施例3のコンテンツ生成部112はnucleus samplingなどを用いてK個(K≧1)のドキュメンテーション候補を生成してもよい。
【0133】
出力ランキング部1601は、前記1つ以上のドキュメンテーション候補を受け付け、ドキュメンテーションとして適切と思われる順番にドキュメンテーション候補を並び替える。出力ランキング部1601が行う処理を、
図17を用いて説明する。
【0134】
出力ランキング部1601は、1つ以上のドキュメンテーション候補を受け付ける(ステップS1701)。
【0135】
次に、出力ランキング部1601は、ドキュメンテーション候補のループ処理を開始する(ステップS1702)。
【0136】
次に、出力ランキング部1601は、選択されたドキュメンテーション候補を解析し、該ドキュメンテーション候補のカバレッジスコアscを計算する(ステップS1703)。適切なReadmeには、プロジェクトの目的とインストール情報が記載されている必要があるため、プロジェクト目的への言及として”goal”、”aim”、”objective”、”provide”のいずれかの文字列が該ドキュメンテーション候補に含まれていればsc=1、”install”、”set up”、”getting started”、”prerequisite”、”how to”のいずれかの文字列が該ドキュメンテーション候補に含まれていればsc=1、前記両方の条件が満たされていればsc=2、前記いずれの条件も満たされていればsc=0とする。
【0137】
次に、出力ランキング部1601は、選択されたドキュメンテーション候補を解析し、該ドキュメンテーション候補の冗長性スコアsrを計算する(ステップS1704)。適切なReadmeには、同じ記載が何度も繰り返されていることは望ましくないため、30文字以上同一の文字列が2つ以上ドキュメンテーション候補に含まれていればsr=-1、そうでなければsr=0とする。
【0138】
次に、出力ランキング部1601は、選択されたドキュメンテーション候補を解析し、該ドキュメンテーション候補のコンテンツ量スコアslを計算する(ステップS1705)。適切なReadmeは通常一定以上の長さとなるため、該ドキュメンテーション候補の文字数が200文字未満である場合、sl=-2、そうでなければsl=0とする。
【0139】
次に、出力ランキング部1601は、前記カバレッジスコアsc、前記冗長性スコアsr、前記コンテンツ量スコアslをもとに、選択されたドキュメンテーション候補の合計スコアsを計算する(ステップS1705)。合計スコアsは3つのスコアの単純和として計算される。
【0140】
s=sc+sr+sl
次に、出力ランキング部1601は、全てのドキュメンテーション候補について処理を実行したか否かを判定する(ステップS1707)。
【0141】
処理を実行していないドキュメンテーション候補が少なくとも一つ存在すると判定された場合、出力ランキング部1601は、ステップS1702に戻り、同様の処理を実行する。
【0142】
前記ドキュメンテーション候補について処理を実行したと判定された場合、出力ランキング部1601はドキュメンテーション候補のループ処理を終了し、ステップS1708に進む。
【0143】
次に、出力ランキング部1601は各ドキュメンテーション候補の合計スコアsが降順になるように、ドキュメンテーション候補を並び替える(ステップS1708)。なお、ドキュメンテーション候補を並び替えにあたって、選択済みのドキュメンテーション候補と内容の類似度が高いドキュメンテーション候補は削除するなど、異なる観点を併用してドキュメンテーション候補の並び替えを行っても良い。以上が、出力ランキング部1601が実行する処理の説明である。
【0144】
実施例3では3つのヒューリスティックを用いた出力ランキング部1301を説明したが、異なるヒューリスティックを用いて出力ランキング部1601を実現してもよい。また、ドキュメンテーション候補と人手で付与した該ドキュメンテーション候補の適切さスコアのペアを用い学習したランク学習器を用いても良い。
【0145】
実施例3の出力部118は、前記並び替えられた1つ以上のドキュメンテーション候補を受け付け、1つのドキュメンテーションを出力する。この際、最上位に位置付けられたドキュメンテーションを出力してもよいし、上位T個のドキュメンテーション候補をユーザに提示し、ユーザに選択を促しても良い。
【0146】
実施例3によれば、計算機システムは、実施例1よりも高い確率で適切なドキュメンテーションを生成することができる。また、各モデルに対して適切なプロンプトテンプレートを選択することになるため、プロンプトテンプレートに対するロバスト性が向上する。また、複数のドキュメンテーション候補をユーザに提示することにより、システム設計者とは異なる可能性があるユーザの嗜好をもとにドキュメンテーションを生成することができる。
【実施例0147】
図18は、実施例4のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0148】
実施例4では、計算機100は、複数回に分けドキュメンテーションを生成し、それらを集約する。以下、実施例1との差異を中心に実施例4について説明する。
【0149】
実施例4の計算機システムの構成は実施例1と同一である。実施例4の計算機100のハードウェア構成は実施例1と同一である。
【0150】
実施例4では、計算機100のソフトウェア構成が一部異なる。実施例4の計算機100のメモリ102には、入力分117及び代表プログラムコード特定部110及びコンテンツ生成部112及び出力部118を実現するプログラムに加えて、生成テキスト集約部1801を実現するプログラムを格納する。
【0151】
実施例4のコンテンツ生成部112が行う処理は実施例1と同様である。ただし、プロンプトテンプレートデータベース113が異なり、プロンプトテンプレートデータベース113は、
図19A、
図19B及び
図20に示すように、ドキュメンテーションの書き出し1901を含む1つ以上のプロンプトテンプレート1100-1を保持する。
【0152】
ドキュメンテーションの書き出し1901は、Readmeに含むべきコンテンツのタイトルである。コンテンツ生成部112は、各プロンプトテンプレート1100-1に対して、生成テキスト1104を生成する(
図20参照)。プロンプトテンプレートデータベース113には、ライセンス情報など、他のドキュメンテーションの書き出し1901を持つプロンプトテンプレート1100-1を採用してもよい。また、ユーザが所望の記載内容を、プロンプトテンプレート1100-1の選択をもとに採用してもよい(
図25参照)。
【0153】
生成テキスト集約部1801は、前記1つ以上の生成テキスト1104を組みあわせ、最終的なドキュメンテーションを作成する。
図20を参照して、生成テキスト集約部1801を説明する。生成テキスト集約部1801は前記1つ以上の生成テキスト1104を結合し、ドキュメンテーション2000を作成する。
【0154】
実施例3によれば、計算機システムは、所望するコンテンツを必ず含んだドキュメンテーションを生成することができる。
【実施例0155】
図21は、実施例5のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0156】
実施例5では、計算機100は、ユーザとの対話を通し複数回に分けドキュメンテーションを生成する。以下、実施例1との差異を中心に実施例5について説明する。
【0157】
実施例5の計算機システムの構成は実施例1と同一である。実施例5の計算機100のハードウェア構成は実施例1と同一である。
【0158】
実施例5では、計算機100のソフトウェア構成が一部異なる。実施例5の計算機100のメモリ102には、入力分117及び代表プログラムコード特定部110及びコンテンツ生成部112及び出力部118を実現するプログラムに加えて、対話的入力受付部2101を実現するプログラムを格納する。
【0159】
実施例5のコンテンツ生成部112と対話的入力受付部2101が行う処理を
図22から
図23Dまでを使い説明する。
【0160】
対話的入力受付部2101はユーザが編集したドキュメンテーション2301を受け付ける(ステップS2201)。ステップS2201が初めて実行される場合、
図23Aに示すようにドキュメンテーションの書き出しを入力することになる。
【0161】
次に、実施例5のコンテンツ生成部112は、ユーザが編集したドキュメンテーション2301をもとにドキュメンテーションを生成する(ステップS2202)。実施例5のコンテンツ生成部112が行う処理は実施例1と同様である。ただしコンテンツ生成部112は、ユーザが編集したドキュメンテーション2301をプロンプト1110―2の一部とみなし、ドキュメンテーションの残り2302を生成する(
図23B)。
【0162】
次に、対話的入力受付部2101は生成テキスト1104をユーザに提示する(ステップS2203)。
【0163】
次にコンテンツ生成部112はユーザから追加の対話を希望するかの入力を受け付ける(ステップS2204)。ユーザが追加の対話を希望しない場合は、対話的入力受付部2101は処理を終了する。ユーザが追加の対話を希望する場合、コンテンツ生成部112は、ユーザにステップS2201に戻る。
【0164】
次に、対話的入力受付部2101は、前記生成テキスト1104をもとにユーザが編集したドキュメンテーション2301を受け付ける(ステップS2201)。ステップS2201が二回目に実行される場合、例えばユーザは
図23Cに示すように前記生成テキスト1104の内容を消去したり、追記することができる。
【0165】
次に、実施例5のコンテンツ生成部112は、前記ユーザが再度編集したドキュメンテーション2301をもとにドキュメンテーションを生成する(ステップS2202)。実施例5のコンテンツ生成部112が行う処理は実施例1と同様である。ただしコンテンツ生成部112は、ユーザが編集したドキュメンテーション2301をプロンプト1110―2の一部とみなし、ドキュメンテーションの残り2302を生成する(
図23D参照)。
【0166】
以上が、実施例5のコンテンツ生成部112と対話的入力受付部2101が実行する処理の説明である。
【0167】
実施例5によれば、計算機システムは、ユーザと対話的にユーザが所望するコンテンツを含んだドキュメンテーションを生成することができる。
【実施例0168】
実施例6では、計算機100は、生成テキスト1104とともに、該生成テキスト1104を生成するのに利用したプロンプト1110―2や選択されたファイル300を提示する。
【0169】
実施例6の計算機システムの構成、計算機100のハードウェア構成、は実施例1と同一である。実施例6の計算機100のハードウェア構成、計算機100のソフトウェア構成は、実施例1と同一である。
【0170】
【0171】
実施例6の出力部(表示部)118はユーザインターフェース2300を表示する。ユーザインターフェース2300は表示ペインを切り替えるタブ2301、生成テキスト1104を表示する出力ペイン2302―1、該生成テキスト1104生成するのに利用したプロンプト1110―2を表示するプロンプトペイン2302―2、該プロンプト1110―2を作成するのに活用した選択されたファイル300を表示する代表コードペイン2302―3から構成される。なお、ユーザインターフェース2300には、各ファイル300の代表プログラムコードらしさを示す仮分類結果801など、本発明の実施過程において生成される他の中間出力を含んでいても良い。
【0172】
実施例6によれば、計算機システムは、生成されたドキュメンテーションが妥当であったか確認する術をユーザに提供することができる。
【0173】
上記実施例によれば、コードレポジトリが実施することの概要を示す代表的なコード断片を特定することで、現実的な実行時間で、大規模言語モデルで数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することができる。
【符号の説明】
【0174】
100 計算機
101 プロセッサ
102 メモリ
103 ネットワークインタフェース
110 代表プログラムコード特定部
111 モデル情報
112 コンテンツ生成部
117 入力部
118 出力部
1301 学習部
1601 出力ランキング部
1801 生成テキスト集約部
2101 対話的入力部
【手続補正書】
【提出日】2023-06-07
【手続補正1】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【手続補正2】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、テキスト生成システムに関する。
【背景技術】
【0002】
近年は、ローコード・ノーコード開発に代表されるようにソフトウェア開発の自動化の進展が著しい。一方、プログラムコードと同程度に重要な、readmeなどレポジトリ全体に関する説明テキスト(ドキュメンテーション)については、多くの開発者の悩みの種であるにもかかわらず、人手での作成に頼っているのが現状である。
【0003】
レポジトリ全体に関するドキュメンテーションの作成を支援する手段として、静的なテンプレートを開発者に提示し、ユーザの入力に基づきテンプレートを埋めるシステムが知られている。しかし、これらの手段は、あくまでもドキュメンテーション作成の要件を開発者に示すにすぎず、実際に開発者がドキュメンテーションの内容を書くことを支援できない。
【0004】
これに関連する技術として、例えば、特許文献1、非特許文献1がある。
【0005】
特許文献1は、プログラムコードから1つ以上のコードコメントを収集し、該コードコメントを結合することで、レポジトリ全体に関するドキュメンテーションを作成する方法を開示している。
【0006】
非特許文献1は、大規模言語モデルを活用することにより、クラスないしは関数のプログラムコードから該クラスないしは関数のコードコメントを生成するシステムを開示している。
【先行技術文献】
【特許文献】
【0007】
【非特許文献】
【0008】
【非特許文献1】Yue Wang, Weishi Wang, Shafiq Joty and Steven C.H. Hoi. 2021. CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code Understanding and Generation. In Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing, pp. 8696-8708. Association for Computational Linguistics.
【発明の概要】
【発明が解決しようとする課題】
【0009】
特許文献1は、開発者が記述済みのコードコメントを編纂するに過ぎず、プログラムコード自体からレポジトリ全体に関するドキュメンテーションを作成する方法を開示していない。
【0010】
非特許文献1は、クラスないしは関数のコードコメントの生成は、数十行のプログラムコードから、高々数行の具体性の高い説明テキストを生成することに過ぎない。
【0011】
その一方で、readmeに代表されるレポジトリ全体に関するドキュメンテーションの生成においては、数万から数百万行のプログラムコードを抽象的に要約して生成を行う必要があるところ、非特許文献1の計算量は入力プログラムコード長に対して二乗増加する。そのため、コードコメント生成技術をレポジトリ全体に関するドキュメンテーションの生成の問題に適用することはできない。
【0012】
本発明の目的は、テキスト生成システムにおいて、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することにある。
【課題を解決するための手段】
【0013】
本発明の一態様のテキスト生成システムは、プロセッサによりプログラムコードから前記プログラムコードの説明テキストを生成するテキスト生成システムであって、前記プログラムコードからプログラムの代表的な処理が記載されている前記プログラムコードの一部分であるプログラムコード部分を特定する代表プログラムコード特定部と、前記プログラムコード部分と、モデル情報としての少なくとも一つの設定値に基づいて、前記プログラムコードの前記説明テキストを生成するコンテンツ生成部とを有することを特徴とする。
【発明の効果】
【0014】
本発明の一態様によれば、テキスト生成システムにおいて、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することができる。
【図面の簡単な説明】
【0015】
【
図1】実施例1のテキスト生成システムの構成の一例を示す図である。
【
図1A】実施例1のテキスト生成システムの構成の一例を示す図である。
【
図2】実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
【
図3】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図4】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図5】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図6】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図7】実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
【
図8】実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【
図9】実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
【
図10】実施例1のコンテンツ生成部112が実行する処理の一例を説明するフローチャートである。
【
図12】実施例2のテキスト生成システムの構成の一例を示す図である。
【
図13】実施例2の学習部1310が実行する処理の一例を説明するフローチャートである。
【
図14A】プロンプトテンプレートの一例を示す図である。
【
図14B】プロンプトテンプレートの一例を示す図である。
【
図15】実施例3のテキスト生成システムの構成の一例を示す図である。
【
図16】実施例
3の出力ランキング部1601が実行する処理の一例を説明するフローチャートである。
【
図17】実施例4のテキスト生成システムの構成の一例を示す図である。
【
図18A】プロンプトテンプレートの一例を示す図である。
【
図18B】プロンプトテンプレートの一例を示す図である。
【
図19】プロンプトテンプレートの一例を示す図である。
【
図20】実施例5のテキスト生成システムの構成の一例を示す図である。
【
図21】実施例5の対話的入力受付部2101が実行する処理の一例を説明するフローチャートである。
【
図22A】プロンプトテンプレートの一例を示す図である。
【
図22B】プロンプトテンプレートの一例を示す図である。
【
図22C】プロンプトテンプレートの一例を示す図である。
【
図22D】プロンプトテンプレートの一例を示す図である。
【
図23A】実施例6の出力部(表示部)のユーザインターフェースに表示する内容の一例を示す図である。
【
図23B】実施例6の出力部(表示部)のユーザインターフェースに表示する内容の一例を示す図である。
【
図23C】実施例6の出力部(表示部)のユーザインターフェースに表示する内容の一例を示す図である。
【
図24】プロンプトテンプレートの一例を示す図である。
【発明を実施するための形態】
【0016】
以下、本発明の実施例を、図面を用いて説明する。ただし、本発明は以下に示す実施の形態の記載内容に限定して解釈されるものではない。本発明の思想ないし趣旨から逸脱しない範囲で、その具体的構成を変更し得ることは当業者であれば容易に理解される。
【0017】
以下に説明する発明の構成において、同一又は類似する構成又は機能には同一の符号を付し、重複する説明は省略する。
【0018】
本明細書等における「第1」、「第2」、「第3」等の表記は、構成要素を識別するために付するものであり、必ずしも、数又は順序を限定するものではない。
【0019】
図面等において示す各構成の位置、大きさ、形状、及び範囲等は、発明の理解を容易にするため、実際の位置、大きさ、形状、及び範囲等を表していない場合がある。したがって、本発明では、図面等に開示された位置、大きさ、形状、及び範囲等に限定されない。
【実施例0020】
図1、
図1Aは、実施例1のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0021】
テキスト生成システムは、プログラムコードレポジトリを入力にレポジトリ全体に関するドキュメンテーションを出力する。実施例1では、Python言語で記述されたレポジトリを入力にレポジトリ全体に関するドキュメンテーションである英文のreadmeを1つ出力する計算機システムを想定する。
【0022】
なお、対象とするプログラムコードはPython言語に限定されず、Java、Javascript、C言語、R言語、Mathematica言語、Visual Basic for Applications、HTMLなどのプログラム言語・マークアップ言語や、ユーザが構築したドメイン固有言語(DSL)、それらの組み合わせなど、1つ以上の機能を給する目的で計算機が実行することが意図されたコンピュータ言語であれば、実際にコンピュータが実行できる状態・形態であるかは問わない。
【0023】
また、出力されるドキュメンテーションは、レポジトリ全体に対して抽象的なドキュメンテーションであれば、言語を問わず、readmeだけでなく設計仕様書の一部分やユーザ文書、利用マニュアルなどであっても良い。
【0024】
テキスト生成システムは、一つの計算機100から構成される。計算機100は、プロセッサ101、メモリ102、及びネットワークインタフェース103を有する。各ハードウェアは内部バスと介して互いに接続される。計算機100は、HDD(Hard Disk Drive)及びSSD(Solid State Drive)等の記憶装置、キーボード、マウス、及びタッチパネル等の入力装置、並びに、ディスプレイ等の出力装置を有してもよい。
【0025】
プロセッサ101は、メモリ102に格納されるプログラムを実行する。プロセッサ101がプログラムにしたがって処理を実行することによって、所定の機能を有する機能部(モジュール)として動作する。以下の説明では、機能部を主語に処理を説明する場合、プロセッサ101が、当該機能部を実現するプログラムを実行していることを表す。
【0026】
メモリ102は、プロセッサ101が実行するプログラム及び当該プログラムに必要な情報を格納する。また、メモリ102は、プログラムが一時的に使用するワークエリアを含む。ネットワークインタフェース103は、ネットワークを介して他の装置と接続する。
【0027】
ここで、計算機100のメモリ102に格納されるプログラム及び情報について説明する。
【0028】
計算機100のメモリ102は、モデル情報111とプロンプトテンプレートデータベース113を保持し、また、代表プログラムコード特定部110とコンテンツ生成部112を実現するプログラムを格納する。
【0029】
代表プログラムコード特定部110は、プログラムコードの入力を受けつけ、該プログラムコードからプログラムの代表的な処理が記載されているプログラムコード断片を特定する。前記プログラムの代表的な処理とは、例えば、プログラムの抽象的な全体処理である。
【0030】
前記代表プログラムコードは、アプリケーションのエントリーポイント、ファサードデザインパターンにおけるファサード、オブジェクト指向型のライブラリにおけるベースクラスなど、様々な形態をとりうる。
【0031】
プログラムコード断片は、前記プログラムコードの一部分であるプログラムコード部分であり、ファイル、パッケージ、関数、クラス、コードブロック、ユーザーインターフェースコンポーネントなどの少なくとも1つである。実施例1では、プログラムコード断片としてファイルを採用する。
【0032】
コンテンツ生成部112は、前記プログラムコード断片を受け付け、モデル情報111に格納された少なくとも1つ以上の設定値に基づいて、前記プログラムコードの説明テキストを生成する。
【0033】
なお、計算機システムは、計算機100にデータを入力し、また、計算機100からデータを取得するための端末等を含んでもよい。計算機100が有する機能を、ネットワークを介してつながった二つ以上の計算機で実現してもよい。また、計算機100は、仮想化技術を利用して実現してもよい。
【0034】
図2から
図9を用いて、代表プログラムコード特定部110が実行する処理について説明する。
図2、
図7、及び
図9は、実施例1の代表プログラムコード特定部110が実行する処理の一例を説明するフローチャートである。
図3、
図4、
図5、
図6、及び
図8は、実施例1の代表プログラムコード特定部110が実行する処理におけるデータの入出力を説明する図である。
【0035】
まず、代表プログラムコード特定部110はプログラミング言語Pythonで記述された1つ以上のファイルから構成されるプログラムコードを受け付ける(ステップS201)。
【0036】
プログラムコードは単一のレポジトリで管理されるファイルの集合でも良いし、複数のレポジトリにまたがって管理されるファイルの集合でも良い。また、単一のレポジトリで管理されるファイルの部分集合であってもよいし、レポジトリ以外の手段で管理されるファイルの集合でもよい。
【0037】
次に、代表プログラムコード特定部110は前記プログラムコードをN個のファイル300に分割する(ステップS202)。該分割の単位はファイルでもよいし、関数・クラスなどファイル未満の単位でも良い。パッケージ等複数のファイルにまたがる単位でもよいし、パッケージと関数の組み合わせなど非排他的な単位でも良い。
【0038】
図3に示すように、ファイル300に固有のファイル識別子301、レポジトリ内におけるファイル300の格納場所であるファイルディレクトリ302、ファイルに記録されているファイル内容303を、ファイル300に格納する。
【0039】
次に、代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS203)。
【0040】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303を解析し、該ファイル内容303のプログラムコードが依存しているファイル300を特定する(ステップS204)。依存グラフ400(
図4参照)に該ターゲットファイル300から該依存先のファイル300に対して依存エッジ401を追加する。プログラムコードが依存しているファイル300を特定するには静的プログラム解析を活用してもよいし、正規表現などを活用してもよいし、動的解析や、プログラムコードをコンパイルした上でリバースエンジニアリングをしてもよい。
【0041】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303を解析し、該ファイルに含まれるクラスが継承しているクラスが含まれているファイル300を特定する(ステップS205)。継承グラフ500(
図5参照)に該ターゲットファイル300から該依存先のファイル300に対して継承エッジ501を追加する。
【0042】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300について処理を実行したか否かを判定する(ステップS206)。
【0043】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS203に戻り、同様の処理を実行する。
【0044】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、ステップS207に進む。
【0045】
次に、代表プログラムコード特定部110は、依存グラフ400から各ファイル300の依存グラフ序数602を算出する(ステップS207)。依存グラフ序数の算出S207を
図6と
図7を使い説明する。
【0046】
代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS701)。ターゲットファイル300をターゲットファイルiと呼称する。
【0047】
代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS702)。ターゲットファイル300をターゲットファイルjと呼称する。
【0048】
代表プログラムコード特定部110は、依存グラフ400におけるターゲットファイルjからターゲットファイルiへの有向グラフ上の距離(最短経路における辺数)を距離マトリクス601の(i,j)の座標に格納する(ステップS703)。ターゲットファイルjからターゲットファイルiに到達できない場合は0を格納する。
【0049】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300についてステップS703の処理を実行したか否かを判定する(ステップS704)。
【0050】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS702に戻り、同様の処理を実行する。
【0051】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、ステップS705に進む。
【0052】
代表プログラムコード特定部110は、距離マトリクス601のi列の最大値を計算し、ターゲットファイルiの依存グラフ序数602として格納する(ステップS705)。
【0053】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300についてステップS702からS705の処理を実行したか否かを判定する(ステップS706)。
【0054】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS701に戻り、同様の処理を実行する。
【0055】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、依存グラフ序数の算出S207を終了する。
【0056】
次に、代表プログラムコード特定部110は、ファイル300のループ処理を開始する(ステップS208)。
【0057】
次に、代表プログラムコード特定部110は、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801を算出する(ステップS209)。仮分類結果の算出S209を
図8と
図9を使い説明する。
【0058】
代表プログラムコード特定部110は、ターゲットファイル300の依存グラフ序数602が全ファイル300の依存グラフ序数602の最小値と同じ値である場合、ターゲットファイル300が依存グラフの最上位であると判定する(ステップS901)。依存グラフの最上位であるファイルはエントリーポイントなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,0)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,0)に「0」の値を格納する。
【0059】
次に、代表プログラムコード特定部110は、ターゲットファイル300の依存グラフ序数602が全ファイル300の依存グラフ序数602の最大値と同じ値である場合、ターゲットファイル300が依存グラフ400の最下位であると判定する(ステップS902)。
【0060】
依存グラフの最下位であるファイルは代表的かつ抽象的な処理を記述している可能性が高いエントリーポイントである可能性が低いため、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,1)に「-1」の値を、判定結果が負である場合は仮分類結果801の(i,1)に「0」の値を格納する。
【0061】
次に、代表プログラムコード特定部110は、継承グラフ500においてターゲットファイル300の入次数が3以上であるかを判定する(ステップS903)。
【0062】
あるクラスが多数のクラスから継承を受けている場合、該クラスはオブジェクト指向型のライブラリにおけるベースクラスなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,2)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,2)に「0」の値を格納する。なお、前記入次数の閾値は任意の値で良い。
【0063】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイルディレクトリ302に基づき、ターゲットファイル300のファイル名に文字列「main」が含まれるかを判定する(ステップS904)。
【0064】
あるファイルが文字列「main」を含むファイル名を持つとき、該ファイルはエントリーポイントなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,3)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,3)に「0」の値を格納する。なお、前記文字列「main」の代わりに、「cli」や「command」など任意の文字列を用いても良い。
【0065】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303に基づき、ターゲットファイル300に文字列「main」が含まれる関数が存在するかを判定する(ステップS905)。
【0066】
ある関数が文字列「main」を含むとき、該関数はエントリーポイントなどコードの代表的かつ抽象的な処理を記述している可能性が高いので、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,4)に「1」の値を、判定結果が負である場合は仮分類結果801の(i,4)に「0」の値を格納する。なお、前記文字列「main」の代わりに、「cli」など任意の文字列を用いても良い。
【0067】
次に、代表プログラムコード特定部110は、ターゲットファイル300のファイル内容303に基づき、ターゲットファイル300のファイルサイズが300バイト以下であるかを判定する(ステップS906)。あるファイルに記述されたプログラムコードが極端に短い場合、該ファイルに具体的な処理が書かれている可能性は低いため、該判定結果が真である場合、ターゲットファイル300の代表プログラムコードらしさを示す仮分類結果801の(i,5)に「-1」の値を、判定結果が負である場合は仮分類結果801の(i,5)に「0」の値を格納する。なお、前記閾値は300バイト以外の任意の値でもよく、前記判定対象はユニコード文字数など他の指標であっても良い。
【0068】
次に、代表プログラムコード特定部110は、仮分類結果の算出S209を終了する。
【0069】
次に、代表プログラムコード特定部110は、前記プログラムコードに含まれる全てのファイル300についてステップS209の処理を実行したか否かを判定する(ステップS210)。
【0070】
処理を実行していないファイル300が少なくとも一つ存在すると判定された場合、代表プログラムコード特定部110は、ステップS208に戻り、同様の処理を実行する。
【0071】
前記プログラムコードに含まれる全てのファイル300について処理を実行したと判定された場合、代表プログラムコード特定部110は、ファイル300のループ処理を終了し、ステップS211に進む。
【0072】
次に、代表プログラムコード特定部110は、仮分類結果801をファイルごとに加算することで、ターゲットファイル300の代表プログラムコードらしさを示すファイルスコア802を算出する(ステップS211)。なお、仮分類結果801の統合には重み付け和や、投票など任意の統合方法を用いても良い。また、ファイルスコア802を擬似正解データとみなし仮分類結果801乃至はファイル内容303を特徴量としたファイルスコア802予測器を作成し、該予測器を用いファイルスコア802を計算しなおす弱教師付き学習を利用してもよい。
【0073】
次に、代表プログラムコード特定部110は、各ファイル300のファイルスコア802が最大なるファイル300を選択する(ステップS212)。なお、各ファイル300のファイルスコア802順に合計ファイルサイズが閾値を上回るまでファイル300を選択するなど、2つ以上のファイル300を選択してもよい。
【0074】
また、2つ以上のファイル300の選択にあたって、選択済みのファイル300とファイル内容303の類似度が高いファイル300を除外するなど、異なる観点を併用してファイル300の選択を行っても良い。実施例1において複数のファイル300を選択した場合、それらのファイル内容303を結合し、1つのファイル300であるかのように扱う。
【0075】
実施例1では6個の弱分類器を使う方法を説明したが、任意の数の弱分類器を用いても良い。また、利用する弱分類器は上記で開示内容に限定されず、「引数解析器を含むか」、「MVCモデルにおけるコントローラに相当する処理か」、「ファイル名が「test_」から始まらないか」、「バージョン管理のソフトウェア上で初期に登録されたファイルか」、「特定のユーザによって作成されたファイルか」など、プログラミング言語依存の処理、アプリケーション形態依存の処理、メタ情報依存の処理を含む多用な処理を含んで良い。また、ファイル内容303に依存せず、ユーザによる指定を受け付けても良い。
【0076】
以上が、代表プログラムコード特定部110が実行する処理の説明である。
【0077】
コンテンツ生成部112は、モデル情報111、プロンプトテンプレートデータベース113、及び選択されたファイル300を入力にreadmeを生成する。
図10から図
11を使いコンテンツ生成部112の処理を説明する。
【0078】
コンテンツ生成部112は、選択されたファイル300の入力を受け付ける(ステップS1001)。
【0079】
次に、コンテンツ生成部112は、前記ファイル300の前処理を行う(ステップS1002)。該前処理においては、各ファイル300のファイル内容303からコードレポジトリの抽象的な処理を把握するには不要と思われるインポート文やファイル先頭のライセンス表示などを正規表現で除去の上、各ファイル300のファイル内容303を結合する。なお、該前処理においては重複する記述の除去や、ヒューリスティクスに基づく重要箇所の特定などを行っても良い。
【0080】
次に、コンテンツ生成部112は、前記結合したファイル内容303を所定の閾値Kに基づき前方K文字の代表プログラムコード文字列に短縮する(ステップS1003)。なお、前方K文字以外を除去するかわりに、後方K文字以外を除去したり、前方K/2文字と後方K/2文字以外を除去するなど、任意の短縮方法をとっても良い。また、閾値Kは所望の計算時間にあわせて任意の値を指定して良い。
【0081】
次に、コンテンツ生成部112は、前記代表プログラムコード文字列とプロンプトテンプレート113から取得した
プロンプトテンプレート(例えば、図18Aのプロンプトテンプレート1100-1)を組み合わせることで
プロンプトを作成する(ステップS1004)。
【0082】
例えば、図18Aに示すように、プロンプトテンプレート1100-1は、自然言語でドキュメンテーションの生成を促すプロンプトテキスト1101、代表プログラムコードプレースホルダ1102、ファイルプレースホルダ1103から構成される。コンテンツ生成部112は、前記代表プログラムコード文字列を代表プログラムコードプレースホルダ1102に格納し、レポジトリ内から無作為に抽出したファイル300のファイルディレクトリ302からファイル名を抽出し、該ファイル名を結合した上でファイルプレースホルダ1103に格納する。
【0083】
プロンプトテンプレート1100-1は、代表プログラムコードを活用しドキュメンテーションを生成することが志向されていれば、プロンプトテキスト1101、代表プログラムコードプレースホルダ1102、及びファイルプレースホルダ1103の構成を取る必要はなく、レポジトリ名やユーザ名、ライセンス情報など様々な情報を含みうる。また、それらの情報は対話的質問や設定ファイルなどを通し、ユーザから別途入力を受け付けてもよい(図24参照)。
【0084】
次に、コンテンツ生成部112は、前記プロンプトを1つ以上のトークンから構成されるプロンプトトークン列に分割する(ステップS1005)。「トークン」は一般的には変数名、予約語、演算子などプログラミング言語を構成する最小単位を意味するが、本発明においてはバイトペアエンコーディングなどプログラミング言語における「トークン」とは異なる単位で分割を行っても良い。
【0085】
次に、コンテンツ生成部112は、前記プロンプトトークン列をトークン辞書1200(図11参照)を使い、P個の整数からなるプロンプトトークンインデックス列{t0,t1,・・・tP}に変換する(ステップS1006)。該変換は、前記プロンプトトークン列を構成する各トークンをトークン辞書1200のトークン1201と突合し、合致したトークン1201に紐付くインデックス1202を取得することによって実現される。なお、前記トークンに合致するトークン1201が存在しない場合、該トークンは所定のインデックス1202を紐つける。
【0086】
次に、コンテンツ生成部112は、変数iのループ処理を開始する(ステップS1007)。初期値として変数iに0を格納する。
GPT-3などトークンインデックス列に対する確率分布モデルを用いて、プロンプトトークンインデックス列と、生成済みの(i-1)番目までの生成トークンインデックス列を入力に、i番目における生成トークンインデックスxiの確率分布を計算する。
【0087】
p(xi|θ,t0,t1,・・・tP,x0,x1,・・・,xi-1)
ただし、θはモデル情報111に格納された確率分布モデルの設定値(パラメータ)である。
【0088】
確率値が最大なる生成トークンインデックスをi番目の生成トークンインデックスとして取得する。
【0089】
argmaxxi p(xi|t0,t1,・・・tP,x0, x1,・・・,xi-1)
なお、確率値が最大なるトークンインデックスを選択するかわりに、確率分布をもとにサンプリングを行ったり、beam searchなどを用いてトークンインデックスを選択しても良い。また、前記確率分布モデルはT5やBLOOMなどTransformerアーキテクチャに基づくモデルや、ELMoなどの再帰的計算に基づくモデル、GShardなど分散計算に基づくモデルで実現されてもよい。
【0090】
前記確率分布モデルは様々な文書を利用して単語の確率分布を学習したモデル、それらと同一のアーキテクチャを持つモデルを独自のコーパスで学習したモデル、それらのモデルをでもよい。入力トークンインデックス列をもとに入力トークンインデックスを生成できるのであれば、確率分布の要件を満たさなくても良い。
【0091】
次に、コンテンツ生成部112は、i番目の生成トークンインデックスが文書の終端を示すトークンインデックスであるか、あるいは前記変数iが所定の生成トークン数Lから1を減算したものであるかを判定する(ステップS1009)。
【0092】
該条件を満たさないと判定された場合コンテンツ生成部112は、変数iをインクリメントした上でステップS1007に戻り、同様の処理を実行する。該条件を満たしたと判定された場合、コンテンツ生成部112は、変数iのループ処理を終了し、ステップS1010に進む。
【0093】
コンテンツ生成部112は前記生成トークンインデックス列{x0, x1,・・・,xL-1}を生成テキスト1104に変換する(ステップS1010)。該変換においては、まず前記生成トークンインデックス列を構成する各トークンインデックスをトークン辞書1200のインデックス1202と突合し、合致したインデックス1202に紐付くトークン1201を取得することで生成トークン列をえる。その後、該生成トークン列を結合することで生成テキストを得る。
【0094】
このようにして、例えば、図19のプロンプトテンプレート1100-3に示すような生成テキスト1104が得られる。
【0095】
次に、コンテンツ生成部112は前記生成テキストに対して後処理を行う(ステップS1011)。該後処理においては、前記生成テキストに存在する3つ以上の改行を2つの改行に変換する。なお、求められる生成テキストの状態応じて、ヒューリスティクスや機械学習に基づく任意の変換を行ってもよい。
【0096】
実施例1によれば、計算機システムは、数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することができる。
【実施例0097】
図12は、実施例2のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0098】
実施例2では、計算機100は、プロンプトテンプレートデータベース113を用いずにドキュメンテーションを生成する。以下、実施例1との差異を中心に実施例2について説明する。
【0099】
実施例2の計算機システムの構成は実施例1と同一である。実施例2の計算機100のハードウェア構成は実施例1と同一である。また、実施例2の代表プログラムコード特定部110が実行する処理は実施例1と同一である。
【0100】
実施例2では、計算機100のソフトウェア構成が一部異なる。実施例3の計算機100のメモリ102には、コンテンツ生成部112を実現するプログラムに加えて、モデル学習部1301を実現するプログラムを格納する。
【0101】
モデル学習部1301は、1つ以上の選択されたファイル300を入力に、モデルの確率分布モデルの設定値(パラメータ)を計算し、モデル情報111に格納する。モデル学習部1301が行う処理を図13、図14A、図14Bを使い説明する。
【0102】
モデル学習部1301は、ファイル300と、該ファイル300に対応する正解ドキュメンテーションペアのペアを1つ以上受け付ける(S1401)。
【0103】
正解ドキュメンテーションは人手で作成してもよいし、オープンソースソフトウェアとして公開されているレポジトリからreadmeファイルを抽出してもよい。
【0104】
次に、モデル学習部1301は、ファイル300と正解ドキュメンテーションペアのループ処理を開始する(ステップS1402)。
【0105】
S1002からS1006までの処理は実施例1と同様である。ただし、実施例2ではモデルの学習を行うため、実施例1のようにドキュメンテーションの生成を促すプロンプトテンプレートは必要なく、図14Aのプロンプト1510-1に示すように代表プログラムコードプレースホルダ1102やファイルプレースホルダ1103を適当な文字列で結合し、プロンプト1510-2(図14B参照)を作成する。
【0106】
S1403とS1404は、正解ドキュメンテーションを対象にそれぞれS1005とS1006と同様の処理を行い、正解ドキュメンテーショントークンインデックス列を得る。
【0107】
次に、モデル学習部1301は、変数iのループ処理を開始する(ステップS1405)。初期値として変数iに0を格納する。
【0108】
S1008の処理は請求項1と同様である。
【0109】
i番目における生成トークンインデックスxiの確率分布と、i番目における正解ドキュメンテーショントークンインデックスx’iの確率分布をもとに損失liを計算する。
【0110】
li=-logp(xi=x’i|θ,t0,t1,・・・tP,x0, x1,・・・,xi-1)
次に、モデル学習部1301は、i番目の正解ドキュメンテーショントークンインデックスが文書の終端を示すトークンインデックスであるかを判定する(ステップS1009)。
【0111】
該条件を満たさないと判定された場合コンテンツ生成部112は、変数iをインクリメントした上でステップS1007に戻り、同様の処理を実行する。該条件を満たしたと判定された場合、コンテンツ生成部112は、変数iのループ処理を終了し、ステップS1407に進む。
【0112】
次に、モデル学習部1301は、前記損失の和Lを計算する(ステップS1408)。
【0113】
L=Σili
次に、モデル学習部1301は、前記損失の和Lから各パラメータθk∈θに対する勾配Δkを計算し、該パラメータθkを勾配に基づき更新する(ステップS1409)。
【0114】
Δk=∂L/∂θk
θk←θk-ηΔk
次に、モデル学習部1301は、全てのファイル300と正解ドキュメンテーションペアに対してステップS1002からS1409の処理を実行したか否かを判定する(ステップS1410)。処理を実行していないファイル300と正解ドキュメンテーションペアが少なくとも一つ存在すると判定された場合、モデル学習部1301は、ステップS1002に戻り、同様の処理を実行する。
【0115】
全てのファイル300と正解ドキュメンテーションペアについて処理を実行したと判定された場合、モデル学習部1301は、ファイル300と正解ドキュメンテーションペアのループ処理を終了し、ステップS1409に進む。
【0116】
次に、モデル学習部1301は更新したパラメータθをモデル情報111に格納する(ステップS1401)。
【0117】
以上が、モデル学習部1301が実行する処理の説明である。
【0118】
上記では確率的勾配法を使ったモデルの学習を例示したが、ミニバッチ確率的勾配法を利用したり、AdamWや二次微分を用いたより洗練された最適化方法を活用してもよい。また、単語ごとの分類問題ではなく、対称学習や強化学習を用いても良い。
【0119】
実施例2におけるコンテンツ生成部112の処理は実施例1と同じである。ただし、モデル学習部1301と同様に、図14Aに示すように代表プログラムコードプレースホルダ1102やファイルプレースホルダ1103を適当な文字列で結合し、プロンプト1510-2(図14B)を作成する。
【0120】
実施例2によれば、計算機システムは、モデルを学習することで実施例1よりも相対的に小さいモデルを活用し効率的にドキュメンテーションを生成することができる。また、各モデルに対してプロンプトテンプレートを調整する必要がなくなり、よりロバストな生成ができる。
【実施例0121】
図15は、実施例3のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0122】
実施例3では、計算機100は、複数のドキュメンテーションの候補を生成する。以下、実施例1との差異を中心に実施例3について説明する。
【0123】
実施例3の計算機システムの構成は実施例1と同一である。実施例3の計算機100のハードウェア構成は実施例1と同一である。
【0124】
実施例3では、計算機100のソフトウェア構成が一部異なる。実施例3の計算機100のメモリ102には、入力部117及び代表プログラムコード特定部110及びコンテンツ生成部112及び出力部118を実現するプログラムに加えて、出力ランキング部1601を実現するプログラムを格納する。
【0125】
実施例3の代表プログラムコードコード特定部110を、
図2ならびに
図8を用いて説明する。
【0126】
ステップS201からS211の処理は実施例1と同様である。
【0127】
次に、代表プログラムコード特定部110は、各ファイル300のファイルスコア802が上位であるP個(P≧1)のファイル300を選択する(ステップS212)。また、複数のファイル300の選択にあたって、選択済みのファイル300とファイル内容303の類似度が高いファイル300を除外するなど、異なる観点を併用してファイル300の選択を行っても良い。なお、複数のファイル300を選択するかわりに、合計ファイルサイズが閾値を上回るまでファイル300を選択することをP回繰り返し、P組のファイル300集合を選択してもよい。複数のファイル300集合を選択した場合、各ファイル300集合ごとにファイル内容303を結合し、P個のファイル300であるかのように扱う。
【0128】
以上が、実施例3の代表プログラムコード特定部110が実行する処理の説明である。
【0129】
実施例3のコンテンツ生成部112が行う処理は実施例1と同様である。ただし、上記P個のファイル300と、Q個(Q≧1)のプロンプトテンプレート1100-1の組み合わせ(P×Q組)に対して処理を行う。なお、前記P×Q組の全組み合わせに対してコンテンツ生成部112を適用する必要はなく、例えば無作為に選択したR組(≦P×Q)に対してコンテンツ生成部112を適用しても良い。また、実施例3のコンテンツ生成部112はnucleus samplingなどを用いてK個(K≧1)のドキュメンテーション候補を生成してもよい。
【0130】
出力ランキング部1601は、前記1つ以上のドキュメンテーション候補を受け付け、ドキュメンテーションとして適切と思われる順番にドキュメンテーション候補を並び替える。出力ランキング部1601が行う処理を、図16を用いて説明する。
【0131】
出力ランキング部1601は、1つ以上のドキュメンテーション候補を受け付ける(ステップS1701)。
【0132】
次に、出力ランキング部1601は、ドキュメンテーション候補のループ処理を開始する(ステップS1702)。
【0133】
次に、出力ランキング部1601は、選択されたドキュメンテーション候補を解析し、該ドキュメンテーション候補のカバレッジスコアscを計算する(ステップS1703)。適切なReadmeには、プロジェクトの目的とインストール情報が記載されている必要があるため、プロジェクト目的への言及として”goal”、”aim”、”objective”、”provide”のいずれかの文字列が該ドキュメンテーション候補に含まれていればsc=1、”install”、”set up”、”getting started”、”prerequisite”、”how to”のいずれかの文字列が該ドキュメンテーション候補に含まれていればsc=1、前記両方の条件が満たされていればsc=2、前記いずれの条件も満たされていればsc=0とする。
【0134】
次に、出力ランキング部1601は、選択されたドキュメンテーション候補を解析し、該ドキュメンテーション候補の冗長性スコアsrを計算する(ステップS1704)。適切なReadmeには、同じ記載が何度も繰り返されていることは望ましくないため、30文字以上同一の文字列が2つ以上ドキュメンテーション候補に含まれていればsr=-1、そうでなければsr=0とする。
【0135】
次に、出力ランキング部1601は、選択されたドキュメンテーション候補を解析し、該ドキュメンテーション候補のコンテンツ量スコアslを計算する(ステップS1705)。適切なReadmeは通常一定以上の長さとなるため、該ドキュメンテーション候補の文字数が200文字未満である場合、sl=-2、そうでなければsl=0とする。
【0136】
次に、出力ランキング部1601は、前記カバレッジスコアsc、前記冗長性スコアsr、前記コンテンツ量スコアslをもとに、選択されたドキュメンテーション候補の合計スコアsを計算する(ステップS1705)。合計スコアsは3つのスコアの単純和として計算される。
【0137】
s=sc+sr+sl
次に、出力ランキング部1601は、全てのドキュメンテーション候補について処理を実行したか否かを判定する(ステップS1707)。
【0138】
処理を実行していないドキュメンテーション候補が少なくとも一つ存在すると判定された場合、出力ランキング部1601は、ステップS1702に戻り、同様の処理を実行する。
【0139】
前記ドキュメンテーション候補について処理を実行したと判定された場合、出力ランキング部1601はドキュメンテーション候補のループ処理を終了し、ステップS1708に進む。
【0140】
次に、出力ランキング部1601は各ドキュメンテーション候補の合計スコアsが降順になるように、ドキュメンテーション候補を並び替える(ステップS1708)。なお、ドキュメンテーション候補を並び替えにあたって、選択済みのドキュメンテーション候補と内容の類似度が高いドキュメンテーション候補は削除するなど、異なる観点を併用してドキュメンテーション候補の並び替えを行っても良い。以上が、出力ランキング部1601が実行する処理の説明である。
【0141】
実施例3では3つのヒューリスティックを用いた出力ランキング部1301を説明したが、異なるヒューリスティックを用いて出力ランキング部1601を実現してもよい。また、ドキュメンテーション候補と人手で付与した該ドキュメンテーション候補の適切さスコアのペアを用い学習したランク学習器を用いても良い。
【0142】
実施例3の出力部118は、前記並び替えられた1つ以上のドキュメンテーション候補を受け付け、1つのドキュメンテーションを出力する。この際、最上位に位置付けられたドキュメンテーションを出力してもよいし、上位T個のドキュメンテーション候補をユーザに提示し、ユーザに選択を促しても良い。
【0143】
実施例3によれば、計算機システムは、実施例1よりも高い確率で適切なドキュメンテーションを生成することができる。また、各モデルに対して適切なプロンプトテンプレートを選択することになるため、プロンプトテンプレートに対するロバスト性が向上する。また、複数のドキュメンテーション候補をユーザに提示することにより、システム設計者とは異なる可能性があるユーザの嗜好をもとにドキュメンテーションを生成することができる。
【実施例0144】
図17は、実施例4のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0145】
実施例4では、計算機100は、複数回に分けドキュメンテーションを生成し、それらを集約する。以下、実施例1との差異を中心に実施例4について説明する。
【0146】
実施例4の計算機システムの構成は実施例1と同一である。実施例4の計算機100のハードウェア構成は実施例1と同一である。
【0147】
実施例4では、計算機100のソフトウェア構成が一部異なる。実施例4の計算機100のメモリ102には、入力分117及び代表プログラムコード特定部110及びコンテンツ生成部112及び出力部118を実現するプログラムに加えて、生成テキスト集約部1801を実現するプログラムを格納する。
【0148】
実施例4のコンテンツ生成部112が行う処理は実施例1と同様である。ただし、プロンプトテンプレートデータベース113が異なり、プロンプトテンプレートデータベース113は、図18A、図18B及び図19に示すように、ドキュメンテーションの書き出し1901を含む1つ以上のプロンプトテンプレート1100-1を保持する。
【0149】
ドキュメンテーションの書き出し1901は、Readmeに含むべきコンテンツのタイトルである。コンテンツ生成部112は、各プロンプトテンプレート1100-1に対して、生成テキスト1104を生成する(図19参照)。プロンプトテンプレートデータベース113には、ライセンス情報など、他のドキュメンテーションの書き出し1901を持つプロンプトテンプレート1100-1を採用してもよい。また、ユーザが所望の記載内容を、プロンプトテンプレート1100-1の選択をもとに採用してもよい(図24参照)。
【0150】
生成テキスト集約部1801は、前記1つ以上の生成テキスト1104を組みあわせ、最終的なドキュメンテーションを作成する。 図19を参照して、生成テキスト集約部1801を説明する。生成テキスト集約部1801は前記1つ以上の生成テキスト1104を結合し、ドキュメンテーション2000を作成する。
【0151】
実施例3によれば、計算機システムは、所望するコンテンツを必ず含んだドキュメンテーションを生成することができる。
【実施例0152】
図20は、実施例5のテキスト生成システム(計算機システム)の構成の一例を示す図である。
【0153】
実施例5では、計算機100は、ユーザとの対話を通し複数回に分けドキュメンテーションを生成する。以下、実施例1との差異を中心に実施例5について説明する。
【0154】
実施例5の計算機システムの構成は実施例1と同一である。実施例5の計算機100のハードウェア構成は実施例1と同一である。
【0155】
実施例5では、計算機100のソフトウェア構成が一部異なる。実施例5の計算機100のメモリ102には、入力分117及び代表プログラムコード特定部110及びコンテンツ生成部112及び出力部118を実現するプログラムに加えて、対話的入力受付部2101を実現するプログラムを格納する。
【0156】
実施例5のコンテンツ生成部112と対話的入力受付部2101が行う処理を図21から図22Dまでを使い説明する。
【0157】
対話的入力受付部2101はユーザが編集したドキュメンテーション2301を受け付ける(ステップS2201)。ステップS2201が初めて実行される場合、図22Aに示すようにドキュメンテーションの書き出しを入力することになる。
【0158】
次に、実施例5のコンテンツ生成部112は、ユーザが編集したドキュメンテーション2301をもとにドキュメンテーションを生成する(ステップS2202)。実施例5のコンテンツ生成部112が行う処理は実施例1と同様である。ただしコンテンツ生成部112は、ユーザが編集したドキュメンテーション2301をプロンプト1110―2の一部とみなし、ドキュメンテーションの残り2302を生成する(図22B)。
【0159】
次に、対話的入力受付部2101は生成テキスト1104をユーザに提示する(ステップS2203)。
【0160】
次にコンテンツ生成部112はユーザから追加の対話を希望するかの入力を受け付ける(ステップS2204)。ユーザが追加の対話を希望しない場合は、対話的入力受付部2101は処理を終了する。ユーザが追加の対話を希望する場合、コンテンツ生成部112は、ユーザにステップS2201に戻る。
【0161】
次に、対話的入力受付部2101は、前記生成テキスト1104をもとにユーザが編集したドキュメンテーション2301を受け付ける(ステップS2201)。ステップS2201が二回目に実行される場合、例えばユーザは図22Cに示すように前記生成テキスト1104の内容を消去したり、追記することができる。
【0162】
次に、実施例5のコンテンツ生成部112は、前記ユーザが再度編集したドキュメンテーション2301をもとにドキュメンテーションを生成する(ステップS2202)。実施例5のコンテンツ生成部112が行う処理は実施例1と同様である。ただしコンテンツ生成部112は、ユーザが編集したドキュメンテーション2301をプロンプトの一部とみなし、ドキュメンテーションの残り2302を生成する(図22D参照)。
【0163】
以上が、実施例5のコンテンツ生成部112と対話的入力受付部2101が実行する処理の説明である。
【0164】
実施例5によれば、計算機システムは、ユーザと対話的にユーザが所望するコンテンツを含んだドキュメンテーションを生成することができる。
【実施例0165】
実施例6では、計算機100は、生成テキスト1104とともに、該生成テキスト1104を生成するのに利用したプロンプト1110―2や選択されたファイル300を提示する。
【0166】
実施例6の計算機システムの構成、計算機100のハードウェア構成、は実施例1と同一である。実施例6の計算機100のハードウェア構成、計算機100のソフトウェア構成は、実施例1と同一である。
【0167】
実施例6の出力部(表示部)118(
図1参照)を、図
23A~図
23Cを用いて説明する。
【0168】
実施例6の出力部(表示部)118はユーザインターフェース2300を表示する。ユーザインターフェース2300は表示ペインを切り替えるタブ2301、生成テキスト1104を表示する出力ペイン2302―1、該生成テキスト1104生成するのに利用したプロンプトを表示するプロンプトペイン2302―2、該プロンプトを作成するのに活用した選択されたファイル300を表示する代表コードペイン2302―3から構成される。なお、ユーザインターフェース2300には、各ファイル300の代表プログラムコードらしさを示す仮分類結果801など、本発明の実施過程において生成される他の中間出力を含んでいても良い。
【0169】
実施例6によれば、計算機システムは、生成されたドキュメンテーションが妥当であったか確認する術をユーザに提供することができる。
【0170】
上記実施例によれば、コードレポジトリが実施することの概要を示す代表的なコード断片を特定することで、現実的な実行時間で、大規模言語モデルで数万から数百万行のプログラムコードを抽象的に要約してレポジトリ全体に関するドキュメンテーションを生成することができる。
【符号の説明】
【0171】
100 計算機
101 プロセッサ
102 メモリ
103 ネットワークインタフェース
110 代表プログラムコード特定部
111 モデル情報
112 コンテンツ生成部
117 入力部
118 出力部
1301 学習部
1601 出力ランキング部
1801 生成テキスト集約部
2101 対話的入力部
32