Каковы полезные алгоритмы ранжирования для документов без ссылок?

Я рассмотрел Алгоритмы Интеллектуальной Сети, которые описывают (стр. 55) интересный алгоритм - DocRank - для создания PageRank как оценка для деловых документов (т.е. документы без ссылок, таких как PDF, документы MS Word и т.д.). Короче говоря, он анализирует пересечение частот между каждым документом в коллекции.

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

Пожалуйста, не отвечайте на вопросы, связанные с отслеживанием кликов или другими действиями НЕ об анализе фактических документов.

Ответы

Ответ 1

Первая техника: пошаговое сходство

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

Мы обнаружили, что сочетание пересечения низкочастотного ключевого слова в сочетании с сходством между читателями/зрителями документа является довольно сильным предиктором содержимого документа. Иными словами: если в двух документах имеется аналогичный набор очень низкочастотных терминов (например, термины, специфичные для домена, например "многообразие решений" и т.д.), И они имеют одинаковые профили входящего трафика, эта комбинация является сильным доказательством сходства документов.

Соответствующие детали:

первый фильтр: низкочастотные термины. Мы проанализировали большой набор документов, чтобы получить частоту термина для каждого. Мы использовали частотный спектр этого слова как "отпечаток пальца", который является общим, но мы применили обратное взвешивание, так что общие термины ( "a", "of", "the" ) очень мало учитывались в меризме подобия, тогда как редкие термины подсчитывали много (это довольно часто, как вы, наверное, знаете).

Попытка определить, были ли сходны два документа на основе этого, было проблематичным; например, два документа могут делиться списком редких терминов, относящихся к ММО, и все же документы не были похожи, потому что один из них направлен на воспроизведение ММО, а другой - на их разработку.

второй фильтр: считыватели. Очевидно, мы не знаем, кто читал эти документы, поэтому мы вывели читателей из источников трафика. Вы можете видеть, как это помогло в приведенном выше примере. Входящий трафик для сайта/документа игрока MMO отражал содержимое, равно как и для документа, направленного на дизайн MMO.


Вторая техника: анализ основных компонентов ядра (kPCA)

kPCA - это неконтролируемый метод (метки классов удаляются из данных до передачи данных). В основе метода лежит только разложение матрицы на основе собственных векторов (в этом случае ковариационная матрица). Этот метод обрабатывает нелинейность с помощью трюка ядра, который просто отображает данные в пространство с более высокой размерностью, а затем выполняет PCA в этом пространстве. В Python/NumPy/SciPy это около 25 строк кода.

Данные собираются из очень простого текстового разбора литературных произведений - в частности, большинство опубликованных работ этих четырех авторов: Шекспира, Джейн Остин, Джек Лондон, Милтон. (Я считаю, хотя я не уверен, что обычные студенты колледжа берут курс, в котором им поручено читать романы этих авторов.)

Этот набор данных широко используется в ML и доступен из нескольких мест в Интернете.

Итак, эти работы были разделены на 872 штуки (что примерно соответствует главам романов); другими словами, около 220 различных существенных фрагментов текста для каждого из четырех авторов.

Затем для комбинированного текста тела выполнялось сканирование частоты слов, а для исследования было выбрано 70 наиболее распространенных слов, остальные результаты сканирования частоты были отброшены.

Эти 70 слов были:

[ 'a', 'all', 'also', 'an', 'and', 'any', 'are', 'as', 'at', 'be', 'been',
  'but', 'by', 'can', 'do', 'down', 'even', 'every', 'for', 'from', 'had',
  'has', 'have', 'her', 'his', 'if', 'in', 'into', 'is', 'it', 'its', 'may',
  'more', 'must', 'my', 'no', 'not', 'now', 'of', 'on', 'one', 'only', 'or', 
  'our', 'should', 'so', 'some', 'such', 'than', 'that', 'the', 'their', 
  'then', 'there', 'things', 'this', 'to', 'up', 'upon', 'was', 'were', 'what',
  'when', 'which', 'who', 'will', 'with', 'would', 'your', 'BookID', 'Author' ]

Они стали именами полей (столбцов). Наконец, была подготовлена ​​одна строка данных, соответствующая 872 текстам (из усеченного сканирования частоты слов). Здесь один из этих точек данных:

[ 46, 12, 0, 3, 66, 9, 4, 16, 13, 13, 4, 8, 8, 1, 0, 1, 5, 0, 21, 12, 
  16, 3, 6, 62, 3, 3, 30, 3, 9, 14, 1, 2, 6, 5, 0, 10, 16, 2, 54, 7, 8,
  1, 7, 0, 4, 7, 1, 3, 3, 17, 67, 6, 2, 5, 1, 4, 47, 2, 3, 40, 11, 7, 5,
  6, 8, 4, 9, 1, 0, 1 ]

В сумме данные состоят из 70 измерений (каждый размер представляет собой частоту или общий счет конкретного слова в данном тексте одного из этих четырех авторов.

Опять же, хотя эти данные в основном используются для контролируемой классификации (метки классов существуют по какой-либо причине), метод, который я использовал, был неконтролируемый - по-другому, я никогда не показывал метки классов к алгоритму. Алгоритм kPCA не имеет абсолютно никакого представления о том, что соответствуют этим четырем различным кластерам (показанным на графике ниже) и как каждый отличается от другого - алгоритм даже не знал, сколько групп (классов) были связаны с данными. Я просто дал ему данные, и он очень аккуратно разбил его на четыре группы, основанные на неотъемлемом порядке.

Результаты: alt text

Опять же, используемый здесь алгоритм - это kPCA. Используя Python, NumPy и Matplotlib, script, который произвел эти результаты, составляет около 80 строк кода - для ввода-вывода, обработки данных, применения kPCA и построения результата.

Не много, но слишком много для SO-сообщения. В любом случае любой, кто хочет этот код, может получить его из моего репо. В то же время существует также полный, хорошо документированный алгоритм kPCA, закодированный в python + numpy в каждом из этих пакетов python (все доступные из mloss.org): сёгун ( "Инструмент для обучения большому масштабу машинного обучения" ), sdpy (набор модулей, предназначенных для компьютерного зрения и машинного обучения) и mlpy ( "Машиноведение в PYthon" ).

Ответ 2

Еще один интересный алгоритм - TextRank - звучит очень похоже на DocRank, на который ссылается исходный вопрос. Графический, неконтролируемый, итерация до конвергенции.

Java-реализация.

Ответ 3

Я провел несколько дополнительных исследований по этой теме и нашел запись в Wikipedia для алгоритма Okapi BM25. Он также имеет преемника BM25F, который учитывает структуру документа, но это, по-видимому, более уместно для HTML/XML.

BM25 Включает:

  • средняя длина документа в коллекции,
  • длина конкретного документа
  • срочная частота

Наконец, запись в Википедии ссылается на реализацию Lucene.

По сравнению с ответами @Doug выше это представляется более сложным алгоритмом для реализации.

Ответ 4

Вот некоторые алгоритмы для ранжирования, хотя я еще не видел никаких реализаций.