
スクリプトなので特別なことは必要ない。入手先については CGI について述べたページのこちらを参照のこと。
モジュール化した方が使い勝手はよくなると思う。しかしながら著作権については GPL 準拠とのことなので、以下の利用例ではそのまま改変しないで使うことを前提にした方法を記す。
宣言は必要ない。
### 英語で Lemmatizer を使う場合
system ("perl lemma.pl < ../files/$FORM{'text'} > out.txt");
open (TEXT, "./out.txt");
while(<TEXT>){
chomp;
push(@words, $_);
}
close(TEXT);
$FORM{'text'}にはテキストファイル名が入る。system 関数を介して lemma.pl を実行している。処理結果としては対象テキストに含まれる表層形の語を原形(レンマ)化して一行一単語の out.txt というファイルが出来上がる。このときピリオドなどは除かれる。
例示したスクリプトでは、このファイルを TEXT というファイルハンドルを介して一行ずつ改行コードを削除しながら読み込み、 @words という配列の要素として順に押し込んでいっている。
レマタイザは辞書を読み込んでレンマ化する作業をしている。辞書では表層形が変化するもの(動詞や a などの冠詞、複数形がある名詞等々)を左端から原形、表層形候補の順で一行ずつ記してある。たとえば辞書の冒頭は以下の通りである。
a an
Aaron
A-bomb A-bombs
abacus abacuses
abandon abandons abandoning abandoned
abase abases abasing abased
abate abates abating abated
abbess abbesses
abbey abbeys
Aaron はアロンまたはアーロンで人名である。このように辞書(の左端)に記載があれば小文字化されて aaron と変えられてしまうことはない。分析結果を作表したときに人名や固有名の先頭が小文字化されているのは見栄えが悪いので、なんらかの仕方で固有名を判別して小文字化を回避するスクリプトを作るか、辞書に記載する固有名を充実させる必要がある。
とりあえずは後者が簡単に思えるのだが、今度は別の問題が生じる。たとえば上に引用した中にある A-bomb は分析結果としては2種類の語( A-bomb と a-bomb)として出力される。つまり A-bombs は A-bomb ではなく a-bomb に原形化されてしまうのである。これはおそらく作者が意図した動作ではない。なぜならこの仕様では出現数の計数作業で大きな不具合を起こしてしまうからである。複数形を原形化してまとめて数えるはずが結局別々に数えてしまうのでは意味がない。
この他、たとえば coming が coming のまま出力される問題などもある。これは辞書の中で comings の単数形としての coming が定義されているために come に関して定義された coming が無視されてしまっているのだと思われる。これも作者の意図とは違う動作の疑いがある。辞書での記述は以下の通り。
come comes coming came
(略)
coming comings
どのようなサーバ環境でも簡便に原形化が行なえるというのは非常に便利であるので、この(おそらくは)bug をなんとか解決する必要がある。
固有名詞などのレンマ化失敗と coming が come にならない等々の問題については一応対処できたように思える。前者については辞書から見出し語を抜き出してハッシュの value とする部分のスクリプトを若干書き換え、後者については辞書内の記載位置を変えることで改善できた。このとき lemma.pl を序でにモジュール化してみたので上記リンク先ではその件について記している。
Copyright(c)2005-2012 ccoe@mac.com Allrights reserved.