2013-07-11 2 views
2

이 이름에는 많은 스레드가 있다는 것을 알고 있습니다. ngrams를 생성하는 코드가 있습니다. 그러나 수천 개의 문자열을 처리 할 때 속도가 향상 될 수 있는지 알고 싶습니까?ngram 생성을 향상시키는 방법은 무엇입니까?

예 문자열 = "abcdefghijkl1245ty789"

public static String[] ngrams(String s) { 
     int len=12; 
     String[] parts = s.split("(?!^)"); 
     String[] result = new String[parts.length - len + 1]; 
     for(int i = 0; i < parts.length - len + 1; i++) { 
      StringBuilder sb = new StringBuilder(); 
      for(int k = 0; k < len; k++) { 
       sb.append(parts[i+k]); 
      } 
      result[i] = sb.toString(); 
     } 
     return result; 
    } 

위의 코드는 문자열을 가져옵니다은, 주어진 길이의 ngrmas를 생성합니다. 그 12

+0

를 사용하는 것, 방법에, 다음

private static final Pattern EVERY_CHAR = Pattern.compile("(?!^)"); 

및 예를 들어, 코드는 같을 것이다 입력 문자열의 반복에 대한 정보가 없으면 출력은 입력에만 의존하기 때문에이 방법의 메모를 고려할 수 있습니다. – Dancrumb

답변

6

물론 내 경우 :

public static String[] ngrams(String str, int length) { 
    char[] chars = str.toCharArray(); 
    final int resultCount = chars.length - length + 1; 
    String[] result = new String[resultCount]; 
    for (int i = 0; i < resultCount; i++) { 
     result[i] = new String(chars, i, length); 
    } 
    return result; 
} 

의 변화는 내가 만든 :

  • 대신 정규 표현식을 통해 분할, 나는 하나의 배열 복사본을 수행하기 때문에 많이 String#toCharArray()을 사용
  • StringBuilder에서 결과 문자열을 다시 작성하는 대신 an appropriate String constructor을 사용했습니다. 다시 한 번 배열 복사 만 수행합니다.
  • (성능에는 불필요하지만 여전히 사용됨) 메소드 서명을 변경하여 length을 매개 변수로 사용했습니다. 자유롭게 다시 변경할 수 있습니다. 메서드 이름을 ngrams()에서 ngrams12() 또는 그 이상으로 변경하십시오.

또는 아예 그 모든 것을 삭제하고 후드 아래에 비슷한 작업을 수행 String#substring()와 순진한 접근 방법을 사용하는 방식으로

public static String[] ngramsSubstring(String str, int length) { 
    final int resultCount = str.length() - length + 1; 
    String[] result = new String[resultCount]; 
    for (int i = 0; i < resultCount; i++) { 
     result[i] = str.substring(i, i+length); 
    } 
    return result; 
} 

, 혹시이 있다면 사용 regexp를 나중에 컴파일하고, 메소드를 사용할 때마다 컴파일하는 대신 다시 사용 해보십시오. 대신 String#split 당신은 합리적인 가능성과 함께 입력 문자열의 광대 한 번호가있는 경우, 당신은

String[] parts = EVERY_CHAR.split(str); 
+0

질문이 있으시면 언제든지 문의하십시오! –

+0

reply.Regarding 하위 문자열 옵션을 주셔서 감사합니다, 나는 일부 문자열을 때마다 문자열 개체를 생성하는 하위 문자열을 사용하여 읽을? ngram을 생성하기 위해 부분 문자열 작업을 많이 처리 할 때 힙 공간 오류가 발생하지 않을까요? – Balaram26

+0

@ Balaram26 나는 잘 이해하고 있는지 잘 모르겠다. 여러분의 솔루션은 물론 둘 다'result [i]'에 할당 할 때마다 새로운'String' 인스턴스를 생성합니다. 또한, 당신의 솔루션은'StringBuilder' 객체를 생성 할 것입니다. 'char []'복사도 포함되어 있습니다. 자바 7 업데이트 6 이전에,'substring()'은 원래의 char 배열을 공유했기 때문에 많은 메모리 (그리고'char []'할당과 사본)를 절약 할 수있었습니다. –

관련 문제