0

私は現在、Mahout クラスター プロジェクトのカスタム アナライザーに取り組んでいます。Mahout 0.8 で Lucene が 4.3 に更新されたため、トークン化されたドキュメント ファイル、または本の古いサンプルから SequenceFile を生成するのに問題があります。次のコードは、書籍『Mahout in Action』のサンプル コードを私が修正したものです。ただし、それは私に illegalstateexception を与えます。

public class MyAnalyzer extends Analyzer {

private final Pattern alphabets = Pattern.compile("[a-z]+");
Version version = Version.LUCENE_43;

@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new StandardTokenizer(version, reader);
    TokenStream filter = new StandardFilter(version, source);

    filter = new LowerCaseFilter(version, filter);
    filter = new StopFilter(version, filter, StandardAnalyzer.STOP_WORDS_SET);

    CharTermAttribute termAtt = (CharTermAttribute)filter.addAttribute(CharTermAttribute.class);
    StringBuilder buf = new StringBuilder();

    try {

        filter.reset();
        while(filter.incrementToken()){
            if(termAtt.length()>10){
                continue;
            }
            String word = new String(termAtt.buffer(), 0, termAtt.length());
            Matcher matcher = alphabets.matcher(word);
            if(matcher.matches()){
                buf.append(word).append(" ");
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    source = new WhitespaceTokenizer(version, new StringReader(buf.toString()));

    return new TokenStreamComponents(source, filter);

}

}

4

1 に答える 1

0

なぜあなたが を持っているのかよくわかりませんが、IllegalStateExceptionいくつかの可能性があります。通常、アナライザーはトークナイザーの上にフィルターを構築します。それを行ってから、別のトークナイザーを作成し、代わりにそれを返すので、返されたフィルターはトークナイザーと直接関係がありません。また、作成した Filter は、渡された時点で既に終了しているため、試しresetてみてください。

ただし、主な問題は、createComponents解析ロジックを実装するのに最適な場所ではないことです。それを行うために、トークナイザーとフィルターのスタックをセットアップする場所です。カスタム フィルタリング ロジックを Filter に実装し、拡張TokenStream(またはAttributeSource、またはそのようなもの) する方が理にかなっています。

あなたが探しているものはすでに実装されていると思いますがPatternReplaceCharFilter

private final Pattern nonAlpha = Pattern.compile(".*[^a-z].*");
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new StandardTokenizer(version, reader);
    TokenStream filter = new StandardFilter(version, source);
    filter = new LowerCaseFilter(version, filter);
    filter = new StopFilter(version, filter, StandardAnalyzer.STOP_WORDS_SET);
    filter = new PatternReplaceCharFilter(nonAlpha, "", filter);
    return new TokenStreamComponents(source, filter);
}

または、おそらく次のようなもっと単純なものが役立つでしょう:

@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new LowerCaseTokenizer(version, reader);
    TokenStream filter = new StopFilter(version, filter, StandardAnalyzer.STOP_WORDS_SET);
    return new TokenStreamComponents(source, filter);
}
于 2013-10-16T23:51:19.930 に答える