Как автоматически пометить контент, алгоритмы и предложения, необходимые - PullRequest
27 голосов
/ 18 мая 2011

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

Сейчас я ищу способы помочь мне пометить эти статьи несколько описательными тегами.

Все эти статьи доступны с URL-адреса, который выглядит следующим образом:

http://web.site/CATEGORY/this-is-the-title-slug

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

Мой первоначальный подход заключался в следующем:

  1. Получить все статьи
  2. Получить все слова, удалить все знаки препинания, разделить их пробелом и сосчитать их по вхождению
  3. Проанализируйте их и отфильтруйте общие неописательные слова, такие как «они», «я», «это», «это», «их» и т. Д.
  4. Когда все общие слова были отфильтрованы, единственное, что осталось, это слова, достойные тега.

Но это оказалось довольно ручной задачей, а не очень симпатичным или полезным подходом.

Это также страдает от проблемы слов или имен, разделенных пробелами, например, если в 1000 статей содержится имя «Джон Доу», а в 1000 статей содержится имя «Джон Хансон», я получу только слово «Джон» из этого, не его имя, а фамилия.

Ответы [ 8 ]

20 голосов
/ 18 мая 2011

Автоматическая пометка статей - это действительно исследовательская проблема, и вы можете потратить много времени на то, чтобы заново изобрести колесо, когда другие уже проделали большую часть работы. Я бы посоветовал использовать один из существующих наборов инструментов для обработки естественного языка, например NLTK .

Чтобы начать, я бы посоветовал взглянуть на реализацию правильного токенизатора (гораздо лучше, чем расщепление по пробелам), а затем взглянуть на алгоритмы Chunking и Stemming.

Вы также можете посчитать частоты для н-граммов , то есть последовательности слов, а не отдельных слов. Это позаботится о «словах, разделенных пробелом». Инструментарий, такой как NLTK, имеет встроенные функции для этого.

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

9 голосов
/ 18 мая 2011

Вы должны использовать метрику, такую ​​как tf-idf , чтобы получить теги:

  1. Подсчитайте частоту каждого термина в документе. Это термин частоты , тс ( т , D ). Чем чаще термин встречается в документе D , тем важнее он для D .
  2. Количество, за термин, количество документов, в которых появляется термин. Это частота документов , df ( t ). Чем выше df, тем меньше термин различает среди ваших документов и тем менее он интересен.
  3. Разделите tf на лог df: tfidf ( t , D ) = tf ( t , D ) / log (дф ( D ) + 1).
  4. Для каждого документа объявите верхние k термины по их счету tf-idf как теги для этого документа.

Доступны различные реализации tf-idf; для Java и .NET есть Lucene, для Python есть scikits.learn.

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

6 голосов
/ 19 мая 2011

Взгляните на Кеа .Это инструмент с открытым исходным кодом для извлечения ключевых фраз из текстовых документов.

Ваша проблема также много раз обсуждалась на http://metaoptimize.com/qa:

4 голосов
/ 19 мая 2011

Если я правильно понимаю ваш вопрос, вы бы хотели сгруппировать статьи по классам сходства.Например, вы можете назначить статью 1 «Спорт», статью 2 «Политика» и т. Д.Или, если ваши классы намного более детализированы, те же статьи могут быть назначены на 'Dallas Mavericks' и 'GOP Presidential Race'.

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

Я бы порекомендовал вам посмотреть Распределение скрытого директела (http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation) или 'LDA'. У меня нет личного опыта ни с одной из доступных реализаций LDA, поэтому я не могу рекомендовать конкретную систему (возможно, другие, более осведомленные).чем я мог бы порекомендовать удобную для пользователя реализацию.)

Вы также можете рассмотреть реализации агломерационной кластеризации, доступные в LingPipe (см. http://alias -i.com / lingpipe / demos / tutorial /cluster / read-me.html ), хотя я подозреваю, что реализация LDA может оказаться несколько более надежной.

Пара вопросов, которые следует рассмотреть при рассмотрении систем кластеризации:

  • Хотите ли вы разрешить дробное членство в классе - например, рассмотрите статью, в которой обсуждаются экономические перспективы ипотенциальное влияние на президентскую гонку;может ли этот документ частично принадлежать кластеру «экономики» и частично кластеру «выборов»?Некоторые алгоритмы кластеризации допускают частичное назначение классов, а некоторые не

  • Хотите ли вы создать набор классов вручную (т. Е. Вывести список «эконом», «спорт», ...)Или вы предпочитаете изучать набор классов по данным?Ручные метки классов могут требовать большего надзора (ручного вмешательства), но если вы решите учиться на данных, «метки», скорее всего, не будут иметь смысла для человека (например, класс 1, класс 2 и т. Д.), И дажесодержание классов не может быть очень информативным.То есть алгоритм обучения найдет сходства и документы кластера, которые он считает похожими, но полученные кластеры могут не соответствовать вашему представлению о том, что должен содержать «хороший» класс.

2 голосов
/ 01 июля 2015

Если контент представляет собой изображение или видео, ознакомьтесь со следующей статьей блога:

http://scottge.net/2015/06/30/automatic-image-and-video-tagging/

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

  1. Обучение нескольких экземпляров (MIL)
  2. Глубокие нейронные сети (DNN), Рекуррентные нейронные сети (RNN) и варианты

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

Если содержимое представляет собой большой текстовый документ, ознакомьтесь с этой статьей блога:

Лучшие API для извлечения ключевых фраз на рынке http://scottge.net/2015/06/13/best-key-phrase-extraction-apis-in-the-market/

Спасибо, Скотт

2 голосов
/ 18 мая 2011

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

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

Предполагая, что у вас есть предопределенный набор тегов, вы можете использовать Elasticsearch Percolator API, как показано в этом ответе:

Elasticsearch - используйте индекс "тегов", чтобы обнаружить все теги в данной строке

0 голосов
/ 22 февраля 2019

Вы говорите о распознавании имени-сущности? если так, то Анупам Джайн прав. Это проблема исследования с использованием глубокого обучения и CRF. В 2017 году проблема распознавания имени и сущности - это сила в технологии обучения полусюрприза.

Ссылка ниже относится к бумаге: http://ai2 -website.s3.amazonaws.com / публикация / полуобучаемый-sequence.pdf

Кроме того, ссылка ниже - это извлечение ключевых фаз в твиттере: http://jkx.fudan.edu.cn/~qzhang/paper/keyphrase.emnlp2016.pdf

...