Как автоматически помечать содержимое, алгоритмы и предложения, необходимые
Я работаю с некоторыми действительно большими базами данных газетных статей, у меня их в базе данных MySQL, и я могу запросить их всех.
теперь я ищу способы помочь мне пометить эти статьи несколько описательными тегами.
все эти статьи доступны по URL-адресу, который выглядит следующим образом:
http://web.site/CATEGORY/this-is-the-title-slug
поэтому, по крайней мере, я могу использовать категорию, чтобы понять, с каким типом контента мы работаем. Однако я также хочу пометить на основе текст статьи.
мой первоначальный подход делал это:
- сделать все статьи
- получить все слова, удалить все знаки препинания, разделенные пробелом, и подсчитать их по вхождению
- анализировать их, и фильтр не описательные слова, как "их", "я", "этот", "эти", "их" и т. д.
- когда все общие слова были отфильтрованы, единственное, что осталось, это слова, достойные тегов.
но это оказалось быть довольно ручной задачей, а не очень красивым или полезным подходом.
Это также пострадало от проблемы слов или имен, которые разделены пробелом, например, если 1.000 статей содержит имя "Джон Доу", а 1.000 статей содержит имя "Джон Хансон", я бы только получить слово "Джон" из него, а не его имя и фамилию.
7 ответов
автоматическое тегирование статей-это действительно исследовательская проблема и вы можете потратить много времени, чтобы изобретать колесо, когда другие уже сделали большую часть работы. Я бы посоветовал использовать один из существующих наборов инструментов обработки естественного языка, таких как в nltk.
чтобы начать работу, я бы предложил взглянуть на реализацию правильного Токенизатора (намного лучше, чем разбиение на пробелы), а затем взглянуть на Алгоритмы Чанкинга и Stemming.
вы можете также хотите подсчитать частоты для n-граммы, т. е. последовательности слов вместо отдельных слов. Это позаботится о"словах, разделенных пробелом". Наборы инструментов, такие как NLTK, имеют встроенные для этого функции.
наконец, когда вы итеративно улучшаете свой алгоритм, вы можете тренироваться на случайном подмножестве базы данных, а затем попробовать, как алгоритм помечает оставшийся набор статей, чтобы увидеть, насколько хорошо он работает.
вы должны использовать метрику, такую как tf-idf чтобы получить теги из:
- посчитать частоту каждого термина в документе. Это частота, tf (t, D). Чем чаще термин встречается в документе D, тем более важно для D.
- подсчет, за один термин, количество документов, в которых появляется термин. Это частота документа, df (t). Чем выше ПВ, тем меньше срок дискриминирует среди ваших документов и тем менее интересно.
- разделить tf на журнал df: tfidf (t, D) = tf (t, D) / log(df (D) + 1).
- для каждого документа объявите top k термины по их TF-idf оценка, чтобы быть теги для этого документа.
различные реализации tf-idf доступны; для Java и .NET есть Lucene, для Python есть scikits.учить.
Если вы хотите сделать лучше, чем это, используйте языковые модели. Это требует некоторого знания теории вероятностей.
посмотри Kea. Это инструмент с открытым исходным кодом для извлечения ключевых фраз из текста документов.
ваша проблема также обсуждалась много раз http://metaoptimize.com/qa:
Если я правильно понимаю ваш вопрос, вы хотели бы сгруппировать статьи в классы подобия. Например, вы можете назначить статью 1 "спорту", статью 2 "политике" и так далее. Или, если ваши классы намного тоньше, те же статьи могут быть назначены "Даллас Маверикс" и "президентская гонка Республиканской партии".
Это относится к общей категории алгоритмов кластеризации. Существует множество возможных вариантов таких алгоритмов, но это активная область исследование (это означает, что это не решенная проблема, и поэтому ни один из алгоритмов, вероятно, не будет работать так хорошо, как вам хотелось бы).
Я бы рекомендовал вам посмотреть на скрытое распределение Direchlet (http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation) или "ЛДА". У меня нет личного опыта работы с любой из доступных реализаций LDA, поэтому я не могу рекомендовать конкретную систему (возможно, другие более осведомленные, чем я мог бы рекомендовать удобный реализация.)
вы также можете рассмотреть агломеративные реализации кластеризации, доступные в LingPipe (см. http://alias-i.com/lingpipe/demos/tutorial/cluster/read-me.html), хотя я подозреваю, что реализация LDA может оказаться несколько более надежной.
несколько вопросов для рассмотрения во время просмотра систем кластеризации:
вы хотите разрешить членство в дробном классе-например, рассмотреть статью обсуждение экономических перспектив и их потенциального влияния на президентскую гонку; может ли этот документ частично относиться к кластеру "экономика" и частично к кластеру "выборы"? Некоторые алгоритмы кластеризации допускают частичное назначение классов, а некоторые-нет
вы хотите создать набор классов вручную (т. е. перечислить "Экономика", "Спорт",...), или вы предпочитаете изучать набор классов из данных? Ручные ярлыки типа могут требовать больше наблюдения (ручного вмешательство), но если вы решите учиться на данных, "метки", вероятно, не будут иметь смысла для человека (например, класс 1, класс 2 и т. д.), и даже содержание занятий может быть не очень информативным. То есть алгоритм обучения найдет сходства и кластерные документы, которые он считает похожими, но результирующие кластеры могут не соответствовать вашему представлению о том, что должен содержать "хороший" класс.
ваш подход кажется разумным, и есть два способа улучшить тегирование.
- используйте известный список ключевых слов / фраз для тегирования, и если количество экземпляров этого слова / фразы больше порога (возможно, на основе длины статьи), то включите тег.
- использовать выделение частей речи по алгоритму чтобы помочь уменьшить статью в разумный набор фраз и использовать разумный метод для извлечения тегов из этот. Как только вы уменьшите статьи с помощью такого алгоритма, вы сможете определить некоторые хорошие слова/фразы-кандидаты для использования в списке ключевых слов/фраз для метода 1.
Если содержание изображения или видео, пожалуйста, ознакомьтесь со следующей статьей блога:
http://scottge.net/2015/06/30/automatic-image-and-video-tagging/
существует в основном два подхода для автоматического извлечения ключевых слов из изображений и видео.
- обучение нескольким экземплярам (MIL)
- глубокие нейронные сети (DNN), рекуррентные нейронные сети (RNN) и варианты
в блоге выше статья, я перечисляю последние исследовательские работы, чтобы проиллюстрировать решения. Некоторые из них даже включают демо-сайт и исходный код.
Если содержимое представляет собой большой текстовый документ, ознакомьтесь с этой статьей в блоге:
лучший API извлечения ключевых фраз на рынке http://scottge.net/2015/06/13/best-key-phrase-extraction-apis-in-the-market/
Спасибо, Скотт
предполагая, что у вас есть заранее определенный набор тегов, вы можете использовать API Elasticsearch Percolator, как этот ответ предлагает:
Elasticsearch - используйте индекс "теги", чтобы обнаружить все теги в данной строке