2017-09-05 3 views
0

Lucene으로 과학 기사 색인을 생성하고 있습니다. 다음 구성을 사용하고 있습니다.Lucene TokenFilter (영문 기사 포함)

EnglishAnalyzer analyzer = new EnglishAnalyzer(Version.LUCENE_43, EnglishAnalyzer.getDefaultStopSet()); 

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer); 

단어에 적합합니다. 하지만 "0.99"또는 "3,14"와 같은 토큰을 제거하고 싶지만 "H2O"와 같은 텍스트를 보존하고 (가능하다면 "n = 3"일 수도 있음) 하나의 토큰에 유지하려고합니다. 나는 SimpleAnalyzer을 시도했지만 내가 원하는 것은 아니다.

아이디어가 있으십니까?

감사합니다.

답변

1

맞춤식으로 원하는 것을 얻을 수 있지만 간단하게 FilteringTokenFilter을 사용하면 필요하지 않은 토큰을 모두 필터링 할 수 있습니다 (예 : regexp). 당신이해야 할 일은, 내가

 Tokenizer whitespaceTokenizer = new WhitespaceTokenizer(reader); 
     TokenStream tokenStream = new StopFilter(whitespaceTokenizer, StopAnalyzer.ENGLISH_STOP_WORDS_SET); 
     tokenStream = new ScientificFiltering(tokenStream); 
(수 구분 기호로) 단지 숫자와 쉼표와 점을 포함하는 모든 토큰을 필터링하고있어,이 경우 accept 방법을

protected boolean accept() throws IOException { 
      String token = new String(termAtt.buffer(), 0 ,termAtt.length()); 
      if (token.matches("[0-9,.]+")) { 
       return false; 
      } 
      return true; 
     } 

을이 클래스를 확장하고 구현하는 것입니다

n = 3 및 기타 유사한 구조를 필터링하지 않으려면 공백 문자에만 토큰을 분할하려면 WhitespaceTokenizer을 사용하는 것이 좋습니다.

전체 예제는 here

+0

첫 번째로 감사드립니다. 완벽하게 작동하고 있습니다! 그러나 나는 또한이 "사업자 탈출"을이 "사업자 구조 탈출"로 전환하고 싶습니다. 내 말은, EnglishAnalyzer를 사용하는 것입니다. 가능한가? 다시 한 번 감사드립니다! –

+1

EnglishAnalyzer는 LowerCaseFilter, PossesiveFilter, PorterStemming 및 아마도 다른 어떤 것의 조합 일 뿐이며 마음에 기억할 수 없습니다. 따라서 수동으로 필요한 것을 추가 할 수 있습니다. EnglishAnalyzer는 n = 3을 토큰으로 나눕니다. 아마도 원하지 않을 것입니다. – Mysterion