インドネシア語の Stemmer を使う例
qalam-git/Test3.java でpenghuninya
を与えると、接頭語と接尾語が取れてhuni
になる。ちなみに、元論文にも書いてあるけれど、接頭語や接尾語をどの程度取るかにはレベルがあって、この場合は品詞の変化もかまわず省いている。住んでいるという状態(huni
)に英語でいう-er
であるpeng-
(その行為を行う人)が頭について、あとは定冠詞的な役割かなにかの-nya
がつく(-nya
には7種類の役割があるからどれかは分かってない。参考:今から一緒にインドネシア語しようよ!! - Yahoo!ブログ)。あと、マレー、インドネシア研究の専門家に聞いたところ、マレーシア語も Stemming は変わらない。ただし、それは現代インドネシア語、現代マレーシア語の場合なので50年ほど遡ったりすると異なってくるとのことです。
Lucene 自体は Apache Lucene から入手。 英語版は Test2.java にあります。qalam-git/src at trunk · cm3/qalam-git
参考:
- IndonesianStemmer (Lucene 5.1.0 API) なぜかこのクラスは Stem 後の語幹の長さを返すメソッドしかない。(Test1.java)
- A Study of Stemming Effects on Information Retrieval in Bahasa Indonesia 上のドキュメントにも書いてある手法の元論文。
- IndonesianAnalyzer (Lucene 5.1.0 API)
- EnglishAnalyzer (Lucene 5.1.0 API) Analyzer は各言語同様に使えるので便利。
- Stemming English words with Lucene - codeitive.com
- josm-plugins/TextualFeatures.java at master · openstreetmap/josm-plugins · GitHub
- Welcome to Lucene Tutorial.com - Lucene Tutorial.com 分かり易そうなサイトだなと思ったけれど、Luceneはバージョンが違うと構成がかなりちがうので役に立たないことが多い。
環境について
Docker で Solr 動かしているとこで lucene 使った スクリプトを GitHub 経由で動かしている。バージョン管理は fossil scm を使っているけれど、それを GitHub にあげるために、gitに移行してからpushするという少々面倒なことをしている。まあ、ダブルクリック一つでできるようにスクリプト書いているんだけど。
どうせ後で Dockerfile ともども Github に置くんだから、Github 経由でファイルやりとりすればいい。細かい編集くらいはコンソール上で行わないと、git の履歴が汚くなるけれど。あと、巨大になりがちなデータファイルや公開できないファイルは、サンプルだけGitHubにおいて、全体は他のサーバからダウンロードして使えとドキュメンテーションだけしておいて、手元のサーバではそれらのファイルをあるディレクトリに入れて、空の.gitkeep使って、それをgitで管理しないようにする。
from Solrの設定 - Drafts
Windows 側でのコンパイルと実行
Javaは久しぶりに書いたけれど、Eclipseが無いと辛いのでローカルで書いてサーバにスクリプトをコピーして使っている。
ずっと、throws してるはずなのに、throws しろって言われてて、理由がわからなかったんだけど、Eclipse なら、こうやって推薦してくれる。ParseException
じゃなくて、org.apache.lucene.queryparser.classic.ParseException
って書かないとだめだった。
luceneのjarは Lucene eclipse tutorial for beginners: Tutorial - Working with lucene and eclipseにあるように、プロジェクトのプロパティからJava Build Path
の追加という形で追加する。
- \queryparser\lucene-queryparser-4.4.0.jar
- \analysis\common\lucene-analyzers-common-4.4.0.jar
- \core\lucene-core-4.4.0.jar
Linux側でのコンパイルと実行
classpath によって、lucene の jar を読み込む。
$ javac -classpath "/opt/mytest/lucene-5.1.0/lucene-analyzers-common-5.1.0.jar" Test.java $ java -classpath .:/opt/mytest/lucene-5.1.0/lucene-analyzers-common-5.1.0.jar Test "penghuninya" 4
ワイルドカードも使えるので、読み込む jar が複数になってきたら、ワイルドカードを使う。
$ java -classpath .:/opt/mytest/lucene-5.1.0/* Test "penghuninya" 4
複数列挙するときの区切り文字は:
なので注意(Windows上でやるときは;
)
小ネタ