3

文字列の効果的な単語カウンターを作成する方法を理解しようとした後、PHPが持つ既存の関数について知っていますがstr_word_count、残念ながら、英語を含む単語の数を数える必要があるため、必要な機能を実行できません。 、中国語、日本語、その他のアクセント付き文字。

ただしstr_word_count、3番目の引数に文字を追加しない限り、単語数はカウントされませんが、これは非常識です。中国語、日本語、アクセント付き文字(など)の言語ですべての文字を追加する必要がある可能性がありますが、これは私が行うことではありません。必要。

テスト:

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でサポートされている優れた単語カウンターを探しています-これに対する可能な解決策はありますか?

4

3 に答える 3

1

単語カウントに使用できる日本語用の黒文字形態素解析器があります。残念ながら、PHPではなくJavaで書かれています。すべてをPHPに移植するのは非常に大きな作業なので、コマンドラインで呼び出したり、他のPHP-Javaブリッジを調べたりできるように、小さなラッパーを作成することをお勧めします。

日本語以外の言語にどれだけ当てはまるかわかりません。同様のライブラリについては、 ApacheTikaプロジェクトを調べることをお勧めします。

于 2012-06-18T14:33:38.200 に答える
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サーバーがこれらより古いバージョンを実行していて、中国語では機能しないことを発見しました。したがって、最新バージョンを使用していることを確認してください。

于 2016-09-16T12:34:05.307 に答える
0

mbstring拡張機能を見て、UTF-8文字列を操作できます。

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

注:正しいカウントを取得するには、文字の間に2つのスペースを追加する必要が ありましmb_regex_encoding()mb_internal_encoding()UTF-8

ただし、中国語では「単語」の概念が存在しないため(場合によっては日本語でも)、そのような方法で適切な結果が得られない可能性があります...)

どの文字グループが「単語」であるかを判断するために、辞書を使用してアルゴリズムを作成する必要がある場合があります。

于 2012-06-18T14:23:13.960 に答える