Извлечение общих слов между двумя параграфами? - PullRequest
2 голосов
/ 22 марта 2010

Как я могу извлечь общие слова между двумя или более параграфами в php5? Я думаю, это может сработать, чтобы суммировать каждый текст, чтобы создать список высоко ранжированных слов а затем сравните их.

Ответы [ 5 ]

5 голосов
/ 22 марта 2010

Я думаю, что самый простой способ будет:

  • разбить каждый абзац на массив слов , используя либо explode, либо preg_split
    • первый может быть немного быстрее
    • второй может предоставить немного больше опций
  • возможно, выполнить некоторую фильтрацию в списке слов:
    • очистить каждое слово
      • удаление специальных символов, например букв с акцентом
      • преобразование всего в нижний / верхний регистр, чтобы помочь сравнения, которые вы будете делать позже
    • удалить слишком часто слова
    • удалить слишком коротко слова
    • array_filter, здесь, вероятно, может помочь
  • и затем получите список слов, которые находятся в обоих массивах , используя что-то вроде array_intersect
4 голосов
/ 22 марта 2010

Вероятно, есть более быстрый способ, но вы могли бы отыграть пунктуацию как!? -. / \ @ # $% ^ & *, Затем разбить два абзаца в массив и затем попробовать array_intersect () для обоих массивов. Все в массиве 2, которое находится в массиве 1, должно возвращаться как совпадение.

http://php.net/manual/en/function.array-intersect.php

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

2 голосов
/ 22 марта 2010
<?php
/**
 * Gets all the words as an array for a given text blob
 *
 * @param string $paragraph The pragraph in question
 * @return string[] Words found
 */
function getWords($paragraph) {
   //only lowercase
   $paragraph = strtolower($paragraph);
   //replace all non alpha num characters with spaces (this way periods won't screw
   //with our words)
   $paragraph = preg_replace("/[^a-z]/", " ", $paragraph);
   $paragraph = explode(" ", $paragraph);
   //get rid of empty words
   $paragraph = array_flip($paragraph);
   unset($paragraph[""]);
   $paragraph = array_flip($paragraph);
   return $paragraph;
}

$paragraph1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sit amet ante
nisl. Morbi tempor varius semper. Suspendisse vel nisi dui. Sed tristique consectetur imperdiet.
Morbi nulla diam, lobortis non eleifend eget, ullamcorper nec tortor. Duis quis lectus felis.
In vulputate varius luctus. Maecenas gravida laoreet massa quis faucibus. Duis dictum, dui sit
amet pharetra laoreet, tortor nisi mattis tortor, et ornare purus dolor vitae ligula. Sed id
orci ut dolor fermentum imperdiet. Nulla non justo urna, in suscipit nunc. Donec ut nibh risus,
ut tempus mi. Proin fringilla pretium urna sed faucibus. Proin et porttitor sem. Nulla eros
arcu, sodales et aliquam in, pharetra et mauris. Duis placerat blandit justo at tincidunt.
Etiam eu rutrum arcu.";

$paragraph2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet leo id
arcu feugiat tempus quis a risus. Proin non nisi augue. Cras ultricies dignissim augue vel gravida.
Vivamus sed orci sed leo sollicitudin aliquet non at dui. Nulla facilisi. Suspendisse nunc nibh,
sollicitudin vitae tincidunt eget, aliquet vitae magna. Aliquam vehicula cursus ante, vitae rhoncus
orci egestas et. Fusce condimentum metus at metus auctor pellentesque. Suspendisse potenti. Morbi
blandit, leo sed eleifend pretium, augue dui interdum eros, vel faucibus felis dolor id elit. Nam
condimentum, odio at mattis consequat, sem eros molestie risus, a tempus dolor arcu sit amet justo.";

$common = array_intersect(getWords($paragraph1), getWords($paragraph2));
sort($common);
var_dump($common);
?>
2 голосов
/ 22 марта 2010

Нечто подобное может сработать ...

<?php
  $paragraph = "hello this is some sample text. Sample text is usually used to test a program. For example, this sample text will be used to test the script below.";
  $words = array();
  preg_match_all('/\w+/', $paragraph, $matches);
  foreach($matches[0] as $w){
    $w = strtolower($w);
    if(!array_key_exists($w, $words)){
      $words[$w] = 0;
    }
    $words[$w]++;
  }
  asort($words);
  echo print_r($words, true);

  /* Output
  Array (
      [hello] => 1
      [will] => 1
      [example] => 1
      [a] => 1
      [program] => 1
      [usually] => 1
      [Sample] => 1
      [script] => 1
      [below] => 1
      [some] => 1
      [the] => 1
      [be] => 1
      [for] => 1
      [to] => 2
      [is] => 2
      [sample] => 2
      [test] => 2
      [used] => 2
      [this] => 2
      [text] => 3
  ) */

?>
0 голосов
/ 22 марта 2010
  1. Разбить каждый абзац на пробелы
  2. Выберите токен из пункта A; если он в абзаце B, поместите его в массив 'match'.
  3. Повторяйте шаг 2 до тех пор, пока в пункте А не останется больше токенов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...