Найти 3-8 слов общих фраз в тексте, используя PHP - PullRequest
4 голосов
/ 26 января 2011

Я ищу способ найти общие фразы в тексте, используя PHP.Если это не возможно в php, меня заинтересуют другие веб-языки, которые бы помогли мне это сделать.

Прямо сейчас я могу легко находить ключевые слова, но не знаю, как искать фразы.

Ответы [ 6 ]

3 голосов
/ 26 января 2011

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

1 голос
/ 26 января 2011

Я думаю, вы должны пойти на

str_word_count

$str = "Hello friend, you're
       looking          good today!";

print_r(str_word_count($str, 1));

даст

Array
(
    [0] => Hello
    [1] => friend
    [2] => you're
    [3] => looking
    [4] => good
    [5] => today
)

Тогда вы можете использовать array_count_values()

$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));

, который даст вам

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)
1 голос
/ 26 января 2011

Используете только PHP? Самое простое, что я могу придумать, это:

  • Добавить каждую фразу в массив
  • Получить первую фразу из массива и удалить ее
  • Найдите количество фраз, которые соответствуют ему, и удалите их, сохраняя количество совпадений
  • Вставить фразу и количество совпадений в новый массив
  • Повторять до тех пор, пока начальный массив не станет пустым

Я - мусор для формальной CS, но я считаю, что это сложность n^2, особенно включающая n(n-1)/2 сравнения в худшем случае. Я не сомневаюсь, что есть лучший способ сделать это, но вы упомянули, что эффективность не является проблемой, так что это подойдет.

Код следует (я использовал новую функцию, array_keys , которая принимает параметр поиска):

// assign the source text to $text
$text = file_get_contents('mytext.txt');

// there are other ways to do this, like preg_match_all,
// but this is computationally the simplest
$phrases = explode('.', $text);

// filter the phrases
// if you're in PHP5, you can use a foreach loop here
$num_phrases = count($phrases);
for($i = 0; $i < $num_phrases; $i++) {
  $phrases[$i] = trim($phrases[$i]);
}

$counts = array();

while(count($phrases) > 0) {
  $p = array_shift($phrases);
  $keys = array_keys($phrases, $p);
  $c = count($keys);
  $counts[$p] = $c + 1;

  if($c > 0) {
    foreach($keys as $key) {
      unset($phrases[$key]);
    }
  }
}

print_r($counts);

Просмотр в действии: http://ideone.com/htDSC

0 голосов
/ 09 января 2019

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

$words   = tokenize($searchPhraseText);
$words   = normalize_tokens($words);
$ngram2  = array_unique(ngrams($words, 2));
$ngram3  = array_unique(ngrams($words, 3));

Действительно классная библиотека с большим количеством предложений.

0 голосов
/ 26 января 2011

Если вы хотите полнотекстовый поиск в html-файлах, используйте Sphinx - мощный поисковый сервер.Документация здесь

0 голосов
/ 26 января 2011

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

Простой, но чрезвычайно уродливый и, вероятно, очень, очень медленный.

...