Классификация текста вне зависимости от ключевого слова и вывод фактического значения

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

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

Я был в двух 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 станет больше.
[Частное] (Это неправильная классификация. Должно быть [ Общедоступно])

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

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

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


person Nuhil Mehdy    schedule 04.03.2019    source источник
comment
Не могли бы вы выделить ваш текущий подход/подходы и его/их недостатки? Было бы полезно больше подробностей, чтобы не повторять то, что вы уже пробовали (с, насколько я понимаю, неудовлетворительными результатами). Здесь могут помочь такие вещи, как модели, архитектуры, используемые представления, время обучения, размер данных и т. д.   -  person Szymon Maszke    schedule 08.03.2019
comment
Данные я собрал из общедоступного источника, где пациенты/пострадавшие обычно размещают свои ситуации, а врачи/доброжелатели отвечают на них. При сканировании я предположил, что сообщения принадлежат моему частному классу, а комментарии принадлежат общедоступному классу. В целом я начал с 5K+5K постов/комментариев и получил около 60% с наивным байесовским классификатором без какой-либо серьезной предварительной обработки. Скоро попробую нейронную сеть. Но прежде чем вводить какой-либо классификатор, я просто хочу знать, как я могу лучше предварительно обработать, чтобы присвоить разумные веса любому классу для лучшего различия.   -  person Nuhil Mehdy    schedule 08.03.2019
comment
Пожалуйста, обновите свой вопрос вместо того, чтобы публиковать комментарий, он будет более читаемым для всех.   -  person Szymon Maszke    schedule 08.03.2019
comment
По правде говоря, будет сложно что-то написать, не получив больше образцов, поскольку все, что создано для этого конкретного сценария, может не сработать для другого. Например, придание большего значения словам «я», «мне» и «мой» vs «ты» может помочь провести различие в этом случае из-за того, что это с большей вероятностью указывает на то, что пациент рассказывает о своей истории болезни, которая с большей вероятностью будет содержать личную информацию. . Но это может легко потерпеть неудачу для другого разговора. Тем более мы не знаем   -  person Edeki Okoh    schedule 08.03.2019
comment
Пытаетесь ли вы отличить стартовый текст темы от ответов, не принадлежащих автору? Непонятно, в чем разница между public и private   -  person igrinis    schedule 10.03.2019


Ответы (3)


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

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

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

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

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

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

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

Включение вашего общедоступного примера в демонстрационную версию 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"
        }
      ]
    },
person scratchpad    schedule 13.03.2019

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

Общие советы

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

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

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

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

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

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

Если результаты неудовлетворительны (и вы пробовали Random Forest/xgboost (или аналогичный, например, LightGBM от Microsoft), на мой взгляд, следует перейти к семантическому представлению.

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

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

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

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

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

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

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

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

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

person Szymon Maszke    schedule 07.03.2019

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

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

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

person user1854182    schedule 12.03.2019