Использовать предварительно написанный текст с lucene - PullRequest
0 голосов
/ 14 февраля 2012

Мои данные уже токенизированы с внешним ресурсом, и я хотел бы использовать эти данные в lucene. Моей первой идеей было бы соединить эти строки с \x01 и использовать WhiteSpaceTokenizer, чтобы разделить их снова. Есть идея получше? (ввод в XML)

В качестве бонуса эти аннотированные данные также содержат синонимы, как бы я их вводил (представлены в виде тегов XML).

Ответы [ 2 ]

3 голосов
/ 20 апреля 2012

Lucene позволяет вам предоставлять собственный поток токенов в поле, минуя этап токенизации. Для этого вы можете создать свой собственный подкласс TokenStream, реализующий incrementToken (), а затем вызвать field.setTokenStream (new MyTokenStream (yourTokens)):

public class MyTokenStream extends TokenStream {
    CharTermAttribute charTermAtt;
    OffsetAttribute offsetAtt;

    final Iterator<MyToken> listOfTokens;

    MyTokenStream(Iterator<MyToken> tokenList) {
        listOfTokens = tokenList;
        charTermAtt = addAttribute(CharTermAttribute.class);
        offsetAtt = addAttribute(OffsetAttribute.class);

    }

    @Override
    public boolean incrementToken() throws IOException {
        if(listOfTokens.hasNext()) {
            super.clearAttributes();
            MyToken myToken = listOfTokens.next();
            charTermAtt.setLength(0);
            charTermAtt.append(myToken.getText());
            offsetAtt.setOffset(myToken.begin(), myToken.end());
            return true;
        }
        return false;
    }
}
0 голосов
/ 14 февраля 2012

WhitespaceTokenizer не подходит для строк, соединенных с 0x01. Вместо этого производная от CharTokenizer, переопределяющая isTokenChar.

Основная проблема с этим подходом состоит в том, что присоединение, а затем повторное разделение являются дорогостоящими; если это окажется слишком дорогим, вы можете реализовать тривиальный TokenStream, который просто выдает токены из своего ввода.

Если под синонимами вы подразумеваете, что термин, такой как «программист», расширен до набора терминов, скажем, {«программист», «разработчик», «хакер»}, то я рекомендую использовать их в той же позиции. Вы можете использовать PositionIncrementAttribute для управления этим.

Пример использования PositionIncrementAttribute см. my lemmatizing TokenStream, который испускает как словоформы, найденные в полном тексте, так и их леммы в одной и той же позиции.

...