Как объединить слова предложения в составленные термины? - PullRequest
2 голосов
/ 13 апреля 2009

У меня есть предложение, например

Джон Доу переехал в Нью-Йорк в прошлом году.

Теперь я разделяю предложение на отдельные слова и получаю:

массив ('Джон', 'Доу', 'переехал', 'в', 'Новый', 'Йорк', 'последний', 'год')

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

Джон, Доу, Джон Доу, переехал, Доу переехал, Джон Доу переехал, в, переехал в, Доу переехал в ...

Слова должны быть составлены в сроки до предела k частей. В приведенном выше примере ограничение равно 3. Таким образом, термин может содержать не более 3 слов.

Проблема: как я могу написать композицию на PHP? Было бы замечательно, если бы у меня была функция, которая получает предложение в качестве входных данных и выдает массив со всеми терминами в качестве выходных.

Надеюсь, вы мне поможете. Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 13 апреля 2009

Каждая композиция будет определяться начальной точкой и длиной - просто переберите.

PHP не поможет вам полностью, но у него есть несколько удобных функций.

$words = explode(" ", $sentence);
for ($start = 0; $start < count($words); $start++) //starting point
{
   //try all possible lengths
   //limit = max length
   //and of course it can't overflow the string
   for ($len = 1; $len <= $limit && $len <= count($words)-$start; $len++)
   {
      //array_slice gets a chunk of the array, and implode joins it w/ spaces
      $compositions[] = implode(" ", array_slice($words, $start, $len));
   }
}
2 голосов
/ 13 апреля 2009

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

function getPhrases($array, $maxTerms = 3) {
    for($i=0; $i < $maxTerms; $i++) { //Until we've generated terms of all lengths
         for($j = 0; $j < (sizeof($array) - $i); $j++) { //Until we've iterated as far through the array as we should go
             $termArray[] = array(array_slice($array, $j, ($i+1))); //Add this part of the array to the array
         }
    }
    return $termArray;
}

//Usage example

$newarray = explode(" ", "This is a pretty long example sentence");
print_r(getPhrases($newarray));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...