KG4Py: Python コードのナレッジ グラフとセマンティック検索のためのツールキット

Python コードのナレッジ マップを作成する方法と検索方法は?

現在のプロジェクト プログラム、特にソフトウェア開発では、繰り返しコードの断片が多数あります。この論文では、GitHub リポジトリ内の Python ファイルのナレッジ グラフを生成し、そのナレッジ グラフをセマンティック検索に使用するためのツールキット (KG4Py) を提案します。KG4Py では、317,000 の Python ファイル間の重複をすべて削除し、具体的な構文ツリー (CST) を使用して Python 関数のコード ナレッジ グラフを構築することで、これらのファイルの静的コード分析を実行します。事前トレーニングされたモデルと教師なしモデルを統合して新しいモデルを生成し、新しいモデルをコード ナレッジ グラフと組み合わせて、自然言語記述を含むコード スニペットの検索を容易にします。実験結果は、KG4Py がコード知識グラフの構築とコードフラグメントのセマンティック検索の両方で優れたパフォーマンスを達成することを示しています。

01  はじめに

ソフトウェアの再利用性 (ソフトウェアの再利用性) は、ソフトウェア エンジニアリングの重要な部分です。ソフトウェアの再利用は、ソフトウェア開発における作業の重複を減らすだけでなく、プロジェクト開発の品質も向上します (Wang et al., 2019)。ソフトウェアの再利用の核心は、コードの断片を繰り返し利用することであり、コード検索はこの問題を解決するだけです。従来のコード検索は主にキーワードに基づいており、検索文の意味情報を深く掘り下げることができませんでした。現在、GitHub でのコード スニペットの検索はキーワード検索に限定されています。これは、ユーザーが探しているコード スニペットに関連するキーワードを予測できることに基づいて行われます。ただし、このアプローチは移植性と解釈性が低く、コード フラグメントに対してセマンティック検索を実行できません。これらの理由から、私たちはコード セマンティック検索で直面するさまざまな課題に対処するためにナレッジ グラフを導入しようとしています。

ナレッジ グラフ (KG) は、2012 年に Google によって正式に導入されました。これは、物理世界の象徴的な表現、現実世界のエンティティ (人、物体、概念) を説明するグラフ、およびエンティティと関係によって接続されたネットワークのような知識ベースです。 。近年、Freebase (Kurt et al.、2008)、YAGO (Manu et al.、2012)、Wikidata (Denny & Markus、2014)、OpenKG (Chen et al.、2014) など、多くの異なるナレッジ グラフが確立されています。 、2021)。これらのナレッジ グラフは、検索エンジン (Zhao et al., 2021)、レコメンダー システム (Arul & Razia, 2021; Xie et al., 2021; Yu et al., 2020)、インテリジェントシステムなど、さまざまな分野の人々に利便性をもたらしてきました。質問応答(Zhang et al.、2018)および意思決定分析(Hao et al.、2021; Joiao et al.、2020)。

これらのナレッジ グラフに触発されて、研究者はソフトウェア エンジニアリングでナレッジ グラフを構築する方法を考えます。コードのビッグデータはナレッジ グラフ構築のためのデータ ソースを提供し、深層学習ベースの手法は自動ナレッジ グラフ構築を支援します (Wang et al., 2020a)。

過去数年間でオー​​プン ソース ソフトウェアが成長するにつれて、GitHub、Gitlab、Bitbucket などの主要なコード ホスティング プラットフォームに登場するソフトウェア プロジェクトがますます増えています。これらのソースコード、API、ドキュメントなどを活用するために、研究者はソフトウェア分野でさまざまなナレッジグラフを構築してきました。Meng et al. (2017) は、自動分析のために Android アプリケーションのナレッジ グラフを構築しました。Wang et al. (2020b) は、Wikipedia 分類法を使用してソフトウェア開発ナレッジ グラフを構築しています。これらのナレッジ グラフに触発されて、私たちは Python 関数のナレッジ グラフを作成する方法を考えました。

ナレッジ グラフ検索システムの場合、必要なものに関する隠された情報をさらに掘り出すことができます。Wang et al. (2019) は、プロジェクト内の自然言語クエリ用のナレッジ グラフ ベースのインターフェイスを提案および実装しました。ナレッジ ベースからメタモデルを抽出し、質問に関連した推論サブグラフを構築し、自然言語の質問を構造化されたクエリ文に自動的に変換して、関連する回答を返します。これは、コードのセマンティック検索にインスピレーションを与えるものでもあります。

グラフ データベースの選択に関して、ナレッジ グラフは通常、Neo4j、GraphDB、およびその他のグラフ データベースを使用してデータを保存し、特定のステートメントを使用してデータを取得します。このペーパーでは、データの保存に Neo4j を選択しました。これは、Neo4j が豊富なセマンティック マークアップ記述をサポートし、データの読み取りと書き込みが高速で、読み取り可能なクエリ ステートメントがあり、半構造化データの表現も簡単であるためです。これにより、コード ナレッジ グラフとコード セマンティック検索を構築できるようになります。

