3

在试图弄清楚如何拥有一个有效的字符串单词计数器之后,我知道 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 支持的单词计数器,它可以计算每个典型单词/重音/语言符号中的单词 - 有没有可能的解决方案?

4

3 回答 3

1

有可用于字数统计的日文黑字词形态分析器。不幸的是,它是用 Java 编写的,而不是 PHP。由于将其全部移植到 PHP 是一项艰巨的任务,我建议围绕它编写一个小包装器,以便您可以在命令行上调用它,或查看其他 PHP-Java 桥。

我不知道它是否适用于日语以外的语言。您可能想查看Apache Tika项目以获取类似的此类库。

于 2012-06-18T14:33:38.200 回答
1

我使用Intl扩展的 break 迭代器取得了很好的效果,该迭代器使用区域设置感知词边界对字符串进行标记。例如:

<?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

您可以查看使用 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

注意:我必须在字符之间添加 2 个空格才能获得正确的计数 通过设置&来修复mb_regex_encoding()mb_internal_encoding()UTF-8

但是,在中文中不存在“单词”的概念(在某些情况下在日语中也可能存在),因此您可能永远不会以这种方式得到相关的结果......)

您可能需要使用字典编写算法来确定哪些字符组是“单词”

于 2012-06-18T14:23:13.960 回答