Фильтр стоп-фраз Lucene - PullRequest
       13

Фильтр стоп-фраз Lucene

2 голосов
/ 07 октября 2009

Я пытаюсь написать фильтр для Lucene, похожий на StopWordsFilter (реализующий, таким образом, TokenFilter), но мне нужно удалить фразы (последовательность токенов) вместо слов.

«Стоп-фразы» представляются в виде последовательности токенов: пунктуация не рассматривается.

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

Как лучше всего реализовать фильтр «стоп-фраз» с учетом потока слов, подобных TokenStream Люсена?

Ответы [ 2 ]

1 голос
/ 16 октября 2009

В этой теме мне было дано решение: использовать CachingTokenFilter Lucene в качестве отправной точки:

Это решение действительно было правильным путем.

РЕДАКТИРОВАТЬ: я исправил мертвую ссылку. Вот расшифровка стенограммы темы.

МОЙ ВОПРОС:

Я пытаюсь реализовать «фильтр стоп-фраз» с новым TokenStream API.

Я хотел бы иметь возможность заглянуть в N токенов вперед, посмотреть, если текущий токен + N последующих токенов соответствуют «стоп-фразе» (множество стоп-фраз сохраняются в HashSet), затем отбрасывают все эти токены, когда они соответствуют остановите фразу или оставьте их всех, если они не совпадают.

Для этой цели я хотел бы использовать captureState (), а затем restoreState (). чтобы вернуться к начальной точке потока.

Я пробовал много комбинаций этих API. Моя последняя попытка в коде ниже, который не работает.

    static private HashSet<String> m_stop_phrases = new HashSet<String>(); 
    static private int m_max_stop_phrase_length = 0; 
... 
    public final boolean incrementToken() throws IOException { 
        if (!input.incrementToken()) 
            return false; 
        Stack<State> stateStack = new Stack<State>(); 
        StringBuilder match_string_builder = new StringBuilder(); 
        int skippedPositions = 0; 
        boolean is_next_token = true; 
        while (is_next_token && match_string_builder.length() < m_max_stop_phrase_length) { 
            if (match_string_builder.length() > 0) 
                match_string_builder.append(" "); 
            match_string_builder.append(termAtt.term()); 
            skippedPositions += posIncrAtt.getPositionIncrement(); 
            stateStack.push(captureState()); 
            is_next_token = input.incrementToken(); 
            if (m_stop_phrases.contains(match_string_builder.toString())) { 
              // Stop phrase is found: skip the number of tokens 
              // without restoring the state 
              posIncrAtt.setPositionIncrement(posIncrAtt.getPositionIncrement() + skippedPositions); 
              return is_next_token; 
            } 
        } 
        // No stop phrase found: restore the stream 
        while (!stateStack.empty()) 
            restoreState(stateStack.pop()); 
        return true; 
    } 

Какое правильное направление я должен изучить, чтобы осуществить свой «стоп» фразы "фильтр?

ПРАВИЛЬНЫЙ ОТВЕТ:

restoreState восстанавливает только содержимое токена, а не весь поток. Так вы не можете откатить поток токенов (и это было невозможно с старый API). Цикл while в конце вашего кода не работает как вы ожидание из-за этого. Вы можете использовать CachingTokenFilter, который можно сбросить и потребляется снова, как источник для дальнейшей работы.

0 голосов
/ 07 октября 2009

Вам действительно придется написать свой собственный Анализатор, я должен подумать, поскольку то, является ли некоторая последовательность слов «фразой», зависит от сигналов, таких как знаки препинания, которые недоступны после токенизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...