KG4Py: Python コード ナレッジ マップおよびセマンティック検索ツールキットPython コード ナレッジ マップを作成する方法と検索方法は? https://mp.weixin.qq.com/s?__biz=MzUyMDc5OTU5NA==&mid=2247500976&idx=2&sn=c3fd09b482fe541e8c93d1b8ef5b3bed&chksm=f9e650b5ce91d9a3e0bb7312eed6feadeceb8949e7 8 6c13f59326805373ac324c7c9078250c2&token=1811512605&lang=zh_CN#rd

02  モデル紹介

2.1 コードナレッジグラフの構築

コードナレッジマップを構築する前に、Python ファイルのコードを分析する必要があります。コードを解析するには、抽象構文ツリー (AST) の代わりに LibCST1 (Python 用の具象構文ツリー パーサーおよびシリアライザー ライブラリ) を使用します。AST は元のコードのセマンティクスをうまく保持しており、ツリー構造は比較的単純です。ただし、コードのセマンティクスの多くは理解して抽出することが困難です。AST のみが利用可能な場合、元のソース コードを再出力することはできません。JPEG と同様に、AST は非可逆性があり、残された注釈情報をキャプチャできません。具象構文ツリー (CST) は、正確な入力コードを再出力するのに十分な情報を保持しますが、複雑な操作を実装するのは困難です。LibCST は、上記の 2 つの形式を折衷したものです。AST と同様に、LibCST はソース コードをコード フラグメントのセマンティクスを表すノードに解析します。CST と同様に、LibCST はすべてのアノテーション情報を保存し、正確に再出力できます。AST、CST、LibCST 間のコード解析の違いを図 1 に示します。

図 1 AST、CST、LibCST のコード解析の違い

LibCST を使用して Python ファイルの静的コード分析を実行し、各ファイル内の「インポート」、「クラス」、「関数」を特定します。各関数について、そのパラメーター、変数、戻り値を識別する必要もあります。検索結果をより正確にするために、codeT5 (Wang et al., 2021) モデルを使用して、テキストの概要 (Fang et al., 2020; Lin et al., 2022) に似た各関数の説明を生成します。最後に、それらを JSON 形式のファイルに保存します。私たちのパイプラインを図 2 に示します。

図 2 静的コード分析と関数の概要パイプライン

処理された JSON 形式ファイルから関連するエンティティと属性を抽出し、それらを使用してコード ナレッジ グラフを構築します。

2.2 ナレッジマップに基づく検索システム

2.2.1 モデル内のセマンティック検索

従来の検索エンジンはキーワードを一致させることによってのみ回答を取得しますが、セマンティック検索システムは文をセグメント化して理解することによって回答を取得します。セマンティック検索の前に、データベース内の質問と回答がベクトル空間に埋め込まれます。検索中に、セグメント化および解析された質問を同じベクトル空間に埋め込み、ベクトル間の類似性を計算して、類似性の高い回答を明らかにします。次に、セマンティック検索モデルの選択を紹介します。

研究者たちは、単一の文を BERT にフィードし始め (Devlin et al., 2018)、固定サイズの文の埋め込みを導き出しました。Bert モデルは、すべての主要な自然言語処理 (NLP) タスクにおいて優れた能力を示しています。意味的類似性計算のタスクでも例外ではありません。しかし、BERT モデルでは、意味的類似性を計算する際、情報の相互作用のために 2 つの文を同時にモデルに入力する必要があり、計算コストが大きくなります。

したがって、図 3 に示すように、Sentence-BERT (Reimers & Gurevych、2019) モデルを選択して微調整し、コード セマンティック検索を実行します。簡単に言うと、ツイン ネットワーク モデルのフレームワークを利用し、異なる文を 2 つの BERT モデルに入力して (ただし、2 つの BERT モデルはパラメータを共有しており、同じ BERT モデルとして理解することもできます)、各文の文表現ベクトルを取得します。 、取得された最終文表現ベクトルは、意味的類似性の計算または教師なしクラスタリング タスクに使用できます。同じ 10,000 文の場合、最も類似した文ペアを見つけるには 10,000 回計算するだけで済みます。完全に計算するには約 5 秒かかりますが、BERT には約 65 時間かかります。

図 3 文-BERT モデル

2.2.2 セマンティック検索モデルのエンコーダ

BERT モデルを通じて文内のすべての単語ベクトルを最大化する最大値プーリング戦略 (最大値プーリング戦略) を使用します。最大ベクトルが文全体の文ベクトルとして使用されます。

