2012-11-17 4 views
12

문자열을 ngrams로 토큰 화하려고합니다. 이상하게도 NGramTokenizer에 대한 문서에서 토큰 화 된 개별 ngram을 리턴하는 메소드가 표시되지 않습니다. 사실 String 객체를 반환하는 NGramTokenizer 클래스에는 두 가지 메소드 만 있습니다. Java Lucene NGramTokenizer

Reader reader = new StringReader("This is a test string"); 
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3); 
  1. 가 어디 ngrams 토큰 화 된되는 : 여기

    는 내가 가지고있는 코드를 무엇입니까?
  2. 어떻게 문자열/단어로 출력 할 수 있습니까?

다음과 같이 출력하고 싶습니다. This is a, test, string, This is a, 테스트 문자열, 테스트 문자열, 테스트 문자열입니다.

답변

18

String을 반환하는 메소드를 찾으려고 할 때 찾고있는 것을 찾을 수 없을 것이라고 생각합니다. Attribute 초를 처리해야합니다.

Reader reader = new StringReader("This is a test string"); 
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3); 
CharTermAttribute charTermAttribute = gramTokenizer.addAttribute(CharTermAttribute.class); 
gramTokenizer.reset(); 

while (gramTokenizer.incrementToken()) { 
    String token = charTermAttribute.toString(); 
    //Do something 
} 
gramTokenizer.end(); 
gramTokenizer.close(); 

재설정해야합니다() 토크 나이 그것은, 비록 그 후 재사용해야하는 경우 :

같은 뭔가를 작동합니다. 오히려 문자보다 코멘트를 단어의


토큰 화 그룹 :

Reader reader = new StringReader("This is a test string"); 
TokenStream tokenizer = new StandardTokenizer(Version.LUCENE_36, reader); 
tokenizer = new ShingleFilter(tokenizer, 1, 3); 
CharTermAttribute charTermAttribute = tokenizer.addAttribute(CharTermAttribute.class); 

while (tokenizer.incrementToken()) { 
    String token = charTermAttribute.toString(); 
    //Do something 
} 
+0

나는 특성의 관점에서 문자열 대신 문자로 무엇을 할 수 있습니까? 그러면 출력은 다음과 같습니다 : This is, a, test, string, This is, a test, ... test string. – CodeKingPlusPlus

+1

좋아요, 그건 Lucene의 NGramTokenizer가 처리하도록 설계된 것이 아닙니다. 사용하고자하는 것은 StandardTokenizer와 결합 된 ShingleFilter입니다. 내 대답을 업데이트하고 거기에 표현하기가 더 쉬울 것입니다 ... – femtoRgon

+0

토큰 화 프로세스에서 사용할 수있는 정지 단어 필터에 대해 알고 있습니까? – CodeKingPlusPlus

0

테스트 프로그램을 만들지 않고도 incrementToken()이 ngram 중 하나가 될 다음 토큰을 반환한다고 생각합니다. 캐릭터 'A B C 형 D'1-3의 예

사용 N- 그램 길이는 NGramTokenizer 반환 할 수 : 등의 'A', 'A B'은, 결과 ngrams이

a 
a b 
a b c 
b 
b c 
b c d 
c 
c d 
d 

.

[편집]

당신은 또한 토큰 스트림으로 엿에 대해 이야기로, Querying lucene tokens without indexing보고 할 수 있습니다

.

+1

문제는 incrementToken()는 부울을 반환은 ... – CodeKingPlusPlus

1

루씬 (4.2.1)의 최신 버전에 대한이 작동 깨끗한 코드입니다.

이 찾기 - 공통 4.2.1.jar 루씬-analuzers

  • 루씬 코어-4.2.1.jar
  • :이 코드를 실행하기 전에, 당신은이 개 jar 파일을 가져가 파일 수 : http://www.apache.org/dyn/closer.cgi/lucene/java/4.2.1

    //LUCENE 4.2.1 
    Reader reader = new StringReader("This is a test string");  
    NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3); 
    
    CharTermAttribute charTermAttribute = gramTokenizer.addAttribute(CharTermAttribute.class); 
    
    while (gramTokenizer.incrementToken()) { 
        String token = charTermAttribute.toString(); 
        System.out.println(token); 
    } 
    
0

패키지 ngramalgoimpl; 가져 오기 java.util.*;

공용 클래스 NGR {

public static List<String> n_grams(int n, String str) { 
    List<String> n_grams = new ArrayList<String>(); 
    String[] words = str.split(" "); 
    for (int i = 0; i < words.length - n + 1; i++) 
     n_grams.add(concatination(words, i, i+n)); 
    return n_grams; 
} 
/*stringBuilder is used to cancatinate mutable sequence of characters*/ 
public static String concatination(String[] words, int start, int end) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = start; i < end; i++) 
     sb.append((i > start ? " " : "") + words[i]); 
    return sb.toString(); 
} 

public static void main(String[] args) { 
    for (int n = 1; n <= 3; n++) { 
     for (String ngram : n_grams(n, "This is my car.")) 
      System.out.println(ngram); 
     System.out.println(); 
    } 
} 

}

+0

문맥을 제공하십시오,이 코드는 무엇을합니까? 그리고 질문에 대한 답변을 어떻게 제공합니까? –

+0

@KevinKloet 질문 및 주어진 답변보기 –