2013-05-19 4 views
5

문자열에서 단어 수를 가져 오려고합니다. 그것만큼이나 간단합니다. 캐치는 문자열이 예측할 수없는 언어 일 수 있다는 것입니다.유니 코드 문자열에서 단어 수 가져 오기 (모든 언어에서)

그래서, 나는 다음과 같은 샘플 출력 서명 int getWordCount(String)의 기능을 필요 -

getWordCount("供应商代发发货") => 7 
getWordCount("This is a sentence") => 4 

를 들어 주시면 감사하겠습니다 :)

+0

의 단편은 단어 사이에 세퍼레이터가 있습니까? –

+0

아니요 구분 기호가 없습니다. 정확한 문자열을 복사했습니다. – jaibatrik

+0

이 경우 나는 유니 코드 룬 문자가 문자열에 사용되는 기반 언어를 찾으려고합니다.그런 다음 해당 정보를 사용하여 문자열을 구문 분석하는 방법을 결정하십시오. –

답변

5

"단어"의 개념을 테스트 사소한하거나 복잡 할 수 있습니다.

워드 토큰 화 : 여기 Apache Stanbol 툴킷 하나의 단어의 검출은 텍스트를 처리 할 Stanbol 증강 필요합니다. 이것은 대부분의 언어에서 사소한 일이지만 일부 동부 언어에서는 다소 복잡한 작업입니다 (예 : 중국어, 일본어, 한국어. 달리 구성되지 않으면 Stanbol은 공백을 사용하여 단어를 토큰 화합니다. 단어의 개념은 언어보다는 문법 경우

그래서, 당신은 사용해야합니다 NLP toolkit

내 선호하는 자바 솔루션입니다 Apache's Open NLP

참고 : 나는 http://www.mdbg.net/chindict/chindict.php?page=worddict 이 예를 토큰 화하는 데 사용한 . 그것은 4 단어가 7이 아니라는 것을 의미합니다.내가 잘라 (오히려 조각) 붙여 넣은 :

원본 텍스트 간체 병음 영어 정의는 사전 전통 HSK 供应 商 供应 商 공 잉 샹

공급 업체에 새로운 단어를 추가

供應 商 代
代 다이

,

다른 사람을 대신하여 행동/대체하기/교체/생성/시대/연령/기간/(역사) 시대/(지질) EON

보내
FA

发 发/ FA

,369 发 총소리 (라운드)에 대한/분류

發 을 개발/HSK 4

을 발행/(하나의 느낌을) 보여

hair/Taiwan pr. [FA3]

髮 发货
发货 FA

가 파견 Huo의/발송하는 제품

發貨

이 처음 세 문자

는 하나를 형성하기 위해 표시 워드. 우리는 모든 언어가 하나 (또는 ​​그 이상)의 단어 분리기를 가지고 있으며, 당신이 그 구분을위한 정규식을 구축 할 수 있다고 가정하면

+0

도움 주셔서 감사합니다. 나는 당신의 접근 방식이 매우 논리적이라고 생각합니다. 나는 이것을 어떻게 해결할 수 있는지 알기 위해 몇 가지 툴킷을 찾으려고 노력할 것이다. – jaibatrik

+0

좋습니다. 명사, 동사 등을 탐지 할 수있는 PartOfSpeech Tagger로 시작하는 것이 좋습니다. 그리고 문제를 탐구하는 데 도움이되는 온라인 서비스가 거의 확실합니다. 그리고 전체적인 문제는 단순히 단어를 찾는 것보다 더 복잡 할 것입니다. –

+0

쉬운 툴킷/서비스를 알고 계십니까? 좋은 단어 토크 나이 저는 어떨까요? – jaibatrik

1

영어 버전

을 진행하는 방법에 어떤 도움 당신은 오히려 간단한 Regex로 할 수있는 영어 버전. 나는 일부 사용자 지정 구분을 놓친하지만 한 수

public static int getWordCount(String str) { 
    return str.split("[\\s,;-]+").length; 
} 

정규식 설명 :

[ 
\\s Any whitespace character or 
, A comma 
; or a semi-colon 
] 
+ Followed by any patterns in the group any number of times 

중국어 버전

를 들어 그룹 []에서 하나를 발견하면

분할 중국어 버전, 당신은 어떤 separato 식별해야합니다 rs입니다. 중국어 구분 기호의 유니 코드 char 코드를 가져 와서 위의 정규식에 추가하면 원하는 결과를 얻을 수 있습니다.

System.out.println(getWordCount("This is a sentence"));// 4 
System.out.println(getWordCount("This is a sentence")); // 4 
System.out.println(getWordCount("This is a  ,,sentence")); // 4 
+0

제안 해 주셔서 감사합니다. 그것을 시도 할 것이다. – jaibatrik

2

는 다음 문제는 다음과 같이 해결할 수 있습니다

public String separatorForLanguage(char unicodeChar){ 
     // Find out in which language unicodeChar falls 
     return ""; // return regex of separator of that language 
    } 

    public int wordCount(String sentance){ 
     char unicodeChar = sentance.charAt(0); 
     String separator = separatorForLanguage(unicodeChar); 

     int count = sentance.split(separator).length; 
     if (separator.isEmpty()) { 
      count--; 
     } 

     return count; 
    } 
+0

답변 해 주셔서 감사합니다. 실제로, 중국어/일본어 텍스트에는 구분 기호가 없으며 이것이 문제입니다. – jaibatrik

+0

@jaibatrik : 구분 기호는 빈 문자열입니다. – Mohayemin

+0

네, 그건 논리적으로 보입니다. 잘 준비된 의사 코드를 보내 주셔서 감사합니다. 감사와 찬성! – jaibatrik

5

표준 API가 BreakIterator을 제공합니다 이러한 종류의 경계 분석은 Oracle Java 7 로켈 지원이 샘플 문자열을 손상시키지 않습니다.

ICU4J v51.1 BreakIterator을 사용할 때 [供应, 商代, 发, 发, 货]으로 샘플이 손상되었습니다.

// import com.ibm.icu.text.BreakIterator; 
String sentence = "\u4f9b\u5e94\u5546\u4ee3\u53d1\u53d1\u8d27"; 
BreakIterator iterator = BreakIterator.getWordInstance(Locale.CHINESE); 
iterator.setText(sentence); 

List<String> words = new ArrayList<>(); 
int start = iterator.first(); 
int end = iterator.next(); 
while (end != BreakIterator.DONE) { 
    words.add(sentence.substring(start, end)); 
    start = end; 
    end = iterator.next(); 
} 
System.out.println(words); 

참고 : 나는 구글이 "供应 商代 发 发货"중국어라고 생각 번역 사용. 분명히, 나는 언어를 말하지 않아서 결과물의 정확성에 대해서는 언급 할 수 없다. 여기

+0

공유해 주셔서 감사합니다. 위로 투표도! – jaibatrik

2

중국 (?) 텍스트 자바

public static int getWordCount(String string) 
{ 
    Pattern pattern = Pattern.compile("[\\w']+|[\\u3400-\\u4DB5\\u4E00-\\u9FCC]"); 
    Matcher matcher = pattern.matcher(string); 
    int count = 0; 
    while(matcher.find()) 
     count++; 
    return count;         
} 

//count is 5 
int wordCount = getWordCount("this is popcorny's 電腦");