php 统计UTF-8字符串中每个单词的出现次数

hlswsv35  于 2022-11-28  发布在  PHP
关注(0)|答案(2)|浏览(112)

我被导师布置的一个问题卡住了,他要我写一个PHP脚本,读取UTF-8编码的文件内容,并返回每个单词出现的次数作为json。
文件内容的语言为俄语西里尔语。

以下是示例文本

Он бледен. Мыслит страшный путь.
В его душе живут виденья.
Ударом жизни вбита грудь,
А щеки выпили сомненья.

Клоками сбиты волоса,
Чело высокое в морщинах,
Но ясных грез его краса
Горит в продуманных картинах.

Сидит он в тесном чердаке,
Огарок свечки режет взоры,
А карандаш в его руке
Ведет с ним тайно разговоры.

Он пишет песню грустных дум,
Он ловит сердцем тень былого.
И этот шум… душевный шум…
Снесет он завтра за целковый.

根据我的研究,PHP的预定义字符串函数可以无缝地处理这个问题,只有在它必须是ASCII编码的情况下。在这种情况下,我们有一些第三方库或API来处理其他非英语语言的utf-8编码字符串。

doinxwow

doinxwow1#

使用mb_string函数:

<?php

$str = "Он бледен. Мыслит страшный путь.
        В его душе живут виденья.
        Ударом жизни вбита грудь,
        А щеки выпили сомненья.

        Клоками сбиты волоса,
        Чело высокое в морщинах,
        Но ясных грез его краса
        Горит в продуманных картинах.

        Сидит он в тесном чердаке,
        Огарок свечки режет взоры,
        А карандаш в его руке
        Ведет с ним тайно разговоры.

        Он пишет песню грустных дум,
        Он ловит сердцем тень былого.
        И этот шум… душевный шум…
        Снесет он завтра за целковый.";

$words = preg_split('/[ .,-?!:;\'"\n\r]+/', mb_strtolower($str));

$mp = [];

foreach ($words as $word) {
    if (!mb_strlen($word)) continue;
    
    if (!isset($mp[$word])) {
        $mp[$word] = 0;
    }
    $mp[$word]++;
}

var_dump($mp);
e37o9pze

e37o9pze2#

这个解决方案将文本拆分成一个数组,然后将单词包含在数组中。正则表达式只是一种方法,需要改进。然后使用array_count_values进行求值。

$result = array_count_values(preg_split("~[ ,.;\r\n\t]+~u",$str, -1, PREG_SPLIT_NO_EMPTY));

这里区分大小写。
演示:https://3v4l.org/5iVnX
如果仅单词的第一个字母不被区分,或者如果诸如make-up之类的单词被识别为一个单词,则代码变得稍微更广泛。

function mb_word_count($string, $mode = MB_CASE_TITLE, $characters = null){
  $string = mb_convert_case($string, $mode, "UTF-8");
  $addChars = $characters ? preg_quote($characters, '~') : "";
  $regEx = "~[^\p{L}0-9".$addChars."]+~u";
  return array_count_values(preg_split($regEx,$string, -1, PREG_SPLIT_NO_EMPTY));
}

mb_word_count函数返回一个数组,其中所有单词作为键,它们的数字作为值。str 2 hex这样的人工单词被识别为一个单词。只有单词的第一个字母不区分大小写(MB_CASE_TITLE)。其他模式可以从mb_convert_case中选择。其他字符可以用$字符定义,然后将其作为字母处理。

相关问题