Введение

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

Мы хотели бы пойти дальше предыдущих статей и поэкспериментировать более подробно.

Распознавание именованных объектов

Давайте теперь воспользуемся библиотекой Python для этого примера, так как это дает доступ к большему количеству функций, чем использование библиотеки R (по крайней мере, насколько я понял). Как обычно, нам нужно установить библиотеку spacy и загрузить соответствующие модели, которые мы хотим использовать (подробнее об этом в разделе https://spacy.io/usage/.

Давайте теперь проанализируем документ, используя spacy, и напечатаем выдержку из найденных именованных сущностей, которые соответствуют «PRODUCT»:

import spacy spacy.load('en') 
docCV=nlp(textCV) 
for ent in docCV.ents: 
# Print the entity text and its label 
  if ent.label_=='PRODUCT': 
    print(ent.text, ent.label_,) 
Agile PRODUCT 
Tier 1 PRODUCT

Результаты для маленькой английской модели не впечатляют, так что для средней модели все может быть иначе:

nlp = spacy.load('en_core_web_md')
docCV=nlp(textCV) 
for ent in docCV.ents: 
  # Print the entity text and its label if ent.label_=='PRODUCT':
    print(ent.text, ent.label_,)

На самом деле в том, что не было обнаружено ни одной сущности типа PRODUCT, это весьма удивительно. Это в значительной степени зависит от того, на каком текстовом корпусе обучалась модель. Если мы применим ту же модель к другому профилю, мы получим следующие результаты:

ПРОДУКТ C++
ПРОДУКТ C++
ПРОДУКТ Solaris
ПРОДУКТ C++

Spacy определил C++ и Solaris как продукты, но не Java или JavaScript. Итак, давайте добавим в модель собственные правила обнаружения, чтобы приблизиться к тому, к чему мы стремимся, т. е. к выявлению технических навыков в профиле людей:

patterns = [{"label": "PROG", "pattern": [{"lower": "java"}]}, {"label": "PROG", "pattern": [{"lower": "javascript"}]}] 
ruler = EntityRuler(nlp, patterns=patterns,overwrite_ents=True) nlp.add_pipe(ruler) 
docCV=nlp(textCV) 
for ents in docCV.ents: 
# Print the entity text and its label 
if ents.label_=='PROG': 
  print(ents.text, ents.label_,) 
Java PROG 
Java PROG 
Java PROG 
Java PROG 
Java PROG

Таким образом, мы смогли добавить в статистическую модель распознавание объектов на основе правил. Это позволяет быстро настраивать модели для адаптации к конкретным областям и потребностям.

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

SLQ ORG
7 лет ДАТА
Информатика ORG
Java GPE
JavaScript ORG
Boosting, Trees ORG
SLQ ORG
Redshift ORG
S3, Spark PRODUCT
DigitalOcean ORG
3-й ORDINAL
Google Analytics ORG
Adwords ORG
Crimson Hexagon ORG
Map/Reduce ORG
Hadoop ORG
Gurobi GPE
MySQL GPE
Business Objects ORG

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

Таким образом, можно сказать, что распознавание объектов зависит не только от используемой статистической модели, но и от структуры документа, над которым мы работаем. Это сложнее, чем предполагалось.

Сходства документов

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

python -m spacy download en_core_web_md

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

Давайте начнем с общего описания работы специалиста по данным и посмотрим, что произойдет.

docJob.similarity(docCV)
Out[98]: 0,9235262880617061

docJob.similarity(docCV2)
Out[99]: 0,9415320577235222

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

docCV.similarity(docDoc)
Out[106]: 0,8724268941129953

С небольшим удивлением сходство уменьшилось, хотя целевой документ также носит технический характер.

На этом пока все, в следующий раз давайте посмотрим, как мы можем еще лучше настроить анализ наших документов с помощью spacy.

Первоначально опубликовано на https://smartlake.ch 1 мая 2019 г.