言語処理学会 第25回年次大会 発表論文集 (2019年3月)

Web サイト上の Python ソースコードと説明文の自動対応付けによるソースコード検索
柴 友行

酒井 浩之

脊戸 和寿

成蹊大学 理工学部 情報科学科

us152059@cc.seikei.ac.jp, {h-sakai,seto}@st.seikei.ac.jp

1

はじめに度でソースコード同士の対応付けに成功しているが，アルゴリズム名や動作文での検索はできない．後者の研究

インターネットの Web サイト上にプログラムソース

ではソースコードの出力はできるもののプログラミングコードは多く存在しており，自由に閲覧ができる. プロ

構文との相違点が存在したり，複数行の実用的なソースグラミング学習において自分でソースコードを記述するコードの出力ができないといった問題点が存在する. ま際，インターネット上のプログラムソースコードを参考た数学的記事を取り扱う wikipedia のページから数式とにして学習する場面は多くある. 多くの人が学生時代， その名前，説明文を抽出する研究も存在する [3]. この研
プログラミングの課題を google 検索を用いて似たよう

究では math タグの中が数式であるという法則性があるなソースコードがないか探した経験はあるのではないだが，本研究はある特定のタグにソースコードが記述されろうか. しかし検索結果の上位の Web サイトに必ずしているといった法則性が存在しないためソースコードのも望んだプログラムがあるとは限らない. なぜならば， そうでない英文とを判別する手法から考案する必要があgoogle 検索など従来の検索エンジンではプログラムの る. 本研究ではインターネット上の Python のプログラ
ソースコードの直接的な検索は現状不可能なためであ ミング Web サイトからソースコードとその説明文の対る. 直接的な検索結果としてソースコードが出力されず， 応を獲得，アルゴリズム名などの固有名詞と簡単な処理目的のソースコードを得るためには検索結果のページ群 内容文でのソースコードの検索を行う手法を提案する.
を探索する必要がある. 学習したいアルゴリズム名などで検索し，検索したアルゴリズムに対応したソースコー
Python プログラムソースコード
ドを表示できるようになれば，プログラミング学習にお 2いて検索結果から参考にしたいソースコードを探索するの抽出手間が省けるので，学習の効率化が可能になる. そこで
本章では，インターネット上の Web サイト (約 24GB
本研究ではプログラミング言語として Python を対象と分) から Python ソースコードを抽出する手法についてし，検索要求のアルゴリズム名や，動作などの説明文と説明する.Web ページ上からソースコードを抽出するイ収集した Web サイト内のソースコード説明文との対応メージを図 1 に示す.
を取り，ソースコードを検索する手法の開発を行った.
関連研究として TF-IDF 法を用いて一対のソースコード同士の対応を取る手法や，統計的機械翻訳を用いて一 2.1 ソースコードの判別行の自然言語からの一行のソースコードを生成する研プログラムのソースコードには，インデントに使用す究が現在までに行われている [1], [2]. 前者の研究では るタブ文字，スペースや改行，括弧やカンマなどの特殊本研究と同様，プログラミング言語で用いられる予約語 記号 (HTML 内で利用されている記号も例外ではない)，をソースコードの同士の対応付けに利用し非常に高い精 プログラム言語側から既に指定されている予約語が多く― 85 ―

Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.

含まれる. そのため，HTML 内の BODY タグに直接記∑|words|述してしまうと HTML 本体の記述形式と重複し，Webページそのものや記述したソースコードが意図しない表

reservedRate(words) =示をしてしまう可能性が非常に高い. しかし HTML 側から用意されている整形済みテキストタグ (以下 pre タグ) 内に記述することで，ソースコードを記述したそのi=0reserved(words(i))|words|(1)• words : pre タグ内の文字列に含まれる単語の総集合• reserved : 与えられた単語が予約語なら 1，そうでままの形式で Web ページに表示することが可能になる.

なければ 0 を返す関数

