【Python】Pygments を使ったソースコードの分かち書き用ツールの作成

Pygments を使用して、ソースコードを分かち書きする Python のコードを作成しました。

多分ソースコードの静的解析を行う際に、もし自然言語処理的なことをする際に前処理として役に立つと思います。
(大したコードではないけど)

Pygments とは

Pygments はソースコードをシンタックスハイライトするためのライブラリです。

シンタックスハイライトさせた HTML を出力させてブログとかウェブサイト上にはっつけて利用するのが一般的なのかな。

Pygments については公式ドキュメントが一番役に立ちます。
https://pygments.org/

pip で入れられます。https://pygments.org/download/

用途

自然言語処理的なことするためには 日本語だと mecab とか使って品詞ごとに分かち書きにする必要があります。

ソースコードも同様に構文の種類毎に分類してあげると解析しやすくなったりします(多分)

ソースコード版の mecab だと思ってくださいな。

ソースコード

ソース全文は Githubよりどうぞ:https://github.com/KanoeGitHub/Source-Code-Segmentation

分かち書きの方法(何で区切るか等)は色々あるのであくまで一例として参考に。

流れとしては
・ソースコードファイルのパスを取得
・拡張子名から対応する字句解析器(Lexer)を選択
・wakachi/wakachi_”言語名”.txt として書き出す
って感じです。

字句解析されると各種のtokenに分類されます。
どのtokenにどの字句が入るかは公式ドキュメント参照(https://pygments.org/docs/tokens/?highlight=token#module-pygments.token
下のコードはとりあえずソースコードの解析に必要のなさそうな、コメントアウト等を省いてるモノです。
elif 部分は一つにまとめてもいいと思います。(見にくいので二つに分けたけど、怒られそう)
そして解析対象の字句についてはファイルに 字句+空白 を書き込みます。(所謂分かち書き)
改行文字が来ると分かち書きファイルも改行してあげます。

for idx, token_type, token_string in token_it:
if re.match(r".*\n$",token_string):
writeFile.write(" \n")
elif token_type in Token.Literal or token_type in Token.Comment or token_type in Token.Text :
continue
elif token_type in Token.Error or token_type in Token.Other or token_type in Token.Generic:
continue
else:
writeFile.write(token_string + ' ')

もし特定の言語だけでいいなら下の部分についてカスタマイズすればOKです。
必要なければコメントアウトにしてください。

###特定の言語を指定したい場合(To specify a specific language)###
if lexer.name != "Python":
continue
######

とりあえず自分用に作ってあるので、適宜カスタムしてください。笑