В предыдущей статье о текстовой аналитике для начинающих с использованием Python, часть 1, мы рассмотрели некоторые интересные вещи, которые spaCy вообще может делать. Мы видели, что такое обработка естественного языка (NLP)? Затем мы увидели основные операции текстовой аналитики для очистки и анализа текстовых данных с помощью spaCy. В этой статье мы изучим другие важные темы НЛП: распознавание сущностей, анализ зависимостей и представление векторов слов с использованием spaCy. В этой серии у нас есть следующие статьи:

Текстовая аналитика для начинающих с использованием Python spaCy, часть 1

Текстовая аналитика для начинающих с использованием Python spaCy, часть 2

Классификация текста с помощью Python spaCy

Обнаружение объектов

Обнаружение сущностей, также называемое распознаванием сущностей, — это более продвинутая форма обработки языка, которая идентифицирует важные элементы, такие как места, люди, организации и языки, во входной текстовой строке. Это действительно полезно для быстрого извлечения информации из текста, поскольку вы можете быстро выбрать важные темы или определить ключевые разделы текста.

Давайте попробуем детектировать объекты, используя несколько абзацев из этой недавней статьи. Мы будем использовать .label, чтобы получить метку для каждой сущности, обнаруженной в тексте, а затем мы рассмотрим эти сущности в более наглядном формате, используя визуализатор displaCy spaCy.

#for visualization of Entity detection importing displacy from spacy:
from spacy import displacy
nytimes= nlp(u"""New York City on Tuesday declared a public health emergency and ordered mandatory measles vaccinations amid an outbreak, becoming the latest national flash point over refusals to inoculate against dangerous diseases.
At least 285 people have contracted measles in the city since September, mostly in Brooklyn’s Williamsburg neighborhood. The order covers four Zip codes there, Mayor Bill de Blasio (D) said Tuesday.
The mandate orders all unvaccinated people in the area, including a concentration of Orthodox Jews, to receive inoculations, including for children as young as 6 months old. Anyone who resists could be fined up to $1,000.""")
entities=[(i, i.label_, i.label) for i in nytimes.ents]
entities
[(New York City, 'GPE', 384),
 (Tuesday, 'DATE', 391),
 (At least 285, 'CARDINAL', 397),
 (September, 'DATE', 391),
 (Brooklyn, 'GPE', 384),
 (Williamsburg, 'GPE', 384),
 (four, 'CARDINAL', 397),
 (Bill de Blasio, 'PERSON', 380),
 (Tuesday, 'DATE', 391),
 (Orthodox Jews, 'NORP', 381),
 (6 months old, 'DATE', 391),
 (up to $1,000, 'MONEY', 394)]

Используя эту технику, мы можем идентифицировать различные объекты в тексте. Документация spaCy предоставляет полный список поддерживаемых типов сущностей, и из приведенного выше короткого примера видно, что он способен идентифицировать множество различных типов сущностей, включая определенные местоположения (GPE), слова, связанные с датой (DATE), важные номера (CARDINAL), конкретные лица (PERSON) и т. д.

Используя displaCy, мы также можем визуализировать наш вводимый текст, при этом каждый идентифицированный объект выделяется цветом и помечается. Мы будем использовать style = "ent", чтобы сообщить displaCy, что мы хотим визуализировать объекты здесь.

displacy.render(nytimes, style = "ent",jupyter = True)

Город Нью-Йорк GPE во вторник DATE объявил чрезвычайную ситуацию в области общественного здравоохранения и приказал провести обязательную вакцинацию против кори на фоне вспышки, что стало последней национальной горячей точкой из-за отказа сделать прививку от опасных заболеваний. По меньшей мере 285 CARDINAL человек заразились корью в городе с сентября DATE, в основном в бруклинском GPE Вильямсбурге GPE окрестности. Заказ распространяется на четыре CARDINAL почтовых индекса, сообщил мэр Билл де Блазио PERSON (D) во вторник DATE. Мандат предписывает всем непривитым людям в этом районе, включая группу ортодоксальных евреев NORP, сделать прививки, в том числе детям в возрасте от 6 месяцев ДАТА. Любой, кто сопротивляется, может быть оштрафован на сумму до 1000 долларов ДЕНЬГИ.

Анализ зависимостей

Анализ зависимостей — это метод обработки языка, который позволяет нам лучше определять значение предложения, анализируя его структуру, чтобы определить, как отдельные слова связаны друг с другом.

