Концепции, чтобы измерить «релевантность» текста к предмету? - PullRequest
1 голос
/ 28 марта 2019

Я занимаюсь дополнительной работой над написанием / улучшением веб-приложения исследовательского проекта для некоторых политологов. Это приложение собирает статьи, относящиеся к Верховному суду США, и анализирует их, и спустя почти полтора года у нас есть база данных из примерно 10 000 статей (и их число увеличивается).

Одной из основных задач проекта является возможность определения «актуальности» статьи, то есть основной задачей является федеральный Верховный суд США (и / или его судьи), а не местный или иностранный Верховный суд. С момента его создания мы решили, прежде всего, проанализировать заголовок для различных явных ссылок на федеральный суд, а также проверить, что "верховный" и "суд" - это ключевые слова, собранные из текста статьи. Простой и небрежный, но на самом деле он работает довольно хорошо. При этом, не относящиеся к делу статьи могут попасть в базу данных - как правило, статьи с заголовками, в которых явно не упоминается штат или иностранная страна (Верховный суд Индии является обычным преступником).

Я достиг стадии разработки, когда могу больше сосредоточиться на этом аспекте проекта, но я не совсем уверен, с чего начать. Все, что я знаю, - это то, что я ищу метод анализа текста статьи, чтобы определить его актуальность для федерального суда, и ничего больше. Я предполагаю, что это повлечет за собой некоторое машинное обучение, но я в основном не имею никакого опыта в этой области. Я немного изучил такие вещи, как взвешивание tf-idf, моделирование векторного пространства и word2vec (+ модели CBOW и Skip-Gram), но пока не вижу «общую картину», которая показывает мне, как именно применимы эти понятия могут быть к моей проблеме. Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Если у вас достаточно помеченных данных - не только для «да, эта статья актуальна», но и для «нет, эта статья не актуальна» (вы в основном делаете бинарную модель между у / п релевантными - так что я бы исследовалфильтры спама) тогда можно обучить честную модель.Я не знаю, есть ли у вас приличное количество данных.Если вы это сделаете, вы можете обучить относительно простую контролируемую модель, выполнив (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) 

Точная модель будет зависеть от ваших данных.Простой Naive-Bayes может (вероятно, будет) работать нормально, если вы можете получить приличное количество документов без документов.Одно замечание - вы подразумеваете, что у вас есть два вида недокументированных документов: те, которые достаточно близки (Верховный суд Индии), или те, которые совершенно не имеют отношения к делу (например, налоги).Вы должны проверить обучение с «закрытыми» ошибочными случаями с отфильтрованными «далекими» ошибочными случаями, как вы это делаете сейчас, как с «закрытыми» ошибочными случаями, так и с «далекими» ошибочными случаями, и посмотреть, какой из них получится лучше.

1 голос
/ 28 марта 2019

Обрамление проблемы

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

  1. У вас есть правильные данные для построения модели? У вас есть ~ 10000 статей, которые будут вашими входными данными для модели, однако, чтобы использовать контролируемый подход к обучению, вам понадобятся надежные ярлыки для всех статей, которые будут использоваться при обучении модели. Похоже, вы уже сделали это.

  2. Какие метрики используются для количественной оценки успеха. Как вы можете измерить, если ваша модель делает то, что вы хотите? В вашем конкретном случае это звучит как проблема бинарной классификации - вы хотите иметь возможность пометить статьи как релевантные или нет. Вы можете измерить свой успех, используя стандартную метрику двоичной классификации, например область под ROC . Или, поскольку у вас есть конкретная проблема с ложными срабатываниями, вы можете выбрать метрику, такую ​​как Precision .

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

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

Подходы машинного обучения

Как подсказывают Эван Мата и Стефан Дж, лучший подход - сначала превратить ваши статьи в функции. Это может быть сделано без машинного обучения (например, модели векторного пространства) или с помощью машинного обучения (word2vec и других приведенных вами примеров). Для вашей проблемы, я думаю, что-то вроде BOW имеет смысл попробовать в качестве отправной точки.

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

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

Удачи, звучит как забавный проект!

1 голос
/ 28 марта 2019

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

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

  1. Вставьте ваши статьи в векторы функций
  2. Тренируй свою модель

Шаг 1 может быть чем-то простым, например, вектором TFIDF. Тем не менее, встраивание ваших документов также может быть глубоким изучением самостоятельно. Здесь вступают в игру CBOW и Skip-Gram. Популярный способ сделать это - Doc2Vec (PV-DM). Хорошая реализация в библиотеке Python Gensim. Современные и более сложные вложения символов, слов и документов представляют собой гораздо более сложную задачу, но они очень полезны. Примерами этого являются вложения ELMo или BERT.

Шаг 2 может быть типичной моделью, поскольку теперь это просто двоичная классификация. Вы можете попробовать многослойную нейронную сеть, либо полностью подключенную, либо сверточную, или вы можете попробовать более простые вещи, такие как логистическая регрессия или наивный байесовский эффект.

Мое личное предложение - придерживаться векторов TFIDF и Наивного Байеса. Исходя из опыта, я могу сказать, что это работает очень хорошо, намного проще в реализации и может даже превзойти такие подходы, как CBOW или Doc2Vec, в зависимости от ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...