理系学生日記

おまえはいつまで学生気分なのか

論文ファイルから文例をぶっこ抜く

Acrobatというのはすごいソフトです

論文てやつはだいたいpdfファイルで配布されている。で、Acrobatとかには検索機能がついていて、さらにその検索機能はディレクトリ内全てのpdfファイルを検索対象にできたりして、すごく高性能なかんじです。さすが世界に名前がとどろくソフトウェアはちがうなぁと、ぼくはすごく感心してしまった。

ところが

英文を書いてると、他の論文ではどうやって書いてるのかなーという興味がわくことがよくある。あわよくば表現を「お借りしたいなー」という熱い思いもわいてきたりする。でもそういうときにAcrobatの検索機能はあまり使えないのです!!イケてない!!なにがイケてないかというと

  • たくさんの論文pdfファイルが山ほどあると、すごく時間がかかる。
  • 検索結果をクリックするたびに、でしゃばりなAcrobatが起動するので、処理が重くなる。

ぼくは頭にキてしまったよ。

pdftotextを教わる

前にコイさんからpdftotext (ref: Projects | bluem.net)ていうのがあるのを教えてもらった。これはものすごいソフトで、pdfからテキストを抜き取ってくれる。テキストデータというのはものすげー扱いやすくて、とりあえず全部のpdfファイルをこれ使ってテキスト形式に変換してやったら、とても軽くなるし、grepで検索かければいいので検索効率がチョーよくなった。キリがいいので100倍くらい良くなったことにするけど、そういうわけで、ぼくはプログラム作者とコイさんにものすごく感謝しています。

だがだが

grepというプログラムはテキストデータを行単位で扱うのだけれど、pdftotextが出力するテキストデータは、段落だとかそんな感じを1行に出力してくる。そうなると、grepで1行をぶっこ抜いてもその1行が超ながくなるので、いったいその行のどこにマッチしたのかがわからない。何とかしたいなーと思っていた。

すると

こんなモジュール(Text::Sentence - module for splitting text into sentences - metacpan.org)をみつけてしまったよ!


このモジュールの中のsplit_sentencesというルーチンは、引数で渡された文字列を文に区切ってくれるというお茶目なヤツです。

使い方

使い方はチョー簡単で、こんなプログラムをかく。短いのでワンライナーでもいいけど、ちょっと使いにくかった。

#!/opt/local/bin/perl
use Text::Sentence 'split_sentences';
print join "\n", split_sentences( $_ ) while (<>);

このプログラムをbukkonukiとかいう名前だとすると、例えばcontrol mechanismを検索するとして、

$ bukkonuki *.txt|grep "control mechanism"|less

とかやればcontrol mechanismを含む"文"を表示してくれて、ぼくはとてもよい論文を書くことができますね(そしてrejectされる->ref:査読結果返ってきたよ\(^o^)/ - 理系学生日記)。正規表現とかはもちろん使える(grepがw)ので、みなさんステキな論文がかけますね!