2012-06-18 3 views
2

문자열의 효과적인 단어 카운터를 얻는 방법을 파악한 후에 PHP에 str_word_count이있는 기존 기능에 대해 알고 있지만 불행히도 영어, 중국어, 일본어 및 기타 액센트 문자를 포함하는 단어의 수를 계산해야하기 때문에해야합니다.중국어/일본어 및 기타 억양있는 언어를 포함한 효과적인 단어 카운터 만들기

그러나 str_word_count 당신이 세 번째 인수의 문자를 추가하지 않는 단어의 수를 계산하는 데 실패하지만이 미친, 그것은 내가 중국어, 일본어, 악센트 문자 모든 단일 문자를 추가해야합니다 (등)을 의미 할 수있다 그러나 이것은 내가 필요한 것이 아닙니다.

테스트 : 어쨌든

str_word_count('The best tool'); // int(3) 
str_word_count('最適なツール'); // int(0) 
str_word_count('最適なツール', 0, '最ル'); // int(5) 

, 나는이 일을 할 수있는 온라인이 기능을 찾았지만 안타깝게도 그것은 계산 실패

function word_count($str) 
{ 
    if($str === '') 
    { 
     return 0; 
    } 

    return preg_match_all("/\p{L}[\p{L}\p{Mn}\p{Pd}'\x{2019}]*/u", $str); 
} 

테스트 :

word_count('The best tool') // int(3) 
word_count('最適なツール'); // int(1) 

// With spaces 
word_count('最 適 な ツ ー ル'); // int(5) 

기본적으로 모든 일반적인 단어/악센트 부호/언어 기호에서 단어를 셀 수있는 좋은 UTF-8 지원 단어 카운터를 찾고 있어요 ols - 거기에 가능한 해결책이 있습니까?

+0

공백을 사용하지 않는 단어 계산 언어는 어려운 문제이며 기본적으로 특정 언어에 맞게 사전 및 알고리즘을 사용하여 해결할 수 있습니다. PHP는 내장 된 것과 아무런 관련이 없으며 PHP로 작성된 라이브러리를 찾기가 어려울 수도 있습니다. – deceze

답변

0

UTF-8 문자열로 작업하려면 mbstring 확장을 살펴보십시오.

mb_split() 정규식 패턴을 사용하여 mb 문자열을 분할합니다.

<?php 
printf("Counting words in: %s\n", $argv[1]); 
mb_regex_encoding('UTF-8'); 
mb_internal_encoding("UTF-8"); 
$r = mb_split(' ', $argv[1]); 
print_r($r); 
printf("Word count: %d\n", count($r)); 

$ php mb.php "foo bar" 
Counting words in: foo bar 
Array 
(
    [0] => foo 
    [1] => bar 
) 
Word count: 2 


$ php mb.php "最適な ツール" 
Counting words in: 最適な ツール 
Array 
(
    [0] => 最適な 
    [1] => ツール 
) 
Word count: 2 

참고 : 나는 "의 mb_regex_encoding() & mb_internal_encoding()

그러나 UTF-8에, 중국어 개념을 설정하여 정확한 수를 고정을 얻기 위해 문자 사이 2 공백을 추가했다 단어 "는 존재하지 않으며 (경우에 따라서는 일본어로도 가능할 수 있습니다.) 따라서 이와 같은 방식으로 적절한 결과를 얻을 수는 없습니다 ...)

당신은 문자의 어떤 그룹을 결정하기 위해 사전도를 사용하는 알고리즘을 작성해야 수는 "단어"

+0

* "2 칸 추가해야했습니다 ..."* - 그렇습니다. 그것이 바로 OP가 해결하려고하는 문제입니다. 그리고 일본어는 일반적으로 공백을 포함하지 않습니다. -1 – deceze

+0

@deceze, 공간을 두 배로 늘리는 것은 문제가되지 않지만'mb_regex_encoding()'과'mb_internal_encoding()'을 UTF-8로 설정하여 해결되었습니다 –

+1

UTF-8은 문제와 아무 관련이 없습니다 손에. 문제는 일본어 (및 다른 언어)에는 단어 분리 기호가 없으므로 간단하게 '분리 분할'할 수 없다는 것입니다. – deceze

1

단어 계산에 사용할 수있는 일본어의 Kuromoji morphological analyzer 거기입니다. 불행히도 PHP는 아니고 Java로 작성되었습니다. PHP로 모두 이식하는 것은 아주 거대한 작업이므로 커맨드 라인에서 호출하거나 다른 PHP-Java 브릿지를 살펴볼 수 있도록 작은 래퍼를 작성하는 것이 좋습니다.

일본어 이외의 언어가 얼마나 적용되는지 모르겠다. 이러한 유사한 라이브러리에 대한 Apache Tika 프로젝트를 조사하고 싶을 수 있습니다.

1

로케일 인식 단어 경계를 사용하여 문자열을 토큰 화하는 Intl 확장 프로그램의 브레이크 반복기를 사용하여 좋은 결과를 얻었습니다. 예 :

<?php 
$words = IntlBreakIterator::createWordInstance('zh'); 
$words->setText('最適なツール'); 

$count = 0; 
foreach($words as $offset){ 
    if(IntlBreakIterator::WORD_NONE !== $words->getRuleStatus()){ 
    $count++; 
    } 
} 

printf("%u words", $count); // 3 words 

중국인을 이해할 수 없으므로 "3"이 올바른 답변인지 확인할 수 없습니다. 그러나 이해할 수있는 스크립트에 대해 정확한 결과를 얻을 수 있으며 ICU 라이브러리를 신뢰할 수 있다고 확신합니다.

또한 "zh"매개 변수 전달이 결과에 아무런 영향을주지 않는 것으로 보이지만 인수는 필수 항목입니다.

저는 Intl PECL-3.0.0을 실행 중이며 ICU 버전은 55.1입니다. 내 CentOS 서버가 이전 버전을 실행 중이며 중국어로 작동하지 않는다는 것을 발견했습니다. 최신 버전이 있는지 확인하십시오.

관련 문제