Lucene.NET: токенайзер на верблюжьем корпусе? - PullRequest
3 голосов
/ 10 сентября 2010

Я начал играть с Lucene.NET сегодня и написал простой тестовый метод для индексации и поиска в файлах исходного кода.Проблема состоит в том, что стандартные анализаторы / токенизаторы обрабатывают все имя идентификатора исходного кода случая верблюда как один токен.

Я ищу способ обработки идентификаторов верблюжьих случаев, таких как MaxWidth, в три токена: maxwidth, max и width.Я искал такой токенизатор, но не смог его найти.Прежде чем написать свой: есть ли что-то в этом направлении?Или есть лучший подход, чем писать токенизатор с нуля?

ОБНОВЛЕНИЕ: В конце я решил испачкать руки и сам написал CamelCaseTokenFilter.Я напишу об этом в своем блоге и обновлю вопрос.

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Ниже ссылки может быть полезно написать собственный токенизатор ...

http://karticles.com/NoSql/lucene_custom_tokenizer.html

1 голос
/ 19 марта 2012

Вот моя реализация:

package corp.sap.research.indexing;

import java.io.IOException;

import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

public class CamelCaseFilter extends TokenFilter {

    private final CharTermAttribute _termAtt;

    protected CamelCaseScoreFilter(TokenStream input) {
        super(input);
        this._termAtt = addAttribute(CharTermAttribute.class);
    }

    @Override
    public boolean incrementToken() throws IOException {
        if (!input.incrementToken())
            return false;
        CharTermAttribute a = this.getAttribute(CharTermAttribute.class);
        String spliettedString = splitCamelCase(a.toString());
        _termAtt.setEmpty();
        _termAtt.append(spliettedString);
        return true;

    }


    static String splitCamelCase(String s) {
           return s.replaceAll(
              String.format("%s|%s|%s",
                 "(?<=[A-Z])(?=[A-Z][a-z])",
                 "(?<=[^A-Z])(?=[A-Z])",
                 "(?<=[A-Za-z])(?=[^A-Za-z])"
              ),
              " "
           );
        }
}
1 голос
/ 11 сентября 2010

Solr имеет WordDelimiterFactory , который генерирует токенизатор, подобный тому, что вам нужно.Может быть, вы можете перевести исходный код на C #.

...