Как я могу узнать наиболее часто используемую комбинацию из 2 слов в блоке текста?

Как я могу узнать, какие два наиболее распространенных слова, которые я использовал сразу после друг друга, из блока текста? Другими словами, есть ли инструмент онлайн или офлайн (или код), где я могу копировать и вставлять текст, и он выводит мою наиболее часто используемую частоту двух слов, например:

От наиболее используемых к наименее:

«кошка» 2,9% «она сказала» 1,8% «пошла» 1,2%

Спасибо


person Mark    schedule 11.02.2011    source источник
comment
Нет, это не домашнее задание. Это для проекта, над которым я сейчас работаю.   -  person Mark    schedule 12.02.2011


Ответы (2)


  1. Разделите текст на две пары слов (используйте substr и strpos вам в помощь)

    • find the second index of a space, using strpos, and then substring between the beginning and the second space index to get the two word pair.
  2. Добавьте каждую пару на карту или набор (пара будет ключом) и установите значение (если оно уже существует на карте, увеличьте значение
  3. После того, как вы проанализировали весь текст, рассчитайте проценты на основе размера карты/набора и значения для каждой пары.
person Codemwnci    schedule 11.02.2011
comment
Спасибо за быстрый ответ Codemwnci, ​​но не могли бы вы предоставить пример кода php. Или, если вы не слишком заняты, я могу заплатить вам за создание этого простого сценария. Спасибо - person Mark; 12.02.2011
comment
@Codemwnci: Может быть проще использовать preg_split() на этапе 1, чтобы разбить слова. Затем перейдите ко второму слову, используя предыдущее и текущее. - person Orbling; 12.02.2011
comment
@Mark: Это сайт вопросов и ответов, а не сайт для найма фрилансеров. - person Orbling; 12.02.2011
comment
@Mark: Проблема в том, что это похоже на домашнюю работу - теперь это не так уж и плохо. Но люди, как правило, не будут делать это за вас, но укажут вам правильное направление, если вы продемонстрируете, что думали об этом и застряли. - person Orbling; 12.02.2011
comment
Привет, Орблинг, я не уверен, что ты имеешь в виду под домашним заданием. Мне это нужно для проекта, над которым я сейчас работаю. К сожалению, я не знаю, как выполнить шаги Codemwnci. Я бы с удовольствием заплатил кому-нибудь небольшую денежную сумму за этот простой вкус, но это звучит так, как будто это противоречит правилам сайта. Но я ценю вашу помощь. - person Mark; 12.02.2011
comment
+1, это именно тот метод, который я использовал, кроме регулярного выражения - person RobertPitt; 12.02.2011

Это было весело, но я немного поработал над этим, это должно помочь вам начать и не должно быть вашим ответом.

Это в основном группировка слов по 2, индексация их в массив и увеличение найденного времени и, наконец, преобразование в процент :)

$data = 'In the first centuries of typesetting, quotations were distinguished merely by indicating the speaker, and this can still be seen in some editions of the Bible. During the Renaissance, quotations were distinguished by setting in a typeface contrasting with the main body text (often Italic type with roman, or the other way round). Block quotations were set this way at full size and full measure.
Quotation marks were first cut in type during the middle of the sixteenth century, and were used copiously by some printers by the seventeenth. In Baroque and Romantic-period books, they could be repeated at the beginning of every line of a long quotation. When this practice was abandoned, the empty margin remained, leaving an indented block quotation';

//Clean The Data from un required chars!
$data = preg_replace("/[^\w]/"," ",$data);

$segments = explode(" ",$data);
$indexes = array();

for($i=0;$i<count($segments);$i++)
{
   if($i == 0)
   {
      continue;
   }

   if(trim($segments[$i - 1]) != "" && trim($segments[$i]) != "")
   {
      $key = trim($segments[$i - 1]) . " " . trim($segments[$i]);
      if(array_key_exists($key,$indexes))
      {
          $indexes[$key]["count"]++;
      }else
      {
          $indexes[$key] = array(
              'count' => 1,
              'words' => $key
          );
      }
   }
}

//Change to the percentage:
$total_double_words = count($segments);
foreach($indexes as $id => $set)
{
    $indexes[$id]['percentage'] = number_format((($set['count']/ $total_double_words) * 100),2) . "%";
}

var_dump($indexes);

Вы можете увидеть его здесь: http://codepad.org/rcwpddW8

person RobertPitt    schedule 11.02.2011
comment
Роберт Питт, я очень ценю, что вы нашли время написать это. Это было именно то, что я искал. Да благословит тебя Бог. - person Mark; 12.02.2011
comment
Это почти то же самое, что я придумал. Единственное, что я хотел бы предложить, это заменить несколько пробелов одиночными пробелами ($data = preg_replace('/[^\w]+/', ' ', $data);). В вашем цикле, если ключ $i или $i-1 пуст, вы просто пропускаете пару, возможно, вам не хватает много пар слов из-за добавления одного пробела для каждого знака препинания (например, foo, bar станет foo bar с двумя пробелами между ними). - person Jonathan Kuhn; 12.02.2011
comment
preg_replace лучше вне цикла, так как он выполняет действие во всем контексте один раз, а $key = trim(...) удаляет невидимые символы слева + справа от каждого слова, что означает, что ни одно слово не сопровождается пробелами, мой код не должен быть идеальным, но В качестве примера. - person RobertPitt; 12.02.2011