Введение
В предыдущих трех статьях мы проиллюстрировали использование 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 г.