Что это?

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

Маркировка части речи - это задача, которую мы находим в Обработке естественного языка (NLP), которая используется для прогнозирования структуры текста, чтобы помочь определить значение. При правильном понимании компонентов предложения и того, как слова сочетаются друг с другом, он помогает нам эффективно собирать информацию или классифицировать текст. Но давайте посмотрим на эти предложения:

Из яблок получится невероятный пирог.

Apple делает невероятный телефон.

Хотя это и есть существительные, люди могут прочитать это и легко различить разницу. Первые предложения говорят о фруктах, а второе - о компании. Здесь и появляется распознавание именованных сущностей (NER). Это подзадача в тегах части речи, которая направлена ​​на идентификацию таких вещей, как люди, организации, места и местоположения. По сути, все, что можно рассматривать как конкретный объект, можно рассматривать как сущность. Вызов этих сущностей дает нам другой способ взаимодействия с текстом. С помощью NER вы можете разобрать такое предложение:

Для чего это можно использовать?

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

  • Классификация: возможно, вы хотите помочь автоматически создавать теги или категории для контента исключительно на основе текста без ручной маркировки.
  • Рекомендации по содержанию: продвигая классификацию еще на один шаг, вы можете рекомендовать контент, основанный на нем, говоря, что он относится к одним и тем же объектам.
  • Анализ комментариев: возможно, вы получили обратную связь и провели анализ настроений, чтобы увидеть, как идут дела. NER может помочь вам глубже разобраться, есть ли определенные именованные сущности, которые производят обратную связь.

Помимо этих общих идей, NER имеет потенциал для многих приложений, которые стремятся упростить текст.

NER с Spacy

Один из лучших пакетов для задач НЛП с Python - Spacy. Он имеет надежный набор функций, которые помогут вам от токенизации к моделированию всего за несколько строк кода. Мы сможем использовать Spacy как для тегирования части речи, так и для распознавания именованных сущностей. Для начала мы собираемся импортировать Spacy и загрузить предварительно обученную модель. Модель, которую мы используем, создана командой Spacy. Это многозадачная модель CNN, обученная на OntoNotes (большой корпус текста с ручными аннотациями).

import spacy
nlp = spacy.load("en_core_web_sm")

Затем мы берем оцениваемый текст и пропускаем его через модель. Для шуток я использую первые несколько предложений рецензии на фильм Midsommar. Давайте добавим его и посмотрим, как выглядит одно предложение, помеченное частями речи:

doc = nlp(
    """
    In case it wasn’t already clear, Midsommar confirms that American horror specialist Ari Aster is one of the slyer jokers to arrive in the movie business for a while.
    """
         )
for token in doc:
    print(token.text, token.pos_, token.tag_, token.dep_)

Результат:

In(ADP) case(NOUN)it(PRON) was(VERB) n’t(ADV) already(ADV) clear(ADJ) ,(PUNCT) Midsommar(PROPN) confirms(VERB) that(ADP)
American(ADJ) horror(NOUN) specialist(NOUN) Ari(PROPN) Aster(PROPN) is(VERB) one(NUM) of(ADP) the(DET) slyer(NOUN) jokers(NOUN) to(PART) arrive(VERB) in(ADP) the(DET) movie(NOUN) business(NOUN) for(ADP) a(DET) while(NOUN).(PUNCT)

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

for ent in doc.ents:
    print(ent.text, ent.label_)

Результат:

Midsommar GPE # GPE: Countries, cities, states
American NORP # NORP: Nationalities or religious or political groups.Ari Aster PERSON # PERSON: People, including fictional
one CARDINAL # CARDINAL: Numerals that do not fall under another type.

Отлично! Казалось, что он уловил важные для нас детали, но есть одна заметная проблема. Midsommar, название обсуждаемого фильма, было помечено как тип «GPE», что означает «Страны, города, штаты». Он контекстуально понимал это как сущность, но не как тот тип, на который мы надеялись. Мы можем вручную настроить его на WORK_OF_ART (Названия книг, вывески и т. Д.) В одной быстрой строке:

doc[9].ent_type_ = 'WORK_OF_ART'

Но давайте будем очень умными: может быть, мы хотим отметить слово или фразу, которые она просто не улавливает. Представьте себе рецензию на фильм The Thing, я сомневаюсь, что он всегда будет, если вообще когда-либо, найден. В текущем документе, допустим, мы хотим рассматривать «кинобизнес» как именованную сущность. Мы можем установить это вручную с помощью Span и, если захотим, даже создать для этого свой собственный тег объекта, который мы можем назвать «отраслью». Мы создаем Span, используя индекс слов, а затем добавляем Вот как это будет сделано:

from spacy.tokens import Span
md_ent = Span(doc, 27, 29, 'INDUSTRY')
doc.ents = list(doc.ents) + [md_ent]

Вот и все! Это только отправная точка, так что копайтесь и посмотрите, что NER может сделать с вашими данными.