Алгоритм сходства (по теме) новостей

Я хочу определить сходство содержания двух новостей, похожих на новости Google, но разных в том смысле, что я хочу иметь возможность определить, каковы основные темы, а затем определить, какие темы связаны.

Итак, если статья была о Саддаме Хусейне, то алгоритм мог бы порекомендовать что-то о деловых отношениях Дональда Рамсфелда в Ираке.

Если вы можете просто разбросать ключевые слова, такие как k-ближайшие соседи, и небольшое объяснение того, почему они работают (если вы можете), я проведу остальную часть исследования и настрою алгоритм. Просто ищу место для начала, так как я знаю, что кто-то там, должно быть, пробовал что-то подобное раньше.


person Ankur    schedule 09.04.2009    source источник


Ответы (2)


Первые мысли:

  • отбрасывать шумовые слова (и, ты, есть, тот, какой-то, ...).
  • подсчитайте все остальные слова и отсортируйте по количеству.
  • за каждое слово в двух статьях прибавьте балл в зависимости от суммы (или произведения, или какой-то другой формулы) величин.
  • оценка представляет сходство.

Похоже, что в статье, посвященной прежде всего Дональду Рамсфелду, этих двух слов было бы довольно много, поэтому я придаю им вес в статье.

Тем не менее, может быть статья, в которой Уоррен Баффет упоминается много раз вместе с Биллом Гейтсом один раз, а в другой много раз упоминаются и Билл Гейтс, и Microsoft. Корреляция там будет минимальной.

На основании вашего комментария:

Итак, если статья была о Саддаме Хусейне, то алгоритм мог бы порекомендовать что-то о деловых отношениях Дональда Рамсфелда в Ираке.

этого бы не произошло, если бы в статье о Саддаме также не упоминался Ирак (или Дональд).

Вот с чего я бы начал, и я уже вижу потенциальные пробелы в теории (статья о Билле Гейтсе будет близко соответствовать статье о Билле Клинтоне, если их имена часто упоминаются). Об этом вполне можно позаботиться всеми другими словами (Microsoft для одного Bill, Hillary для другого).

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

Еще одним возможным улучшением может быть сохранение «жестких» ассоциаций (например, всегда добавлять слово «Афганистан» к статьям, в которых упоминается Усама бен Ладен). Но опять же, это требует дополнительного обслуживания из-за возможно сомнительной ценности, поскольку в статьях об Усаме почти наверняка упоминается и Афганистан.

person paxdiablo    schedule 09.04.2009
comment
Причина построения статей и использования евклидова расстояния заключается в том, чтобы вы могли распознать, какие из них похожи, не обязательно имея одинаковые ключевые слова. Статьи о Саддаме Хусейне и статьи Дональда Рамсфелда, вероятно, содержат Багдад, и поэтому мы можем сделать вывод о связи между ними. - person Ankur; 09.04.2009
comment
Анкур, в случае, если вы упомянули, у них было бы одно и то же ключевое слово (Багдад) - просто они не были бы общими именами Дональда или Саддама. Так что сходство все равно будет подхвачено с моим решением. Проблема в том, что статья о Рамсфелде и другая о Дональде Даке могут считаться более близкими. - person paxdiablo; 09.04.2009
comment
Если не изменить ключевые слова с «Дональд, Рамсфелд и Дак» на «Дональд Рамсфелд» и «Дональд Дак», лучше не станет. Это может быть то, где обнаружение близости становится необходимым. - person paxdiablo; 09.04.2009
comment
Я думаю, это то, о чем вы говорите: (при достаточной вычислительной мощности) вместо слов можно использовать фразы. Таким образом, любая строка между двумя пропускаемыми словами может считаться фразой, и, возможно, чем менее распространена фраза, тем выше ее ценность. - person Ankur; 09.04.2009
comment
@Ankur, это один из подходов. Другим (возможно, более простым) способом было бы просто использовать слова И группы из двух слов в качестве ключевых значений. Итак, Дональд Дак умер содержит слова {'дональд', 'утка', 'умер', 'дональд дак', 'утка умер'}. По крайней мере, это позволило бы поймать имена из двух слов с меньшими усилиями. - person paxdiablo; 10.04.2009

На данный момент я думаю о чем-то подобном.

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

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

Бааах, я думаю, набрав это, я решил свою проблему. Конечно, только на очень высоком уровне, я уверен, что когда я приступлю к этому, я найду проблемы ... дьявол всегда в деталях.

Но комментарии и улучшения по-прежнему высоко ценятся.

person Ankur    schedule 09.04.2009