2011-09-25 85 views
2

我需要使用一個標記器,它將空白分割爲單詞,但如果空白在雙括號中則不會分割。下面一個例子:如何擴展WhitespaceTokenizer?

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

應該產生令牌名單:

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

我認爲我可以通過擴展Lucene的WhiteSpaceTokenizer獲得此行爲。我怎樣才能執行這個擴展?
還有其他解決方案嗎?

在此先感謝。

回答

2

我沒有試過擴展標記生成器,但我在這裏用正則表達式一個不錯的(我認爲)解決方案:

\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]*\\)\\)"); 

將返回什麼,或者你想怎麼一回事,因爲它只檢查分隔符不算什麼。

+0

謝謝。我想我會用這種方法最簡單,我可以獲得與擴展WhitespaceTokenizer相同的結果。再次感謝你:) –

1

您可以通過擴展WhitespaceTokenizer做到這一點,但我相信,如果你寫一個​​從一個WhitespaceTokenizer和粘貼在一起連續讀取的標記根據括號的數量會比較容易。

覆蓋incrementToken是編寫類似Tokenizer類的主要任務。我自己曾經這樣做過; the result可能會作爲一個例子(雖然由於技術原因,我不能讓我的班級TokenFilter)。