Сегодня давайте обсудим наиболее популярный вариант использования NLP, то есть NER - Named Entity Recognition. В этом посте мы рассмотрим практическое использование одного из самых современных алгоритмов Flair.

Что такое NER?

NER можно использовать для идентификации таких сущностей, как организации, местоположения, лица и другие сущности в данном тексте.

Каковы варианты использования NER?

Многие проблемы бизнеса или реального мира могут быть решены с помощью NER:

  1. Классификация будет очень простой, и мы сможем легко определить, что документ / текст связан с этой компанией, местоположением или человеком и т. Д.
  2. Быстрая идентификация скрытых идей на основе сущностей, присутствующих в большом количестве текстовых данных.
  3. Для поиска информации из текста очень важна идентификация сущности. С помощью NER информация может быть извлечена для правильного поискового запроса.

Наш алгоритм на сегодня:

Сегодня я предлагаю Flair Framework для нашей задачи NER. Это одна из самых современных библиотек в задачах НЛП. Он использует Pytorch. Преимущество Flair NER в том, что он работает в зависимости от контекста. Он разработан исследовательской группой Zalando. Приступим к результатам.

Установка чутья

Для начала нам нужно установить фреймворк pytorch. В зависимости от совместимости вашей системы выберите опцию на веб-сайте pytorch.org и выполните команду, как показано ниже.

Я запускаю командную строку Anaconda в режиме администратора, как показано ниже:

Как только это будет сделано с установкой, затем установите Flair с помощью следующей команды:

pip install flair

Практическое использование Flair NER

Давайте напишем базовый сценарий, чтобы увидеть результат Flair NER. Первые две строки кода импортируют модели чутья, как показано ниже. Впервые он загрузит модели NER.

#import commands for flair NER
from flair.data import Sentence
from flair.models import SequenceTagger

Затем загружаем загруженную модель NER следующим образом:

#Load NER Model
tagger = SequenceTagger.load('ner')

После этого давайте дадим образец текста. Затем мы передаем текст в синтаксис предложения. Это преобразует текст в токены.

#Sample text to run NER
text = 'Jackson is placed in Microsoft located in Redmond'
#passing text to sentence
sentence = Sentence(text)

Следующая очень важная строка для идентификации сущностей из предложения. Чтобы увидеть сущности, мы запускаем последние две строки кода.

# Run NER on sentence to identify Entities
tagger.predict(sentence)
# print the entities with below command
for entity in sentence.get_spans('ner'):
    print(entity)

Команда Above Print выдаст результат ниже. Как мы видим ниже, он помечен как Джексон как Человек (PER), Microsoft помечен как Организация (ORG), а Редмонд помечен как Местоположение (LOC).

PER-span [1]: «Джексон»
ORG-span [5]: «Microsoft»
LOC-span [8]: «Редмонд»

С помощью всего 8 строк простого кода мы можем получить Entities. Давайте посмотрим на предложение с тегами с тегами, указанными для того же предложения.

print(sentence.to_tagged_string())

Ниже приведен вывод из приведенного выше утверждения.

Джексон ‹S-PER› размещен в Microsoft ‹S-ORG›, расположенном в Редмонде ‹S-LOC›

Теперь давайте напишем еще одно предложение и посмотрим, что получится.

#Sample text
text1 = ‘Redmond is coming to New York city’
#passing text to sentence
sentence = Sentence(text1)
# Run NER on sentence to identify Entities
tagger.predict(sentence)
# print the entities with below command
for entity in sentence.get_spans(‘ner’):
    print(entity)

и результат будет таким, как показано ниже:

PER-span [1]: «Редмонд»
LOC-span [5,6]: «Нью-Йорк»

Немного сложно, верно! Теперь Флэр говорит, что Редмонд - это личность, в первом примере Редмонд был указан как Местоположение. Так что в обоих случаях Flair NER верен. Контекст играет здесь ключевую роль. Исходя из контекста, Flair NER дает результат, что очень важно для проектов, основанных на данных. Это также до некоторой степени решает проблему устранения неоднозначности слов. Пример: Одно слово - это человек или место? Компания или человек?

Модели чутье

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

Использование чутья в тексте статьи

До сих пор мы видели, как выносят одно предложение и предсказывают сущности. Теперь давайте пропустим один абзац и посмотрим на результат.

Ниже абзац, который я взял из Bloomberg здесь:

text2 = “During a heated deposition this past June, Elon Musk finally seemed to admit that his harshest critics were right. Since forcing through the controversial 2016 purchase of SolarCity Corp., the struggling solar sales-and-installation business he co-founded with his cousins, Tesla Inc.’s chief executive officer has faced almost-constant criticism: The move was called a catastrophe for Tesla, a $2 billion-plus bailout of a debt-saddled company of which Musk himself was chairman and the largest shareholder. Despite plummeting sales and substantial layoffs in the solar division under Tesla after the merger, Musk has fervently defended the SolarCity acquisition, once calling it “blindingly obvious” and a “no-brainer.””

Еще один шаг, который мы должны сделать перед передачей вышеуказанного текста в Flair NER, то есть разбить абзац на предложения. Для разделения предложений Flair NER имеет встроенную библиотеку segtok. Он будет установлен вместе с Flair NER. Теперь давайте напишем код для разделения абзаца.

#Import segtok library to split the paragraph into sentences
from segtok.segmenter import split_single
sentences = [Sentence(sent, use_tokenizer=True) for sent in split_single(text2)]

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

#predicting entities
tagger.predict(sentences)
# print the entities with below command
for sent in sentences:
    for entity in sent.get_spans('ner'):
        print(entity)

ниже - результат, который мы получили для вышеприведенного абзаца от Flair NER. И это выглядит довольно правильно.

PER-промежуток [9,10]: «Илон Маск»
ORG-промежуток [9,10]: «SolarCity Corp.»
ORG-промежуток [23,24]: «Tesla Inc. . »
ORG-промежуток [42]:« Тесла »
PER-промежуток [55]:« Маск »
ORG-промежуток [12]:« Тесла »
PER- span [17]: «Маск»
ORG-span [22]: «SolarCity»

Пример файла кода я поместил на github here.

Это мой первый пост в этом блоге. Пожалуйста, дайте мне знать, нравится ли вам пост и ваши мысли по этому поводу. Вы можете поделиться со мной своими комментариями / отзывами.

Использованная литература:

Pytorch - https://pytorch.org/

Ссылка на Github для Flair - https://github.com/zalandoresearch/flair

Модели Flair NER - https://github.com/zalandoresearch/flair/blob/master/resources/docs/TUTORIAL_2_TAGGING.md