2013-06-24 2 views
3

lucene 4.3.0을 사용 중이며 영어와 일본어 문자로 문서를 토큰 화하려고합니다.lucene에서 두 개의 토크 나이저를 결합하는 방법 (japaneseanalyzer and standardanalyzer)

An example is like "LEICA S2 カタログ (新品)" 
    The StandardAnalyzer "[leica] [s2] [カタログ] [新] [品]" 
    The JapaneseAnalyzer "[leica] [s] [2] [カタログ] [新品]" 

내 프로젝트의 응용 프로그램에서 StandardAnalyzer는 영어 문자 (예 : [s2]는 [s] [2]보다 낫다. JapaneseAnalyzer는 일본어에 더 좋습니다. [신] ~ [新] [品]. 또한, JapaneseAnalyzer에는 전각 문자 "2"를 "2"로 변환하는 좋은 기능이 있습니다. 내가 시도 할 것

If I want the tokens to be [leica] [s2] [カタログ] [新品], it means: 
    1) English and numbers are tokenized by StandardAnalyzer. [leica] [s2] 
    2) Japanese are tokenized by JapaneseAnalyzer. [カタログ] [新品] 
    3) fullwidth character are converted to halfwidth by a filter. [s2]=>[s2] 
    how to implement this custom analyzer? 

답변

2

우선은 JapaneseAnalyzer에 전달되는 인수, 덤비는되어 특히 Tokenizer.Mode (I 그 옵션의 의도에 내에서 정확하게 일본어의 구조에 대해 아무것도, 그래서 아무 도움을 알 수 없음) .


당신은이에 대한 자신의 분석을 만들어야한다는 없다면. 자신의 Tokenizer를 기꺼이 작성하지 않는 한 최종 결과가 최선의 결과 일 수 있습니다. 분석기를 만드는 것은 매우 간단합니다. 토크 나이저를 만드는 것은 자신 만의 문법을 정의하는 것을 의미합니다. 그렇게 간단한 것은 아닙니다.

JapaneseAnalyzerStandardAnalyzer 코드를 살펴 보시고 특히 createComponents을 호출하십시오.이 코드는 사용자 정의 분석기를 만들기 위해 구현해야합니다. 에서 완전히 임의의 구현입니다

@Override 
protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
    //For your Tokenizer, you might consider StandardTokenizer, JapaneseTokenizer, or CharTokenizer 
    Tokenizer tokenizer = new StandardTokenizer(version, reader); 
    TokenStream stream = new StandardFilter(version, tokenizer); 
    stream = new JapaneseBaseFormFilter(stream); 
    stream = new LowerCaseFilter(matchVersion, stream); //In JapaneseAnalyzer, a lowercasefilter comes at the end, further proving I don't know Japanese. 
    stream = new JapanesePartOfSpeechStopFilter(true, stream, stoptags); 
    stream = new CJKWidthFilter(stream); //Note this WidthFilter! I believe this does the char width transform you are looking for. 
    stream = new StopFilter(matchVersion, stream, stopwords); 
    stream = new JapaneseKatakanaStemFilter(stream); 
    stream = new PorterStemFilter(stream); //Nothing stopping you using a second stemmer, really. 
    return new TokenStreamComponents(tokenizer, stream); 
} 

: 그것은 같이 보일 수

StandardTokenizer 당신을 위해 올바른 당신이 결론에 도달 말하지만, 그렇지 않으면 우리는 주로 일본의 필터 세트를 사용하는거야 관심사를 이해하지 못하는 사람도 있지만 더 의미있는 분석기를 구현하는 방향을 제시합니다. 해당 필터 체인에서 필터를 적용하는 순서는 중요하므로 조심해야합니다 (예 : 영문에서는 LowerCaseFilter가 일반적으로 일찍 적용되므로 Stemmers와 같은 항목은 대소 문자를 신경 쓰지 않아도됩니다).

관련 문제