创建包括中国/日本和其他重音的语言有效字计数器(Creating an effective word

2019-09-18 05:42发布

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

Answer 1:

你可以看看的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

然而,在中国的“词”的概念,不存在(可能太在日本在某些情况下),所以你可能永远无法获得相关结果这样的方式......)

您可能需要使用dictionnary以确定哪些字符组是一个“字”写一个算法



Answer 2:

还有的Kuromoji形态分析日本可用于文字计数。 不幸的是它是用Java编写的,而不是PHP。 由于这一切移植到PHP是一个相当艰巨的任务,我建议围绕它写一个小包装,所以你可以把它叫做命令行上,或可考虑其他的PHP-Java的桥梁。

我不知道这是除日语以外的语言如何适用。 你可能想看看在Apache的蒂卡项目类似这样的库。



Answer 3:

我使用过的好成绩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库信任是固体。

我也注意到,“深航”参数的传递,似乎要对结果没有任何区别,但参数是强制性的。

我正在国际PECL-3.0.0和ICU版本为55.1。 我发现我的CentOS的服务器运行旧版本比这些,他们没有为中国工作。 因此,请确保您有最新的版本。



文章来源: Creating an effective word counter including Chinese/Japanese and other accented languages