Классификация текста вне зависимости от ключевого слова и вывод фактического значения - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь разработать классификатор текста, который будет классифицировать фрагмент текста как Приватный или Публичный .Взять медицинскую информацию или информацию о здоровье в качестве примера домена.Типичный классификатор, о котором я могу думать, рассматривает ключевые слова как главное, не так ли?А как насчет сценария, как ниже?Что делать, если оба фрагмента текста содержат похожие ключевые слова, но имеют другое значение.

Следующий фрагмент текста раскрывает чью-то личную (медицинскую) ситуацию (у пациента рак):

Я был у двоих clinics и у меня pcp.У меня был ultrasound, только чтобы сказать, что это разрешающая способность cyst или hematoma, но она становится больше и начинает делать мою ногу ache.PCP сказал, что это не может быть cyst, потому что он начал слишком большой, и я клянусь, у меня НИКОГДА injured нет моей ноги, даже не bump.Я сейчас напуган и боюсь cancer.Я заметил немного неприятное ощущение, только когда сидел на корточках около 9 месяцев назад.3 месяца назад я пошел на корточки, чтобы убрать белье, и оно вроде hurt.pain побудило меня проверить мой leg, и тогда я заметил lump в нижней части моего голени muscle, и изгиб только сделал его более заметным.В конечном итоге после четырех clinic посещений, ultrasound и одного pcp результат кажется положительным, а масса увеличивается.
[Частный] (Правильная классификация)

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

Не пугайтесь и не принимайте ничего плохого как cancer.Я рассмотрел несколько дел в моем clinic, и он мне кажется знакомым.Как вы упомянули, это может быть cyst или hematoma, и он становится больше, для этого нужно дополнительное diagnosis, например biopsy.Наличие ache в этой области или размер lump на самом деле ничего не говорит bad.Вам следует посетить специализированный clinics еще несколько раз и пройти некоторые специальные тесты, такие как biopsy, CT scan, pcp и ultrasound, до этого lump станет больше.
[Private] (Что является неправильной классификацией. Должно быть [Публично])

Второй абзац был классифицирован как частный по всем моим нынешним классификаторам, по очевидной причине.Подобные ключевые слова, действительные последовательности слов, наличие предметов, казалось, делали классификатор очень запутанным.Даже оба содержимого содержат такие темы, как I, You (существительное, местоимение) и т. Д. Я думал о том, от Word2Vec до Doc2Vec, от значения Inferring до семантических вложений, но не могу придумать подход решения, который лучше всего подходит для этого.проблема.

Любая идея, каким образом я должен решить проблему классификации?Заранее спасибо.

Достигнутый прогресс:
Данные, которые я собрал из открытого источника, где пациенты / жертвы обычно публикуют свои собственные ситуации, и врачи / доброжелатели отвечают на них.Я предположил, что при сканировании - посты принадлежат моему частному классу, а комментарии - публичному.В общем, я начал с 5K + 5K постов / комментариев и получил около 60% с наивным байесовским классификатором без какой-либо серьезной предварительной обработки.Скоро попробую нейронную сеть.Но прежде чем перейти к какому-либо классификатору, я просто хочу узнать, как лучше провести предварительную обработку, чтобы получить разумные веса для каждого класса для лучшего различия.

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

(1) Байес действительно слабый классификатор - я бы попробовал SVM.Если вы видите улучшение, то дальнейшее улучшение может быть достигнуто с помощью нейронной сети (и, возможно, глубокого обучения)

(2) Разработка функций - используйте TFiDF и попробуйте другие вещи (многие люди предлагают Word2Vec, хотя я лично пробовал и этоне улучшилось).Также вы можете удалить стоп-слова.

Одна вещь, которую следует учитывать, потому что вы даете два анекдота, это объективно измерить уровень согласия между людьми в отношении задачи.Иногда забывают, что два человека, которым дан один и тот же текст, могут не соглашаться на ярлыках (некоторые могут сказать, что конкретный документ является частным, хотя и публичным).Просто замечание - потому что если, например, уровень согласия составляет 65%, то будет очень сложно построить более точный алгоритм.

