Как расширить WhitespaceTokenizer? - PullRequest
2 голосов
/ 25 сентября 2011

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

My input-> term1 term2 term3 ((term4 term5)) term6  

должен выдать этот список токенов:

term1, term2, term3, ((term4 term5)), term6.  

Я думаю, что я могу получить это поведение, расширив Lucene WhiteSpaceTokenizer . Как я могу выполнить это расширение?
Есть ли другие решения?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Я не пытался расширить Tokenizer, но у меня есть хорошее (я думаю) решение с регулярным выражением:

\w+|\(\([\w\s]*\)\)

И метод, который разбивает строку по сопоставленным группам из reg ex, возвращающего массив. Пример кода:

class Regex_ComandLine {

public static void main(String[] args) {
    String input = "term1 term2 term3 ((term4 term5)) term6";    //your input
    String[] parsedInput = splitByMatchedGroups(input, "\\w+|\\(\\([\\w\\s]*\\)\\)");

    for (String arg : parsedInput) {
        System.out.println(arg);
    }
}

static String[] splitByMatchedGroups(String string,
                                            String patternString) {
    List<String> matchList = new ArrayList<>();
    Matcher regexMatcher = Pattern.compile(patternString).matcher(string);

    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    }

    return matchList.toArray(new String[0]);
}

}

Выход:

term1
term2
term3
((term4 term5))
term6

Надеюсь, это поможет вам.

Обратите внимание, что следующий код с обычным split():

String[] parsedInput = input.split("\\w+|\\(\\([\\w\\s]*\\)\\)");

не вернет вам ничего или не то, что вы хотите, потому что он проверяет только разделители.

1 голос
/ 25 сентября 2011

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

Переопределение incrementToken является основной задачей при написании Tokenizer -подобного класса.Я однажды сделал это сам; результат может служить примером (хотя по техническим причинам я не смог сделать свой класс TokenFilter).

...