Как вернуть более общие слова, текст с PHP?


Я хотел бы знать, какой лучший способ вернуть экземпляры задаваемые вопросы подстрок в строку, содержащую текст. Пример:

$texto = "Hoje nós vamos falar de PHP. PHP é uma linguagem criada no ano de ...";

, output:

array(
    "PHP" => 2
    "de" => 2
    //...
);

идея заключается В том, что будет возвращено array с наиболее часто используемых слов в определенном string.

в настоящее время Я использую функцию substr_count(), но проблема в том, что она работает только если вы уже передает слова должны быть проверены, то есть, я должен был бы знать слова, текст для проверки.

Есть ли другой способ сделать это?

 5
php
Author: Wallace Maxters, 2014-06-29

3 answers

Попробуйте так:

print_r(array_count_values(str_word_count($texto, 1, "óé")));

Результат:

Array ( 
   [Hoje] => 1 
   [nós] => 1 
   [vamos] => 1 
   [falar] => 1 
   [de] => 2 
   [PHP] => 2 
   [uma] => 1 
   [linguagem] => 1 
   [criada] => 1 
   [no] => 1 
   [é] => 1
   [ano] => 1 
)

Чтобы понять, как array_count_values работает просмотрите php manual.

Издание

Оптимального решения (независимо от языка)

, предыдущее решение необходимо указать весь набор символов utf-8 (так же, как это было сделано с ó и é).

Ниже решение, но и сложная, однако, исключает проблему set символов специальный.

$text = str_replace(".","", "Hoje nós vamos falar de PHP. PHP é uma linguagem criada no ano de ...");
$namePattern = '/[\s,:?!]+/u';
$wordsArray = preg_split($namePattern, $text, -1, PREG_SPLIT_NO_EMPTY);
$wordsArray2 = array_count_values($wordsArray);
print_r($wordsArray2);

В Этом решении я использую регулярные выражения, чтобы разбить слова и логотип, а затем я использую array_count_values, чтобы рассказать словами. Результат:

Array 
( 
  [Hoje] => 1 
  [nós] => 1 
  [vamos] => 1 
  [falar] => 1 
  [de] => 2 
  [PHP] => 2 
  [é] => 1 
  [uma] => 1 
  [linguagem] => 1 
  [criada] => 1 
  [no] => 1 
  [ano] => 1 
)

Это решение также удовлетворяет потребность, но точки должны быть устранены до раскола, и слов, в противном случае появится в результате слов с помощью . и слов, без ..Например:

  ...
  [PHP.] => 1 
  [PHP] => 1 
  ...

Подсчитать слова никогда не является такой простой задачей, так. И нужно хорошо знать stringнужно подсчитать слова, прежде чем применять решение.

 5
Author: anmaia, 2020-06-11 14:45:34

Мой способ "ручной работы" будет иметь вид:

$texto = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";

$palavras = explode(' ', $texto);
echo count($palavras); // 91
$ocorrencias = array();

for($i = 0; $i<count($palavras); $i++){
    $palavra = $palavras[$i];
    $ocorrencias[$palavra]++;
}

arsort($ocorrencias);
var_dump($ocorrencias);

Результат:

array(69) { 
    ["the"]=> int(6) 
    ["Lorem"]=> int(4) 
    ["of"]=> int(4) 
    ["Ipsum"]=> int(3) 
    ["and"]=> int(3) 
    ["a"]=> int(2) 
    // etc

Преимущество этого варианта в том, что только нужно разбить на пробелы.

, Можно также добавить строку таким образом, до explode():

$texto = preg_replace('/[,\.?!;]*/', '', $texto); 

, Чтобы очистить virgulas и исторических, etc.. В зависимости от того, что вы ищите.

 4
Author: Sergio, 2014-06-29 20:29:50

Мое решение

Это решение является немного более надежным, он отделяет каждое слово, и это "тщательно", после того, как обработана и принята, то она переходит в новый массив, который затем будет организована по числу случаев.

<?php
$texto = "Hoje nós vamos falar de PHP! mas o que é PHP?? 
PHP é uma linguagem criada no ano de ...";

/* Separar cada palavra por espaços (raw, sem filtro) */
$palavras_raw = explode(" ", $texto);

// Array de caracteres para serem removidos
$ignorar = 
[".", ",", "!", ";", ":", "(", ")", "{", "}", "[", "]", "<", ">",
"?", "|", "\\", "/"];

// Array para as palavras tratadas.
$palavrasTratadas = array();

/* Criar uma nova array de palavras, agora tratadas */
$palavras_raw_count = count($palavras_raw);
for ($i=0;$i<$palavras_raw_count;++$i) {
    $palavraAtual = $palavras_raw[$i];
    $palavraAtual = trim($palavraAtual);
    if (!empty($palavraAtual)) {
        $palavraTratada = str_replace($ignorar, "", $palavraAtual);
        $palavraTratada = strtolower($palavraTratada);
        if (!empty($palavraTratada)) {
            $palavrasTratadas[$palavraTratada]++;
        }
    }
}

// Organizar pela ordem de mais ocorrências.
arsort($palavrasTratadas);

// DEBUG
print_r($palavrasTratadas);

Он отделяет каждое слово по критерию пробелов и удаляет специальные символы из массива $ignorar после того, как он это все слова, чтобы предотвратить ошибки и неожиданные результаты, и передает его в массив $palavrasTratadas, стоит отметить, что он УЧИТЫВАЕТСЯ maiusculas из букв, потому что кто-то может начать фразу с maiuscula Сегодня, и после использовать сегодня в остальной части текста, но функция пройти слов для букв в PHP выполняется на английском языке, так что она не преобразует Будет в отеле, например.

 2
Author: Olimon F., 2020-06-11 14:45:34