Lucene Snowball Analyzer を使用してステミングを実行します。結果は意味のある言葉ではありません。この質問を参照しました。
解決策の 1 つは、単語の語幹バージョンと単語の 1 つの安定したバージョンとの間のマップを含むデータベースを使用することです。(communiti から community への例。communti のベースが何であれ(communities / または他の単語))
そのような機能を実行するデータベースがあるかどうか知りたいです。
Lucene Snowball Analyzer を使用してステミングを実行します。結果は意味のある言葉ではありません。この質問を参照しました。
解決策の 1 つは、単語の語幹バージョンと単語の 1 つの安定したバージョンとの間のマップを含むデータベースを使用することです。(communiti から community への例。communti のベースが何であれ(communities / または他の単語))
そのような機能を実行するデータベースがあるかどうか知りたいです。
1 つのステムが多くの単語に共通する可能性があるため、ステムから特定の単語を復元することは理論的に不可能です。アプリケーションによっては、それぞれが複数の単語の配列にマップされた語幹のデータベースを構築することが 1 つの可能性です。ただし、再変換する語幹を考慮して、これらの単語のどれが適切かを予測する必要があります。
この問題に対する非常に単純な解決策として、単語タグを知っている場合は、単語をタグ付きでデータベースに保存してみてください。
run:
NN: runner
VBG: running
VBZ: runs
次に、語幹「run」とタグ「NN」が与えられた場合、その文脈では「runner」が最も可能性の高い単語であると判断できます。もちろん、その解決策は完璧にはほど遠いものです。特に、同じ単語形式が異なるコンテキストで異なるタグ付けされる可能性があるという事実を処理する必要があります。ただし、この問題を解決しようとしても、せいぜい概算にすぎないことを忘れないでください。
編集: 以下のコメントから、ステミングの代わりにレンマタイゼーションを使用したいようです。Stanford Core NLP toolsを使用して単語の見出し語を取得する方法は次のとおりです。
import java.util.*;
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.ling.CoreAnnotations.*;
Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma");
pipeline = new StanfordCoreNLP(props, false);
String text = "Hello, world!";
Annotation document = pipeline.process(text);
for(CoreMap sentence: document.get(SentencesAnnotation.class)) {
for(CoreLabel token: sentence.get(TokensAnnotation.class)) {
String word = token.get(TextAnnotation.class);
String lemma = token.get(LemmaAnnotation.class);
}
}
参照している質問には、見落とされがちな重要な情報が含まれています。必要なものは「レンマ化」として知られています。これは、語形変化した単語を標準形に縮小することです。これは関連性がありますが、ステミングとは異なり、未解決の研究課題です。より複雑な形態の言語では特に困難です(英語はそれほど難しくありません)。ウィキペディアには、試すことができるソフトウェアのリストがあります。私が使用したもう1つのツールはTreeTaggerです。これは非常に高速で適度に正確ですが、主な目的は品詞のタグ付けであり、レンマ化は単なるボーナスです。「統計的レンマ化」をグーグルで試してみてください(そうです、私は統計的NLPとルールベースのNLPについて強い感情を持っています)
NCI Metathesaurusを見るかもしれません。ほとんどが生物医学的な性質のものですが、自然言語処理の例と、コードを参照することで役立つ Java 用のオープンソース ツールセットがいくつか提供されています。