そのため，ソースコードを抽出する際には HTML 全文を検索するより pre タグ内の文字列のみに絞った方が効率的に実行できる. しかし pre タグ内には通常の英文なども記述される場合があるため，それらとソースコードを判別しなければならない. 本手法ではソースコードを判別するためにプログラム言語で予め指定されている予約語を文字列内から検索し，その含有率が大きければソースコードであると判断する. 以下に通常の英文とソースコードでの予約語含有率例を示す. pre タグ内文
字列の分析にはオープンソースソフトウェアの nltk を利用した．

• ソースコードの判別例


def foo ( x ) :if x >= 0 :return math. sqrt ( x )else :
return Nonedef bar ( x ) :if x < 0 :return None
return math. sqrt ( x )含有率 : 9/39 ≒ 0.23

上記の例ではソースコードの予約語含有率が通常の英文

図 1: ソースコードの抽出例の予約語含有率を上回っている.
ソースコード内には，プログラミング言語の仕様上プログラムソースコード内の全ての単語が予約語である

これを予約語と呼わけでは無いが，一定の割合は必ず含まれている. そこぶ.(Python においては，and, break, continue, else,

で予約語含有率が一定の閾値以上を示した pre タグ内文

for, if, print 等. 全 31 語.) 文字列内の予約語含有率

字列をソースコードと判断する. 本研究では閾値を「0.1(reservedRate(words)) を以下のように定義する.

以上」に設定したところ，ソースコードが最も多く抽出特別な意味を持つ語が存在する.

できた. また人手にて判別した結果と比較し，約 8 割の精度を得た. 以下に条件分岐に関して記述された Web
サイトから抽出できたソースコードの例を示す.

― 86 ―

Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.

def if_test(num):

3. 各ベクトルと検索文ベクトルとの Cosin 距離を計算

if num > 100:

して値が 0 以上ならば Cosin 距離，ソースコード，p タグを一つのオブジェクトとして保存

print(’100 < num’)
elif num > 50:

4. 全ページを走査後 4 で保存したオブジェクトを Cosin

print(’50 < num <= 100’)

距離順に並び替え，上位のオブジェクトを表示

elif num > 0:
print(’0 < num <= 50’)
elif num == 0:5

print(’num == 0’)

評価
作成した検索システムを用いてアルゴリズム名を検索語，もしくはプログラム動作を説明する文を検索文と3説明文記述部分の選定とソースして複数検索し，本手法によりそれぞれ対応するソースコードとの対応付けコードが上位 n 件以内に出るか判定する. また本手法の有効性を確立するため，ベースラインとして本研究で評プログラムの説明文と対応するソースコードは同じ価したものと同じ検索語や検索文と内部の平文がフレー
Web ページ上に記述されていることが殆どである. 前章 ズ一致した HTML を出力，目的のソースコードが出力で提案した手法を用いてソースコードと判断した pre タ 出来るかも判定した. アルゴリズム名での検索結果では，グ内文字列が記述されている HTML 内の p タグを説明

全 15 件中 12 件検索語に対応するソースコードが出力さ文として対応付けた. 以下に抽出出来た説明文とソースれている. 対して，プログラム動作を説明する検索文でコードの例を示す. ※なお，深層学習による説明文の抽の検索結果では， 全 11 件中 5 件検索文に対応するソー出を試みたが、大量の学習データの作成が困難でありうスコードが出力されている. またベースラインに関してまくいかなかった．

はアルゴリズム名での検索では全 15 件中 3 件，プログラム動作を説明する検索文では全 11 件中 1 件対応する・説明文ソースコードが出力されている．表 1，表 2 より本手法繰り返しやループですね.の精度がベースラインの精度を大きく上回っていること

・ソースコード

for var in [’Python’, ’javascript’, ’Rudy’]:print(var)4が分かり，本手法が有効であることを示すことができた.
以下に実装した検索システムでの検索例を示す. 表 1，表2 に結果の一部を示す．


検索文：「リストの最大値を求める」

ソースコードの検索
本節では，前節までに説明した手法で構成されたプ

最大値を探すアルゴリズムとほとんど同じです.

ログラムソースコード検索システムについて記述する.

==========================================

Python のプログラム Web サイトを検索した結果から無math_max_student = taro

