#python #machine-learning #nlp #data-science
#python #машинное обучение #nlp #наука о данных
Вопрос:
Я подрабатываю написанием / улучшением веб-приложения для исследовательского проекта для некоторых политологов. Это приложение собирает статьи, относящиеся к Верховному суду США, и проводит по ним анализ, и спустя почти полтора года у нас есть база данных, насчитывающая около 10 000 статей (и постоянно растущая) для работы.
Одной из основных задач проекта является определение «релевантности» статьи, то есть основное внимание уделяется федеральному Верховному суду США (и / или его судьям), а не местному или иностранному верховному суду. С момента его создания мы обращались к нему, в первую очередь анализируя заголовок на предмет различных явных ссылок на федеральный суд, а также проверяя, что «верховный» и «суд» являются ключевыми словами, взятыми из текста статьи. Простой и неаккуратный, но на самом деле работает довольно хорошо. При этом в базу данных могут попадать нерелевантные статьи — обычно те, в заголовках которых явно не упоминается штат или иностранная страна (обычным нарушителем является Верховный суд Индии).
Я достиг той точки в разработке, когда могу больше сосредоточиться на этом аспекте проекта, но я не совсем уверен, с чего начать. Все, что я знаю, это то, что я ищу метод анализа текста статьи, чтобы определить его релевантность федеральному суду, и ничего больше. Я предполагаю, что это повлечет за собой некоторое машинное обучение, но у меня в принципе нет опыта в этой области. Я немного ознакомился с такими вещами, как взвешивание tf-idf, моделирование векторного пространства и word2vec ( модели CBOW и Skip-Gram), но я пока не совсем вижу «общую картину», которая показывает мне, насколько эти концепции могут быть применимы к моей проблеме. Кто-нибудь может указать мне правильное направление?
Ответ №1:
Формулирование проблемы
При запуске нового проекта машинного обучения, подобного этому, необходимо продумать несколько фундаментальных вопросов, которые помогут вам уточнить проблему и более эффективно провести обзор эксперимент.
-
У вас есть нужные данные для построения модели? У вас есть ~ 10 000 статей, которые будут вашими входными данными для модели, однако для использования подхода к обучению под наблюдением вам понадобятся заслуживающие доверия ярлыки для всех статей, которые будут использоваться при обучении модели. Похоже, вы это уже сделали.
-
Какие показатели использовать для количественной оценки успеха. Как вы можете измерить, делает ли ваша модель то, что вы хотите? В вашем конкретном случае это звучит как проблема двоичной классификации — вы хотите иметь возможность помечать статьи как релевантные или нет. Вы могли бы измерить свой успех, используя стандартную метрику двоичной классификации, такую как area в ROC. Или, поскольку у вас есть конкретная проблема с ложными срабатываниями, вы могли бы выбрать такой показатель, как точность.
-
Насколько хорошо вы можете использовать случайный или наивный подход. Как только набор данных и метрика установлены, вы можете количественно оценить, насколько хорошо вы можете выполнить свою задачу с помощью базового подхода. Это может быть просто, как вычисление вашей метрики для модели, которая выбирается случайным образом, но в вашем случае у вас есть модель синтаксического анализа ключевых слов, которая является идеальным способом установить контрольный показатель. Определите, насколько хорошо ваш подход к анализу ключевых слов подходит для вашего набора данных, чтобы вы могли определить, когда модель машинного обучения работает хорошо.
Извините, если это было очевидно и базово для вас, но я хотел убедиться, что это было в ответе. В инновационном проекте открытого типа, подобном этому, погружение сразу в эксперименты по машинному обучению без продумывания этих основ может быть неэффективным.
Подходы к машинному обучению
Как предложили Эван Мата и Стефан Джи, лучший подход — сначала сократить ваши статьи до функциональных возможностей. Это можно было бы сделать без машинного обучения (например, модель векторного пространства) или с помощью машинного обучения (word2vec и другие приведенные вами примеры). Для вашей проблемы, я думаю, имеет смысл попробовать что-то вроде BOW в качестве отправной точки.
Как только у вас появится функциональное представление ваших статей, вы почти закончили, и есть несколько моделей бинарной классификации, которые подойдут хорошо. Поэкспериментируйте здесь, чтобы найти лучшее решение.
В Википедии есть хороший пример простого способа использования этого двухэтапного подхода при фильтрации спама, аналогичной проблеме (см. раздел «Пример использования» статьи).
Удачи, звучит как забавный проект!
Ответ №2:
Если у вас достаточно помеченных данных — не только для «да, эта статья релевантна», но и для «нет, эта статья не релевантна» (вы в основном создаете двоичную модель между y / n релевантными — поэтому я бы исследовал фильтры спама), тогда вы можете подготовить справедливую модель. Я не знаю, действительно ли у вас приличное количество данных без данных. Если вы это сделаете, вы могли бы обучить относительно простую контролируемую модель, выполнив (pesudocode) следующее:
Corpus = preprocess(Corpus) #(remove stop words, etc.)
Vectors = BOW(Corpus) #Or TFIDF or Whatever model you want to use
SomeModel.train(Vectors[~3/4 of them], Labels[corresponding 3/4]) #Labels = 1 if relevant, 0 if not
SomeModel.evaluate(Vectors[remainder], Labels[remainder]) #Make sure the model doesn't overfit
SomeModel.Predict(new_document)
Точная модель будет зависеть от ваших данных. Простой наивный Байес мог бы (вероятно, будет) работать нормально, если вы сможете получить приличное количество бездокументов. Одно замечание — вы подразумеваете, что у вас есть два вида отсутствия документов — те, которые достаточно близки (Верховный суд Индии), или те, которые совершенно не имеют отношения к делу (скажем, налоги). Вы должны протестировать обучение с «близкими» ошибочными случаями, отфильтровав «далеко» ошибочные случаи, как вы делаете сейчас, по сравнению как с «близкими» ошибочными случаями, так и с «далеко» ошибочными случаями, и посмотреть, какой из них получается лучше.
Комментарии:
1. Пакет python scikit-learn очень хорош для реализации простых алгоритмов (таких как naive bayes) и должен отлично подойти для вашего случая. SpaCy amp; NLTK — это пакеты python, которые могут выполнять немного простую предварительную обработку (удаление стоп-слов, а также лемматизацию / стемминг). Обучение базовой модели действительно заняло бы всего около 10 строк в sklearn.
Ответ №3:
Существует множество способов сделать это, и наилучший метод меняется в зависимости от проекта. Возможно, самый простой способ сделать это — выполнить поиск по ключевым словам в ваших статьях, а затем эмпирически выбрать предельную оценку. Несмотря на простоту, это на самом деле работает довольно хорошо, особенно в теме, подобной этой, где вы можете придумать небольшой список слов, которые с высокой вероятностью появятся где-нибудь в соответствующей статье.
Когда тема более широкая, с чем-то вроде «бизнес» или «спорт», поиск по ключевым словам может быть чрезмерно сложным и отсутствовать. Именно тогда подход машинного обучения может начать становиться лучшей идеей. Если вы хотите пойти по пути машинного обучения, то есть два шага:
- Встраивайте свои статьи в векторы объектов
- Обучите свою модель
Шаг 1 может быть чем-то простым, например, вектором TFIDF. Однако внедрение ваших документов само по себе также может быть глубоким изучением. Здесь в игру вступают CBOW и Skip-Gram. Популярным способом сделать это является Doc2Vec (PV-DM). Прекрасная реализация находится в библиотеке Python Gensim. Современные и более сложные встраивания символов, word и document — это гораздо более сложная задача для начала, но очень полезная. Примерами этого являются вложения ELMo или BERT.
Шаг 2 может быть типичной моделью, поскольку теперь это просто двоичная классификация. Вы можете попробовать многослойную нейронную сеть, либо полностью связанную, либо сверточную, или вы можете попробовать более простые вещи, такие как логистическая регрессия или наивный Байес.
Моим личным предложением было бы придерживаться векторов TFIDF и наивных байесовских алгоритмов. По опыту могу сказать, что это работает очень хорошо, на сегодняшний день проще всего реализовать и может даже превзойти такие подходы, как CBOW или Doc2Vec, в зависимости от ваших данных.
Комментарии:
1. Хотя я думаю, что CBOW, Skip-Gram, ELMo, BERT amp; Doc2Vec хороши, а также многослойные NN (нейронные сети) или сверточные NN, я бы посоветовал этим пользователям избегать их — похоже, они очень новые и что их простая логика до сих пор была почти достаточно хорошей. Поэтому я бы рекомендовал придерживаться TFIDF или обычных алгоритмов BOW amp; simple, отличных от NN ML, таких как наивный Байес или деревья решений / леса.