Рассмотрим, например, предложение «Билл бросает мяч». У нас есть два существительных (Билл и мяч) и один глагол (бросает). Но мы не можем просто смотреть на эти слова по отдельности, иначе мы можем в конечном итоге подумать, что мяч бросает Билл! Чтобы правильно понять предложение, нам нужно смотреть на порядок слов и структуру предложения, а не только на слова и их части речи.

Сделать это довольно сложно, но, к счастью, spaCy позаботится об этой работе за нас! Ниже приведем spaCy еще одно короткое предложение, взятое из заголовков новостей. Затем мы будем использовать другой spaCy с именем noun_chunks, который разбивает входные данные на существительные и слова, их описывающие, и перебирает каждый фрагмент исходного текста, определяя слово, его корень, идентификацию его зависимости и к какому фрагменту он принадлежит. .

docp = nlp (" In pursuit of a wall, President Trump ran into one.")
for chunk in docp.noun_chunks:
   print(chunk.text, chunk.root.text, chunk.root.dep_,
          chunk.root.head.text)
pursuit pursuit pobj In
a wall wall pobj of
President Trump Trump nsubj ran

За этим выводом может быть немного сложно следить, но, поскольку мы уже импортировали визуализатор displaCy, мы можем использовать его для просмотра диаграммы зависимостей с помощью style = "dep", которую намного легче понять:

displacy.render(docp, style="dep", jupyter= True)

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

Представление вектора слова

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

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

Каждое слово интерпретируется как уникальный и длинный массив чисел. Вы можете думать об этих числах как о чем-то вроде GPS-координат. GPS-координаты состоят из двух чисел (широты и долготы), и если бы мы увидели два набора координат GPS, которые были численно близки друг к другу (например, 43, -70 и 44, -70), мы бы знали, что эти два местоположения были относительно близко друг к другу. Векторы слов работают аналогичным образом, хотя каждому слову присваивается намного больше двух координат, поэтому человеку гораздо труднее уловить их на глаз.

Используя модель en_core_web_sm spaCy, давайте посмотрим на длину вектора для одного слова и на то, как этот вектор выглядит с использованием .vector и .shape.

import en_core_web_sm
nlp = en_core_web_sm.load()
mango = nlp(u'mango')
print(mango.vector.shape)
print(mango.vector)
(96,)
[ 1.0466383  -1.5323697  -0.72177905 -2.4700649  -0.2715162   1.1589639
  1.7113379  -0.31615403 -2.0978343   1.837553    1.4681302   2.728043
 -2.3457408  -5.17184    -4.6110015  -0.21236466 -0.3029521   4.220028
 -0.6813917   2.4016762  -1.9546705  -0.85086954  1.2456163   1.5107994
  0.4684736   3.1612053   0.15542296  2.0598564   3.780035    4.6110964
  0.6375268  -1.078107   -0.96647096 -1.3939928  -0.56914186  0.51434743
  2.3150034  -0.93199825 -2.7970662  -0.8540115  -3.4250052   4.2857723
  2.5058174  -2.2150877   0.7860181   3.496335   -0.62606215 -2.0213525
 -4.47421     1.6821622  -6.0789204   0.22800982 -0.36950028 -4.5340714
 -1.7978683  -2.080299    4.125556    3.1852438  -3.286446    1.0892276
  1.017115    1.2736416  -0.10613725  3.5102775   1.1902348   0.05483437
 -0.06298041  0.8280688   0.05514218  0.94817173 -0.49377063  1.1512338
 -0.81374085 -1.6104267   1.8233354  -2.278403   -2.1321895   0.3029334
 -1.4510616  -1.0584296  -3.5698352  -0.13046083 -0.2668339   1.7826645
  0.4639858  -0.8389523  -0.02689964  2.316218    5.8155413  -0.45935947
  4.368636    1.6603007  -3.1823301  -1.4959551  -0.5229269   1.3637555 ]

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

Ресурсы и следующие шаги

Поздравляем, вы добрались до конца этого урока!

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

Классификация текста с помощью Python spaCy

Эта статья первоначально опубликована на https://www.dataquest.io/blog/tutorial-text-classification-in-python-using-spacy/

Больше таких статей вы можете найти в моем блоге Machine Learning Geek.

Свяжитесь со мной в Linkedin: https://www.linkedin.com/in/avinash-navlani/