java lucene пользовательский анализатор и токенизатор создают проблему в смещениях termvector? - PullRequest
6 голосов
/ 09 июня 2011

У меня возникла проблема со смещениями в терминах векторов в lucene: когда я анализировал поле с помощью своего пользовательского анализатора, он даст недопустимые смещения для терминатора, но это нормально для стандартного анализатора, вот мой код анализатора

public class AttachmentNameAnalyzer extends Analyzer {
    private boolean stemmTokens;
    private String name;

    public AttachmentNameAnalyzer(boolean stemmTokens, String name) {
        super();
        this.stemmTokens    = stemmTokens;
        this.name           = name;
    }

    @Override
    public TokenStream tokenStream(String fieldName, Reader reader) {
        TokenStream stream = new AttachmentNameTokenizer(reader);
        if (stemmTokens)
            stream = new SnowballFilter(stream, name);
        return stream;
    }

    @Override
    public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
        TokenStream stream = (TokenStream) getPreviousTokenStream();

        if (stream == null) {
            stream = new AttachmentNameTokenizer(reader);
            if (stemmTokens)
                stream = new SnowballFilter(stream, name);
            setPreviousTokenStream(stream);
        } else if (stream instanceof Tokenizer) {
            ( (Tokenizer) stream ).reset(reader);
        }

        return stream;
    }
}

что не так с этой "Требуется помощь"

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

проблема связана с анализатором, так как я ранее разместил код для анализатора, на самом деле поток токенов необходимо перезаписывать для каждой новой записи текста, подлежащей токенизации.

 public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
        TokenStream stream = (TokenStream) getPreviousTokenStream();

        if (stream == null) {
            stream = new AttachmentNameTokenizer(reader);
            if (stemmTokens)
                stream = new SnowballFilter(stream, name);
            setPreviousTokenStream(stream); // --------------->  problem was here 
        } else if (stream instanceof Tokenizer) {
            ( (Tokenizer) stream ).reset(reader); 
        }

        return stream;
    }

каждый раз, когда я устанавливаю предыдущий поток токенов, следующее текстовое поле должно быть отдельно разбито на токены, оно всегда начинается с конечного смещения последнего потока токенов, из-за чего термин векторное смещение неверно для нового потока.

ublic TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
            TokenStream stream = (TokenStream) getPreviousTokenStream();

            if (stream == null) {
                stream = new AttachmentNameTokenizer(reader);
                if (stemmTokens)
                    stream = new SnowballFilter(stream, name);
            } else if (stream instanceof Tokenizer) {
                ( (Tokenizer) stream ).reset(reader); 
            }

            return stream;
        }
0 голосов
/ 11 июня 2011

Какую версию Lucene вы используете? Я смотрю на код суперкласса для 3х ветки и поведение меняется с каждой версией.

Вы можете проверить код для public final boolean incrementToken(), где рассчитывается offset.

Я тоже вижу это:

/**
 * <p>
 * As of Lucene 3.1 the char based API ({@link #isTokenChar(char)} and
 * {@link #normalize(char)}) has been depreciated in favor of a Unicode 4.0
 * compatible int based API to support codepoints instead of UTF-16 code
 * units. Subclasses of {@link CharTokenizer} must not override the char based
 * methods if a {@link Version} >= 3.1 is passed to the constructor.
 * <p>
 * <p>
 * NOTE: This method will be marked <i>abstract</i> in Lucene 4.0.
 * </p>
 */

Кстати, вы можете переписать оператор switch как

@Override
protected boolean isTokenChar(int c) {
    switch(c)
    {
        case ',': case '.':
        case '-': case '_':
        case ' ':
            return false;
        default:
            return true;
    }
}
...