Распознавание именованных сущностей НЛП с использованием NLTK и Spacy - PullRequest
2 голосов
/ 03 октября 2019

Я использовал NER для следующего предложения как на NLTK, так и на Spacy, и ниже приведены результаты:

"Zoni I want to find a pencil, a eraser and a sharpener"

Я запустил следующий код в Google Colab.

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag

ex = "Zoni I want to find a pencil, a eraser and a sharpener"

def preprocess(sent):
    sent = nltk.word_tokenize(sent)
    sent = nltk.pos_tag(sent)
    return sent

sent = preprocess(ex)
sent

#Output:
[('Zoni', 'NNP'),
 ('I', 'PRP'),
 ('want', 'VBP'),
 ('to', 'TO'),
 ('find', 'VB'),
 ('a', 'DT'),
 ('pencil', 'NN'),
 (',', ','),
 ('a', 'DT'),
 ('eraser', 'NN'),
 ('and', 'CC'),
 ('a', 'DT'),
 ('sharpener', 'NN')]

Нокогда я использовал spacy в том же тексте, он не дал мне никакого результата

import spacy
from spacy import displacy
from collections import Counter
import en_core_web_sm
nlp = en_core_web_sm.load()

text = "Zoni I want to find a pencil, a eraser and a sharpener"

doc = nlp(text)
doc.ents

#Output:
()

Это работает только для некоторых предложений.

import spacy
from spacy import displacy
from collections import Counter
import en_core_web_sm
nlp = en_core_web_sm.load()

# text = "Zoni I want to find a pencil, a eraser and a sharpener"

text = 'European authorities fined Google a record $5.1 billion on Wednesday for abusing its power in the mobile phone market and ordered the company to alter its practices'

doc = nlp(text)
doc.ents

#Output:
(European, Google, $5.1 billion, Wednesday)

Пожалуйста, дайте мне знать, если что-то естьнеправильно.

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

Пространственные модели являются статистическими. Таким образом, именованные объекты, распознаваемые этими моделями, зависят от наборов данных, на которых были обучены эти модели.

Согласно документации spacy , именованный объект является объектом * реального мира. ”, которому присвоено имя - например, человек, страна, продукт или название книги.

Например, имя Zoni не распространено, поэтому модельне распознает имя как именованный объект (лицо). Если я поменяю имя Зони на Уильям в вашем предложении Пространство узнаю Уильям как личность.

import spacy
nlp = spacy.load('en_core_web_lg')

doc = nlp('William I want to find a pencil, a eraser and a sharpener')

for entity in doc.ents:
  print(entity.label_, ' | ', entity.text)
  #output
  PERSON  |  William

Можно предположить, что Карандаш , Ластик и Точилка являются объектами, поэтому они могут быть классифицированы как продукты, потому что spacy документация заявляет, что «объекты» являются продуктами. Но это не похоже на случай с 3 объектами в вашем предложении.

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

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

doc = nlp('Zoni I want to find a pencil, a eraser and a sharpener')
if not doc.ents:
  print ('No named entities were recognized in the input text.')
else:
  for entity in doc.ents:
    print(entity.label_, ' | ', entity.text)
2 голосов
/ 03 октября 2019

Я не уверен, что понимаю сравнение, которое вы пытаетесь провести. В первом примере с NLTK вы смотрите на POS-теги в предложении. Однако во втором примере с spaCy вы смотрите на Именованные объекты . Это две разные вещи. Статистические модели всегда должны давать вам POS-тег для каждого токена (хотя иногда он может отличаться), но распознавание именованных сущностей (как объяснено в посте «Жизнь сложна») зависит от наборов данных, которыми эти модели были. тренировался на. Если модели «чувствуют, что» в предложении нет именованного объекта, вы получите пустой набор результатов. Но чтобы получить справедливое сравнение, вы должны также показать именованные объекты, найденные NLTK, и сравнить с этим.

Если вместо этого вы хотите сравнить POS-теги, с помощью spaCy вы можете запустить это:

for token in doc:
    print(token.text, token.pos_, token.tag_) 
...