クロスエンコーダーの場合、十分な注意を払って質問と回答を結び付けるため、デュアルエンコーダーよりも正確になります。クロスエンコーダーは各質問と回答の間のコンテキストを計算するのに多くの時間がかかりますが、デュアルエンコーダーは個別にエンコードすることで時間を大幅に節約します。また、質問と回答の数が多い場合、クロスエンコーダーは圧縮されません。したがって、クエリステートメントを解析するためにこれを使用します。クロスエンコーダの構造を図 4 に示します。

図4 クロスエンコーダの構造

デュアル エンコーダーを使用して、入力ラベルと候補ラベルに対して個別にセルフ アテンションを実行し、それらを密なベクトル空間にマッピングし、最後にそれらを結合して最終的な表現を取得します。バイエンコーダーは、エンコードされた候補にインデックスを付け、入力ごとにこれらの表現を比較できるため、予測時間が短縮されます。時間は 65 時間 (クロスエンコーダー使用) から約 5 秒に短縮されました。したがって、教師なしアプローチと組み合わせて、ラベルなしの質問と回答のペアをトレーニングします。Bi-encoder の構造を図 5 に示します。

図5 バイエンコーダの構造

2.2.3 エンコーダの分配

非対称意味検索などの回帰タスクの場合、文の埋め込み u、v および対応する文のペアのコサイン類似度を計算し、それらにトレーニング可能な重みを乗算します。目的関数として平均二乗誤差 (MSE) 損失を使用します。

非対称セマンティック検索では、ユーザーはいくつかのキーワードや質問などのクエリを提供しますが、回答を提供する長いテキストの一節を取得したいと考えます (Do & Nguyen、2021)。したがって、教師なし学習手法を使用して、自然言語記述を使用したコード スニペットの検索など、非対称のセマンティック検索タスクを解決します。これらの方法に共通するのは、ラベル付きトレーニング データを必要としないことです。代わりに、テキスト自体から意味的に意味のある文の埋め込みを学習できます。クロスエンコーダーは、自然言語記述の少数のセットを再配置する場合にのみ適しています。大規模なコレクションから適切な自然言語記述を取得するには、デュアル エンコーダーを使用する必要があります。これらのクエリと説明は、同じベクトル空間内の固定サイズの埋め込みとして独立してエンコードされます。次に、ベクトル間の距離を計算することで、関連する自然言語記述を見つけることができます。したがって、デュアルエンコーダーと教師なしアプローチを組み合わせて、ラベルなしコード検索の領域でタスクをトレーニングし、クロスエンコーダーを使用してユーザー入力を受け取り、質問と自然言語記述の間のコサイン類似度を計算します。

03  実験結果

図6 コードナレッジマップの部分表示
図7 検索モデルのフローチャート
図8 ナレッジマップの検索結果

表 1 検索結果とモデルに費やした時間 (一部)

04  まとめ

この論文の主な作業は、Python 関数に関するナレッジ グラフを構築することにより、コード スニペットのセマンティック検索を実行することです。コード分​​析段階で、GitHub 内で繰り返されるコードの断片が多数発見されました。これはリソースの無駄を引き起こすだけでなく、ソフトウェア会社の開発コストの増加にもつながりました。これらの問題は当社のツールキットで簡単に解決できます。当社のツールキットの産業上の価値は次の 2 つの部分に分けられます。

  1. 個人の開発者にとって、当社のツールキットはコードの検索に使用できるだけでなく、コード ナレッジ グラフを通じてコード スニペットの理解を深めることもできます。

  2. ソフトウェア会社の場合、当社のツールキットを使用すると、関数アノテーションのセマンティクスを理解することでエンタープライズ コードベースで類似のコード スニペットを検索し、存在する場合は開発者に推奨できます。これにより、開発者の重複作業が削減されるだけでなく、ソフトウェア会社の開発コストも削減されます。

将来的には、関数のデータフローと制御フローをコードナレッジグラフに統合し、ユーザーが関数をより深く理解できるようにします。セマンティック検索については、質問の検索と照合の速度にまだ改善の余地があります。これらの問題を詳しく掘り下げて、クエリの解析を容易にし、検索モデルの取得時間を短縮することを目指します。

素晴らしいお勧め

  1. ナレッジグラフの質問回答に関する調査

  2. 172 件の論文 | COLING 2022 Proceedings

  3. CCKS2022 - 「ナレッジグラフ開発レポート (2022)」

  4. 融合グラフアテンションメカニズムと事前学習済み言語モデルによる共通知識ベースの完成

  5. COLING 2022 | キャラクター認識のための進歩的な噂差別フレームワーク

  6. COLING 2022 | 少数ショットのテキスト分類のための勾配類似度ベースの適応メタ学習アプローチ

おすすめ

転載: blog.csdn.net/weixin_40359938/article/details/128424131