PHP библиотека для кластеризации слов / НЛП? - PullRequest
7 голосов
/ 02 ноября 2011

Я пытаюсь реализовать довольно простую программу «взять результаты поиска (как в заголовке и кратком описании), разбить их на значимые именованные группы» в PHP.

После нескольких часов поисков в Google и бесчисленных поисков в SO (дающих интересные результаты, как всегда, хотя и не особо полезных), я все еще не могу найти какую-либо библиотеку PHP, которая бы помогла мне справиться с кластеризацией.

  • Существует ли такая библиотека PHP, которую я мог бы пропустить?
  • Если нет, то есть ли FOSS, который обрабатывает кластеризацию и имеет достойный API?

Ответы [ 6 ]

5 голосов
/ 14 ноября 2011

Как это:

Использование списка стоп-слов, получение всех слов или фраз, не входящих в стоп-слова, подсчет вхождений каждого из них, сортировка по убыванию.

Стоп-слова должны быть списком всех распространенных английских терминов. Он также должен включать пунктуацию, и вам нужно будет предварительно поместить все знаки препинания в preg_replace, чтобы они сначала были отдельными словами, например "Что-то вроде этого." -> «Нечто подобное». ИЛИ, вы можете просто удалить все знаки препинания.

$content=preg_replace('/[^a-z\s]/', '', $content); // remove punctuation

$stopwords='the|and|is|your|me|for|where|etc...';
$stopwords=explode('|',$stopwords);
$stopwords=array_flip($stopwords);

$result=array(); $temp=array();
foreach ($content as $s)
if (isset($stopwords[$s]) OR strlen($s)<3)
 {
 if (sizeof($temp)>0)
  {
  $result[]=implode(' ',$temp);
  $temp=array();
  }            
 } else $temp[]=$s;
if (sizeof($temp)>0) $result[]=implode(' ',$temp);

$phrases=array_count_values($result);
arsort($phrases);

Теперь у вас есть ассоциативный массив в порядке частоты терминов, встречающихся в ваших входных данных.

То, как вы хотите сделать совпадения, зависит от вас, и это во многом зависит от длины строк во входных данных.

Я бы посмотрел, совпадают ли какие-либо из трех верхних ключей массива с какими-либо из первых трех от любых других данных. Это ваши группы.

Дайте мне знать, если у вас есть какие-либо проблемы с этим.

2 голосов
/ 02 ноября 2011

«... объединить их в осмысленные группы» немного расплывчато, вам нужно быть более конкретным.

Для начала вы можете взглянуть на кластеризацию K-Means.

Посмотрите на эту страницу и веб-сайт:

PHP / irInformation Retrieval и другие интересные темы

РЕДАКТИРОВАТЬ : Вы можете попробовать провести интеллектуальный анализ данных, сопоставив результаты поиска с чем-то вроде открытого каталога dmoz Дамп данных RDF и затем перечислить соответствующие категории.

EDIT2 : А вот вопрос dmoz / category, в котором также упоминается «Фасетный поиск»! ​​

Алгоритм Dmoz / Monster для подсчета количества каждой категории и подкатегории?

1 голос
/ 09 ноября 2011

Вы также можете взглянуть на Программирование Коллективного Разума (Глава 3: Обнаружение групп) Тоби Сегарана, который рассматривает только этот сценарий использования Python. Тем не менее, вы должны быть в состоянии реализовать вещи в PHP, как только вы поймете, как это работает.

Несмотря на то, что это не PHP, проект Carrot2 предлагает несколько механизмов кластеризации и может быть интегрирован с Solr.

1 голос
/ 09 ноября 2011

Если вы делаете это только для английского языка, вы можете использовать WordNet: http://wordnet.princeton.edu/. Это лексикон, широко используемый в исследованиях, который предоставляет, среди прочего, наборы синонимов для английских слов.Кратчайшее расстояние между двумя словами может служить метрикой сходства для кластеризации самостоятельно, как предложил zaf.

Очевидно, здесь есть PHP-интерфейс для WordNet: http://www.foxsurfer.com/wordnet/. Он возник в этом вопросе: Как использовать слово Net с php , но я не пробовал.Однако также возможно взаимодействие с инструментом командной строки из PHP самостоятельно.

0 голосов
/ 12 ноября 2011

Если вы можете заранее определить фильтры для своего поиска (именованные группы), тогда это будет намного проще.

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

В результате вы получите таблицу (или что-то в этом роде) URL-адресов в соединении «многие ко многим» с таблицей тегов, поэтому каждый URL-адрес результата может иметь несколько соответствующих тегов.

Когда пользователь выполняет поиск, вы просто сопоставляете его поиск с полным индексом. Но для фильтров вы берете лучшие результаты из текущего набора результатов.

Я буду работать с примерами запросов, если хотите.

0 голосов
/ 09 ноября 2011

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

Я несколько раз использовал эту библиотеку в php, и с ней всегда было довольно легко работать.

Опять же, может не иметь отношения к тому, что вы пытаетесь сделать. Может быть, вы могли бы опубликовать пример того, что вы пытаетесь достичь?

...