Lucene (パッケージ org.tartarus.snowball.ext) のこれらのステマーを比較した人はいますか: EnglishStemmer、PorterStemmer、LovinsStemmer? それらの背後にあるアルゴリズムの長所/短所は何ですか? それぞれをいつ使用する必要がありますか?あるいは、英単語のステミングに利用できるアルゴリズムが他にもあるのではないでしょうか?
ありがとう。
Lovins ステマーは非常に古いアルゴリズムであり、Porter ステマーがはるかに強力であるため、あまり実用的ではありません。ソースコードのいくつかの簡単なスキミングに基づいて、PorterStemmer
Porter の元の (1980 年) アルゴリズムをEnglishStemmer
実装しているように見えますが、更新されたバージョンを実装しているため、より優れているはずです。
スタンフォード NLP ツールでは、より強力なステミング アルゴリズム (実際にはレンマタイザー) を使用できます。真のブリッジによる Lucene-Stanford NLP は、こちら( API ドキュメント) から入手できます。
ステミングと見出し語化に関する一般的な情報については、Manning、Raghavan、Schützeも参照してください。
バージョン 4.4.0から利用可能な 3 つの Lucene ステマーorg.apache.lucene.analysis.en
をテストしました。これらはEnglishMinimalStemFilter
、KStemFilter
およびPorterStemFilter
であり、私が取り組んでいるドキュメント分類の問題です。私の結果は、 Introduction to Information Retrievalの著者による、文書分類設定における小さなトレーニング コーパスのステミングは有害であり、大きなコーパスのステミングは違いがないという主張を裏付けるものです。
検索とインデックス作成では、ステミングの方が便利な場合があります (たとえば、Jenkins & Smithを参照)。 フリーランチはありません!
結局のところ、実際のデータに対する実際のコードの経験的テストに勝るものはありません。どちらが優れているかを本当に知る唯一の方法は、アプリケーションでステマーを自分で実行することです。