php - Как я преобразовываю строку в ассоциативный массив ее ключевых слов

возьмите эту строку в качестве примера: "будет видеть Вас в Лондоне завтра и Кенте послезавтра".

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

Массив ([завтра] => 2 [Лондона] => 1 [Кент] => 1)

Любая справка значительно ценится.

7
задан Steven 29 April 2010 в 18:41
поделиться

3 ответа

с использованием черного списка слов, которые нельзя включать

$str = 'will see you in London tomorrow and Kent the day after tomorrow';
$skip_words = array( 'in', 'the', 'will', 'see', 'and', 'day', 'you', 'after' );
// get words in sentence that aren't to be skipped and count their values
$words = array_count_values( array_diff( explode( ' ', $str ), $skip_words ) );

print_r( $words );
0
ответ дан 7 December 2019 в 05:19
поделиться

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

1
ответ дан 7 December 2019 в 05:19
поделиться

Я бы сказал, вы могли бы:

  • разбить строку на массив слов
    • с помощью explode
    • или preg_split
    • в зависимости от сложности, которую вы примете для разделителей слов
  • используйте array_filte r, чтобы сохранить только те строки (то есть слова), которые вы хотите { {1}}
    • функция обратного вызова должна будет вернуть false для всех недействительных слов
  • , а затем использовать array_count_values ​​ в результирующем списке слов {{ 1}}
    • , который подсчитает, сколько раз каждое слово присутствует в массиве слов



EDIT: и, просто для удовольствия, вот быстрый пример:

Первый из все, строка, которая разбивается на слова:

$str = "will see you in London tomorrow and Kent the day after tomorrow";
$words = preg_split('/\s+/', $str, -1, PREG_SPLIT_NO_EMPTY);
var_dump($words);

Что дает вам:

array
  0 => string 'will' (length=4)
  1 => string 'see' (length=3)
  2 => string 'you' (length=3)
  3 => string 'in' (length=2)
  4 => string 'London' (length=6)
  5 => string 'tomorrow' (length=8)
  6 => string 'and' (length=3)
  7 => string 'Kent' (length=4)
  8 => string 'the' (length=3)
  9 => string 'day' (length=3)
  10 => string 'after' (length=5)
  11 => string 'tomorrow' (length=8)


Затем фильтрация:

function filter_words($word) {
    // a pretty simple filter ^^
    if (strlen($word) >= 5) {
        return true;
    } else {
        return false;
    }
}
$words_filtered = array_filter($words, 'filter_words');
var_dump($words_filtered);

Что дает:

array
  4 => string 'London' (length=6)
  5 => string 'tomorrow' (length=8)
  10 => string 'after' (length=5)
  11 => string 'tomorrow' (length=8)


И, наконец, подсчет:

$counts = array_count_values($words_filtered);
var_dump($counts);

И окончательный результат:

array
  'London' => int 1
  'tomorrow' => int 2
  'after' => int 1


Теперь вы можете создавать здесь; -)
В основном вам придется поработать:

  • Лучшая функция разнесения, которая имеет дело с пунктуацией ( или d с этим и во время фильтрации)
  • «Интеллектуальная» функция фильтрации, которая больше подходит вашим потребностям, чем мои

Удачи!

7
ответ дан 7 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: