PHP частота слов отсчета с поддержкой знаков препинания - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить количество общих фраз из текста. Я хочу не просто отдельные слова, а все серии слов между любыми стоп-словами. Так, например, https://en.wikipedia.org/wiki/Wuthering_Heights Я бы хотел, чтобы фраза "wuthering heights" была подсчитана, а не "wuthering" и "heights".

if (in_array($word, $this->stopwords)) 
{
    $cleanPhrase = preg_replace("/[^A-Za-z ]/", '', $currentPhrase);
    $cleanPhrase = trim($cleanPhrase);
    if($cleanPhrase != "" && strlen($cleanPhrase) > 2)
    {
        $this->Phrases[$cleanPhrase] = substr_count($normalisedText, $cleanPhrase);
        $currentPhrase = "";
    }
    continue;
}
else

$currentPhrase = $currentPhrase . $word . " ";

Проблема, с которой я сталкиваюсь с этим «возрастом», учитывается, если используется слово «сцена». Решение здесь состоит в том, чтобы добавить пробел по обе стороны от переменной $cleanPhrase. Проблема, к которой это приводит, заключается в том, что если нет пустого пространства. Это может быть запятая, точка остановки или какой-либо другой символ, обозначающий пунктуацию. Я хочу сосчитать все это. Есть ли способ, которым я могу сделать это без необходимости делать что-то подобное.

$terminate = array(".", " ", ",", "!", "?");
$count = 0;
foreach($terminate as $tpun)
{
    $count += substr_count($normalisedText, $tpun . $cleanPhrase . $tpun);
}

1 Ответ

1 голос
/ 19 марта 2020

Используя этот ответ с небольшими изменениями, вы можете сделать это:

$sentence = "Age: In this day and age, people of all age are on the stage.";
$word = 'age';
preg_match_all('/\b'.$word.'\b/i', $sentence, $matches);

\b представляет границу слова. Таким образом, эта строка будет иметь значение 3, если при поиске age (флаг i в шаблоне означает, что регистр не учитывается, вы также можете удалить его, если хотите сопоставить регистр).

Если вы Вы будете сопоставлять только одну фразу за раз, вы найдете свой счет в count($matches[0]).

...