0 голосов
/ 13 марта 2019

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

Вы упоминаете местоимения, я думаю, что это, вероятно, все еще хороший путь вперед.Если вы используете функции типа unigram / bag-of-words, убедитесь, что ваш векторизатор не удаляет их.

Выполнение подсчета экземпляров местоимений от первого лица (I, my, I've, mine) дает 13 для частного дела и 2 для общественного дела.

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

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

Кроме того, структуры предложений с начальным глаголом (Don't be ..., Having an...) характерны для языка, ориентированного на второе лицо, и могут отображаться в большей степени, чем частныеtext.

Последняя умозрительная мысль: настроения двух отрывков довольно разные, поэтому, если у вас есть доступ к анализу настроений, это может дать дополнительные подсказки.Я ожидаю, что класс Public будет более нейтральным, чем класс Private.

Подключение вашего примера Public к демонстрации Watson Tone Analyzer дает такой заметный результат:

{
  "sentence_id": 3,
  "text": "I am now scared and afraid of cancer.",
  "tones": [
    {
      "score": 0.991397,
      "tone_id": "fear",
      "tone_name": "Fear"
    }
  ]
},

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

"sentences_tone": [
    {
      "sentence_id": 0,
      "text": "Don’t be scared and do not assume anything bad as cancer.",
      "tones": [
        {
          "score": 0.874498,
          "tone_id": "fear",
          "tone_name": "Fear"
        },
        {
          "score": 0.786991,
          "tone_id": "tentative",
          "tone_name": "Tentative"
        },
        {
          "score": 0.653099,
          "tone_id": "analytical",
          "tone_name": "Analytical"
        }
      ]
    },
0 голосов
/ 08 марта 2019

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

Общие советы

  • Начните с более простых моделей (как вы, кажется, делаете) и постепенно увеличивайте их сложность, если результатынеудовлетворительныВозможно, вы захотите попробовать хорошо известный Случайный лес и xgboost , прежде чем прыгать в сторону нейронных сетей

Советы по данным

Несколько быстрых моментов, которые могут вам помочь:

  • У вас не слишком много точек данных.Если возможно, я бы посоветовал вам собрать больше данных из того же (или, по крайней мере, очень похожего) источника / дистрибутива, это, на мой взгляд, поможет вам больше всего.
  • Улучшение представления ваших данных (подробнее ниже)), второй / первый лучший вариант.
  • Вы можете попробовать использовать лемматизацию (от nltk или spaCy , но я не думаю, что это поможет в этом случае,может пропустить это.

Представление данных

Я полагаю, что ваше текущее представление Bag Of Words или TF-IDF . ЕслиВы не пробовали второй, я советую вам сделать это, прежде чем углубляться в более сложные (или это?) вещи. Вы можете легко сделать это с помощью TfidfVectorizer .

от sklearnрезультаты неудовлетворительные (и вы пробовали Случайный Лес / xgboost (или похожий, например LightGBM от Microsoft), вы должны перейти к семантическому представлению, по моему мнению.

Семантическое представление

Как вы думаетеИонед, есть представление, созданное алгоритмами word2vec или Doc2Vec (я бы оставил второй, вероятно, это не поможет).

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

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

Библиотека Flair предлагает хороший и интуитивно понятный подход к этой проблеме, если вы хотите использовать PyTorch.Если вы находитесь на стороне Tensorflow, у них есть Tensorflow Hub , который также имеет встроенные современные возможности для удобного использования.

Нейронные сети

Если это произойдетдля нейронных сетей начните с простого рекуррентного классификатора модели и используйте ячейку GRU или LSTM (в зависимости от выбранной структуры их семантика может немного отличаться).

Если этот подход все еще неудовлетворителен, вы должны взглянуть на Сети внимания , Иерархические сети внимания (один уровень внимания на предложение и другой для всего документа) или подходы на основе свертки.

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

...