作為に HTML を 24GB 分収集したものを検索対象デー

for student in [taro, jiro, saburo]:if(math_max_student.math < student.math):

タ群とした.

math_max_student = student
1. 検索文を入力，形態素解析して TF-IDF 値を要素値とした文ベクトルを形成

print(math_max_student.name)

2. 全検索対象ページを走査してプログラムソースコードが存在するページ内の全 p タグ内の平文をベクト# jiroル化― 87 ―

Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.

のライブラリとして既に実装されている為実装の必要性
表 1: アルゴリズム名での検索評価結果 (一部)がなく Web 上に掲載されていない，対象のソースコー

検索語

n=1

n=3

n=5

ベースライン

クイックソート○／／○

ドが検索対象の HTML タグ内に記述されていなかった，二分木○／／×などである. 検索対象のデータ範囲を抽出した Web 上の最大値○／／×

ヒープソート×ーー○HTML だけでなくインターネット上の検索エンジンと二分探索○／／×併用したり，検索対象の HTML タグを pre タグのみで双方向リスト○／／×はなく他の HTML タグも含めることで検索精度が向上する可能性がある．しかし検索対象のデータ範囲や検索表 2: プログラム動作を説明する文での検索評価結果

対象の HTML タグ範囲を拡大すると検索にかかるコス(一部)

トも増大する為，実用的な検索システムに落としこむた

6

検索文

n=1

n=3

n=5

ベースライン

リストの最大値を求める○／／

×

リストの合計を求める○／／×値の足し算をする○／／

×

条件分岐する○／／×素数を求める○／／○

めに検索対象の絞り込みなど手法の改善が必要になる．

まとめ

7

本稿では Python を対象として予約語を用いたソースコードの抽出とそれに対応する説明文の抽出，および対考察応付けによる検索システムの構築を行った．ソースコー

ある特定のアルゴリズムであれば本研究の手法を用いドの抽出において，予約語の含有率を計算することによて検索しソースコードとの関連付けが可能であることがりソースコードとそれ以外の文との判別を行った．評価判明した. その過程において，予約語をある程度含んでの結果，ソースコードの判別を行わず，単純なフレーズいればソースコードである確率が高いことを示した. し一致を比較対象とした場合に比べて大幅に精度が向上

かし検索結果の説明文やソースコードが想定されるものした．と一致しなかった検索語，検索結果そのものが出力されなかった検索語が存在した. 例えば，前者は以下のような場合である.

参考文献[1] 山中 裕樹, 崔 恩瀞, 吉田 則裕, 井上 克郎: 情報検検索文：「根号の計算をする」

索技術に基づく高速な関数クローン検出．情報処理

検索結果 :学会論文誌, Vol.55, No.10, 2014.

2 つの計算もできるのです.

[2] 札場 寛之, 小田 悠介, Graham Neubig, 吉野 幸一-> 0.9342122497731796==========================================郎, 中村 哲: 統計的機械翻訳を用いた自然言語からprint((1+2+3)*4-5)のソースコード生成．言語処理学会第 22 回年次大会発表論文集, 2016.

rate : 0.14285714285714285[3]

Minh Nghiem Quoc, Keisuke Yokoi , Yuichiroh

この検索結果の説明文は「計算」という名詞が含まれてMatsubayashi, and Akiko Aizawa: Mining coref-いるために上位に出力されたと考えられる. 検索結果のerence relations between formulas and text using

説明文に誤った文が挙がったため，追随して検索結果のWikipedia. Proceedings of Second Workshop on

ソースコードも誤ったものが挙がってしまった. 本手法

NLP Challenges in the Information Explosion Era

では名詞のみで関連度を計算しているため，同じ名詞を(NLPIX 2010), pages 69-74, Beijing, August 2010

用いた文同士であれば関連度が高くなってしまう.
後者の原因として考えられるのは，収集した検索対象デー
タ群内に対象のソースコードが存在しなかった，Python― 88 ―

Copyright(C) 2019 The Association for Natural Language Processing.
All Rights Reserved.